x86算术(add / sub / mul / div)多个数字

时间:2015-10-07 17:28:02

标签: assembly x86 addition subtraction

所以我有这个代码(x86汇编语言)来解决基本的算术方程,但我的问题是我只能输入1位数字。此外,答案只能在1-9之内。我想要一个能够接受两位或更多位数的代码。以下是添加的工作示例代码。

jmp start
msg1 db 0ah,0dh, "Enter first number: $"
msg2 db 0ah,0dh, "Enter second number: $"
msg3 db 0ah,0dh, "Sum: $"
ans db ?, " $"
num1 db ?
num2 db ?

start:
mov ah, 0
mov al, 3
int 10h
mov ah, 06
mov al,0
int 10h

mov ah, 09h
lea dx, msg1
int 21h

mov ah, 01h
int 21h
sub al, 30h
mov num1, al

mov ah, 09h
lea dx, msg2
int 21h

mov ah, 01h
int 21h
sub al, 30h
mov num2, al

mov al, num1
add al,num2
add al, 30h
mov ans, al

mov ah, 09h
lea dx, msg3
int 21h

mov ah, 09h
lea dx, ans
int 21h

int 20h

1 个答案:

答案 0 :(得分:1)

将字符串转换为整数,进行算术运算,然后将整数转换回字符串(一次打印一个数字,或者打印到然后打印的缓冲区。)

这些都不是特定于x86 asm或您用于字符串/字符输入/输出的API(在本例中为DOS int 21h系统调用)。这正是你在C中的表现。我实际上建议使用C标准库进行转换,除非你想自己编写strtol和sprintf。

或者您可以从头到尾保持数据以字符串形式存在,并进行BCD add-carry和sub-borrow。每个十进制数字存储在一个单独的字节中。这在ASM中比在C中更容易,因为C不会暴露进位标志。这不是一个好的编程技术,会导致代码变慢。

如果要进行任意精度算术,请使用32b或64b二进制整数的块,而不是单个十进制数。或者只是使用gmp,除非你想重新发明轮子作为练习。