我想在 NASM(Linux) 中添加两位数。要添加两个简单的数字,我使用以下代码:
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov eax,'3'
sub eax, '0'
mov ebx, '4'
sub ebx, '0'
add eax, ebx
add eax, '0'
mov [sum], eax
mov ecx,msg
mov edx, len
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov ecx,sum
mov edx, 1
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db "The sum is:", 0xA,0xD
len equ $ - msg
segment .bss
sum resb 1
代码的结果是7。但是当我在寄存器eax中携带数字17时,结果不正确。在这种情况下5.请告诉我问题是什么?谢谢!
这是您的示例,经过一些清理以使其更易于阅读。
建议:这种一致性会大大提高你的公众形象。
但是嘿;很好的评论,我可以阅读你的代码并理解它(这就是我决定回答你的原因)
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov eax, '3'
sub eax, '0'
mov ebx, '4'
sub ebx, '0'
add eax, ebx
add eax, '0'
mov [sum], eax
mov ecx, msg
mov edx, len
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov ecx, sum
mov edx, 1
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db "The sum is:", 0xA,0xD
len equ $ - msg
segment .bss
sum resb 1
现在好了,至于你的评论,“...但是当我在寄存器 eax 中携带数字 17 时,结果不正确。”
我能想象!
问题,当你“...在寄存器eax中携带数字17...”时,你是这样做的吗?...
Mov Eax,"17"
如果是这样,请放慢速度,通过调试一次一步地查看您的代码。
我相信你会看到的是你实际上正在这样做......
Mov Eax, 3137h
虽然可能是
Mov Eax, 3731h
有趣的概念。我从来没有做过这样的事。无论如何。
更重要的是,如果您使用这个地方存储相同的号码......
sum resb 1
你只有一个字节。
据我所知,您的示例代码仅限于单位数字。
那么,既然你的标签
sum
只保留了一个字节; 8 位,您可以看到问题,因为您在那里存储 32 位。 (好吧,你正在尝试这样做;但它不会起作用。)不知道当你这样做时会发生什么。您可能想重新考虑该结构。
至于为什么17会变成5,这里没有线索。
如果这些对您有帮助,请告诉我们。组装是很棒的东西。正如您亲身经历的那样,最初的思维调整对于大脑来说可能会很奇怪,不是吗!
当我添加数字并且总和超过10时,它会显示符号而不是数字