在NASM中添加两位数字(Linux)

时间:2014-10-05 12:05:56

标签: linux assembly nasm

我想在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.告诉我,请问有什么问题?谢谢!

1 个答案:

答案 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,这里没有任何线索。

如果有任何问题可以帮助我们。装配很棒。正如您个人所经历的那样,最初的思维调整对于大脑来说可能是奇怪的,可能就是这样!