【问题标题】:How to Add and Subract 3 digit numbers in Assembly. Im using EMU8086如何在汇编中添加和减去 3 位数字。我正在使用 EMU8086
【发布时间】:2015-07-29 15:48:42
【问题描述】:

第一次在这里发帖,希望能得到答案。

我有这个代码,它可以加/减 2 位数字并得出 3 位数字的答案,问题是,我不知道如何将其转换为 4 位数字答案的 3 位数字输入。帮助

My Code: 


.model small      
.stack 100h
.data
a         db  13, 'Please Enter first number (2 Digit): $'
b         db  10,13, 'Please Enter second number (2 Digit): $'
c         db  0AH, 10,13, 'sum is:  $'
d         db  10,13, 'difference is: $'
n1         db  0
n2         db  0
d1         db  0
d2         db  0
ans        db  0
nega       db  '-$' 


.code
main proc

mov ax, @data
mov ds, ax

1st:
mov dx, offset a  
mov ah, 9
int 21h

mov ah, 1      
int 21h

cmp al, '0'      
jb 1st
cmp al, '9'
ja 1st

sub al, 30h      
mov d1, al
mov ah, 1      
int 21h

cmp al,'0'      
jb 1st
cmp al,'9'
ja 1st

sub al, 30H      
mov d2, al
mov al, d1     
mov bl, 10
mul bl
mov n1, al     
mov al, d2
add n1, al

2nd:
mov dx, offset b  
mov ah, 9
int 21h

mov ah, 1      
int 21h

cmp al, '0'     
jb 2nd
cmp al, '9'
ja 2nd
sub al, 30H     
mov d1, al
mov ah, 1      
int 21h

cmp al, '0'   
jb 2nd
cmp al, '9'
ja 2nd
sub al, 30H     
mov d2, al
mov al, d1
mov bl, 10
mul bl
mov n2, al
mov al, d2
add n2, al


Addition:
mov bl, n1
add bl, n2

call change
mov dx, offset c
mov ah, 9
int 21h
mov dl, bl
mov ah, 2
int 21h
mov dl, bh 
mov ah, 2
int 21h

mov dl, ans
mov ah, 2
int 21h

Subtraction:
mov bl, n1
cmp bl, n2
jl sign
sub bl, n2

call change
mov dx, OFFSET d
mov ah, 09H
int 21h
mov dl, bl
mov ah, 02h
int 21h

mov dl, bh
mov ah, 02h
int 21h

mov dl, ans
mov ah, 02h
int 21h

mov ah, 4ch
int 21h

sign:
mov bl, n2
sub bl, n1

call change
mov dx, offset d
mov ah, 09H
int 21h

mov dx, offset nega  
mov ah,09H
int 21h

mov dl, bl
mov ah, 02h
int 21h

mov dl, bh
mov ah, 02h
int 21h

mov dl, ans
mov ah, 02h
int 21h

mov ah, 4Ch      
int 21h

main endp

change proc
mov ah, 0
mov al, bl
mov bl, 10
div bl
mov bl, al
mov bh, ah
add bh, 30h     
mov ans, bh
mov ah, 0
mov al, bl
mov bl, 10
div bl
mov bl, al
mov bh, ah
add bh, 30h      
add bl, 30h    
ret

change endp

end

谢谢! >////

【问题讨论】:

    标签: assembly emulation


    【解决方案1】:

    字节只能保存带符号的 -127 到 + 127。使用单词进行计算。

    【讨论】:

    • 有符号字节范围从 -128 到 +127
    【解决方案2】:

    首先完成你想要改变这些数据定义。

    n1    dw 0
    n2    dw 0
    d1    db 0
    d2    db 0
    d3    db 0
    

    要输入一个 3 位数字(扩展您的逻辑),请使用:

    1st:
    mov dx, offset a
    mov ah, 9
    int 21h
    
    mov ah, 1    
    int 21h
    cmp al, '0'      
    jb 1st
    cmp al, '9'
    ja 1st
    sub al, 30h
    mov d1, al
    
    mov ah, 1     
    int 21h
    cmp al,'0'     
    jb 1st
    cmp al,'9'
    ja 1st
    sub al, 30h
    mov d2, al
    
    mov ah, 1   
    int 21h
    cmp al,'0'     
    jb 1st
    cmp al,'9'
    ja 1st
    sub al, 30h
    mov d3, al
    
    mov al, 100
    mul d1
    mov n1, ax    n1 is now defined as a word!
    mov al, 10
    mul d2
    add n1, ax
    mov al, d3
    cbw
    add n1, ax
    

    转换例程change需要处理4位数字:

    mov ax, bx    The addition or subtraction result is a word!
    mov bl, 10
    div bl
    mov ch, ah
    mov ah, 0
    div bl
    mov cl, ah
    cbw
    div bl
    mov bx, ax
    add bx, 3030h Turns 2 digits into characters
    add cx, 3030h idem
    ret
    

    现在您可以按正确的顺序打印这些结果了。

    mov dx, offset c
    mov ah, 9
    int 21h
    mov dl, bl
    mov ah, 2
    int 21h
    mov dl, bh
    mov ah, 2
    int 21h
    mov dl, cl
    mov ah, 2
    int 21h
    mov dl, ch
    mov ah, 2
    int 21h
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 2013-07-08
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多