所以,我有一个更复杂的问题要解决,但目前我无法添加两个数字。我知道"添加"命令。当您只是将整数添加到寄存器分配的值时,它工作得很好。当涉及到从内存中添加两个数字时,它们最初是字符串,这需要转换为整数(这是我的猜测)。任何帮助吗?
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
根据我对你的问题的理解,你正在读取两个表示数字的字符串,并且你想将这些数字相加。
你说的对,一开始,你没有数字,只有字符串。如果想要添加字符串所表示的数字,首先应该找到一种方法,将字符串转换为常用的数字表示形式。
有几种可能性。您可以使用库函数,例如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为基数的数字中,并打印这些字符。
祝你好运