我想在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.告诉我,请问有什么问题?谢谢!
答案 0 :(得分:4)
这是您的例子,稍加清理,以便于阅读。
建议:这种一致性将极大地改善您的公众形象。
但是,嘿;很好的评论,我可以阅读你的代码并理解它(这就是我决定回答你的原因)
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,这里没有任何线索。
如果有任何问题可以帮助我们。装配很棒。正如您个人所经历的那样,最初的思维调整对于大脑来说可能是奇怪的,可能就是这样!