這是我現在的代碼,但它只能做1位數字。這是班級,我不知道如何使它做多個數字。我仍然是ASM編程的初學者,我想請教如何做多位數字。如何在ASM中使用多位數字進行數學運算
.model small
.stack 4096h
.data
msg1 db 'Choose an operation:$'
msg2 db 'a. Addition$'
msg3 db 'b. Subtraction$'
msg4 db 'c. Multiplication$'
msg5 db 'd. Division$'
msg6 db 'You choose Addition.$'
msg7 db 'You choose Subtraction.$'
msg8 db 'You choose Multiplication.$'
msg9 db 'You choose Division.$'
msg11 db 'First number:$'
msg12 db 'Second number:$'
msg13 db 'Operation:$'
msg14 db 'Answer:$'
msg15 db 'Enter two numbers then choose the operation.$'
op1 db ?
op2 db ?
res1 db ?
res2 db ?
.code
start:
mov ax,@data
mov ds,ax
_start:
mov ah, 09h
lea dx, msg15
int 21h
call newline
mov ah, 09h
lea dx, msg11
int 21h
mov ah, 01h
int 21h
sub al,30h
mov op1, al
call newline
mov ah, 09h
lea dx, msg12
int 21h
mov ah, 01h
int 21h
sub al,30h
mov op2, al
call newline
mov ah, 09h
lea dx, msg1
int 21h
call newline
mov ah, 09h
lea dx, msg2
int 21h
call newline
mov ah, 09h
lea dx, msg3
int 21h
call newline
mov ah, 09h
lea dx, msg4
int 21h
call newline
mov ah, 09h
lea dx, msg5
int 21h
call newline
mov ah, 09h
lea dx, msg13
int 21h
mov ah, 01h
nt 21h
cmp al, 'a'
je _add
cmp al, 'b'
je _sub
cmp al, 'c'
je _mul
cmp al, 'd'
je _div
_add:
call newline
lea dx, msg6
mov ah, 09h
int 21h
call newline
mov ax, 0
mov al, op1
add al, op2
cmp al,0ah
jge _twodig
mov res2,al
jmp _ans
_sub:
call newline
lea dx, msg7
mov ah, 09h
int 21h
call newline
mov ax, 0
mov al, op1
sub al, op2
mov res2,al
mov res1,ah
jmp _ans
_mul:
call newline
lea dx, msg8
mov ah, 09h
int 21h
call newline
mov ax,0
mov bx,0
mov al, op1
mov bl, op2
mul bx
mov res2,al
jmp _mans
_div:
call newline
lea dx, msg9
mov ah, 09h
int 21h
call newline
mov ax,0
mov bx,0
Mov dx,0
mov al, op1
mov bl, op2
div bx
mov res1, dl
mov res2, al
jmp _dans
_twodig:
sub al, 0ah
mov ah,01h
add ax, 3030h
mov bx, ax
lea dx, msg14
mov ah, 09h
int 21h
mov dl,bh
mov ah, 02h
int 21h
mov dl,bl
mov ah, 02h
int 21h
jmp _loop
_ans:
lea dx, msg14
mov ah, 09h
int 21h
mov al, res2
add al, 30h
mov dl,al
mov ah, 02h
int 21h
jmp _loop
_mans:
mov dx, 0
mov bl,0ah
div bx
mov ah,dl
add ax, 3030h
mov bx,ax
cmp bl,30h
je _ans
lea dx, msg14
mov ah, 09h
mov dl,bl
mov ah, 02h
int 21h
mov dl,bh
mov ah, 02h
int 21h
jmp _loop
_dans:
lea dx, msg14
mov ah, 09h
int 21h
mov al, res2
mov ah, res1
add ax, 3030h
mov bx, ax
mov dl,bl
mov ah, 02h
int 21h
mov dl,'r'
mov ah, 02h
int 21h
mov dl,bh
mov ah, 02h
int 21h
jmp _loop
_loop:
mov ah,4ch
int 21h
newline proc
mov dl, 0ah
mov ah, 02h
int 21h
mov dl, 0d
mov ah, 02h
int 21h
ret
newline endp
end start
我不明白你爲什麼作出這個如此複雜。從控制檯輸入讀取一個數字,將其存儲在一個寄存器中,從控制檯輸入中讀取另一個數字,將其存儲在第二個寄存器中,然後將這些寄存器的「ADD」(或「SUB」或「MUL」或「DIV」) 。這將爲您提供對8位,16位,32位或64位值的支持,具體取決於您使用的寄存器的大小。也許問題在於,你只能從控制檯輸入中每次只讀1個字符?考慮使用緩衝輸入或其他方式讓用戶表明他們已經完成了輸入。 –
@CodyGray改變代碼以使用[緩衝的輸入(http://spike.scu.edu.au/~barry/interrupts.html#ah0a)可能不是一個很大的挑戰。但看着他的代碼,他似乎沒有真正的「atoi」功能,只是在做'sub al,30h'。將緩衝的字符串「1234」轉換爲寄存器的步驟對於新手來說可能是不明顯的。 Horlic,是否有助於將「1234」看作4 +(3 * 10)+(2 * 100)+(1 * 1000)?是的,這將是一個痛苦的寫作,但我不相信你會找到任何工具,無論是ASM或DOS會爲你做到這一點。讓你真正體會到C的庫,呃? –