【问题标题】:add two digit numbers in NASM(Linux)在 NASM(Linux) 中添加两位数字
【发布时间】:2014-10-05 12:05:56
【问题描述】:

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

【问题讨论】:

    标签: linux assembly nasm


    【解决方案1】:

    这是您的示例,稍作清理以使其更易于阅读。

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

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

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

    如果这对您有任何帮助,请告诉我们。组装是很棒的东西。正如您亲身体验的那样,最初的思维调整对大脑来说可能很奇怪,不是吗!

    【讨论】:

      猜你喜欢
      • 2013-07-14
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多