NASM:添加存储在内存中的两个数字

时间:2014-03-28 16:56:23

标签: assembly integer sum ascii nasm

所以,我有一个更复杂的问题需要解决,但目前我无法添加两个数字。我知道'add'命令。当您只是将一个整数添加到寄存器指定的值时,它很有用。当从存储器中添加两个数字时,它们最初是字符串,这需要在之前转换为整数(这是我的猜测)。有什么帮助吗?

SECTION .data
    msg1    db  'Enter 2 numbers:', 0Ah
    msg2    db  'You entered:', 0Ah
    msg3    db  'Sum: '

SECTION .bss
one:    resb    4
two:    resb    4
sum:    resb    4


SECTION .text
global _start

_start:

mov eax, 4
mov ebx, 1
mov ecx, msg1
mov edx, 32
int 80h

mov eax, 3
mov ebx, 0
mov ecx, one
mov edx, 4
int 80h

mov eax, 3  
mov ebx, 0
mov ecx, two
mov edx, 4
int 80h

mov eax, 4
mov ebx, 1
mov ecx, msg2
mov edx, 39
int 80h

mov eax, 4
mov ebx, 1
mov ecx, one
mov edx, 4
int 80h

mov eax, 4
mov ebx, 1
mov ecx, two
mov edx, 4
int 80h

mov eax, 4
mov ebx, 1
mov ecx, sum
mov edx, 4
int 80h

mov eax, 1
mov ebx, 0
int 80h

1 个答案:

答案 0 :(得分:1)

根据我对您的问题的理解,您正在阅读两个代表数字的字符串,并且您想要添加这些数字。

你是对的说,最初,你没有数字,而是字符串。如果要添加字符串表示的数字,首先应该找到一种将字符串转换为您使用的常用数字表示的方法。

有几种可能性。 您可以使用库函数,例如strtol(您应该喜欢该库)。您应该以字符串作为参数调用此函数,它将为您完成工作。您将在eax寄存器中获得结果。

如果您想获得更大的教育价值,您可能想要自己计算数字。这并不难,我真的建议在一生中至少做一次。

首先是基本问题。您可能认为您收到的数字是基数10.您还需要将每个ascii数字转换为其值。在这种情况下,您可以只减去0x30,或者' 0'。

如果您获得的数字是a_0,a_1,a_2,a_3(例如,减去0x30之后),则必须将其计算为1 * a_0 + 10 * a_1 + 100 * a_2 + 1000 * a_3。创建一个这样做的循环。得到的结果是实际数字。

但请注意,当您想要将数字打印回控制台时,您可能需要进行相反的基本翻译。 对于另一种情况,您应该反复划分并使用模10来获取基数为10.最后,您应该将0x30添加到所有基数为10的数字,并打印这些字符。

祝你好运:)