在 NASM(Linux) 中添加两位数

Qwe*_*rty 4 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
Run Code Online (Sandbox Code Playgroud)

代码的结果是7.但是当我在寄存器eax中携带数字17时,结果不正确。在这种情况下 5.请告诉我是什么问题?谢谢!

Use*_*r.1 6

这是您的示例,其中进行了一些清理以帮助使其更易于阅读。

建议:这种一致性会大大提升你的公众形象。

但是,嘿;很好的评论,我可以阅读您的代码并理解它(这就是我决定回答您的原因)

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
Run Code Online (Sandbox Code Playgroud)

好的,至于你的评论,“......但是当我在寄存器 eax 中携带数字 17 时,例如结果是不正确的。

我能想象 !

问题,当你“......在寄存器 eax 中携带数字 17 ......”时,你是这样做的吗?......

    Mov     Eax,"17"
Run Code Online (Sandbox Code Playgroud)

如果是这样,请放慢速度并通过调试一次一步地查看您的代码。

我相信你会看到的是你实际上正在这样做......

    Mov     Eax, 3137h
Run Code Online (Sandbox Code Playgroud)

虽然它可能是

    Mov     Eax, 3731h
Run Code Online (Sandbox Code Playgroud)

有趣的概念。我从来没有做过那样的事情。任何。

更重要的是,如果你使用这个地方来存储相同的数字......

    sum resb 1
Run Code Online (Sandbox Code Playgroud)

你只有一个字节。

我能说的最好,您的示例代码仅限于个位数。

现在,由于您的标签sum只保留了一个字节;8 位,您可以看到问题,因为您在那里存储 32 位。(好吧,您正在尝试;它行不通。)不知道这样做时会发生什么。您可能想重新考虑该结构。

至于为什么17变成5,这里没有线索。

如果其中任何一项对您有帮助,请告诉我们。组装是个好东西。正如您亲身经历的那样,最初的思维调整对大脑来说可能很奇怪,不是吗!