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

问题描述 投票:0回答:2

我想在 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
2个回答
11
投票

这是您的示例,经过一些清理以使其更易于阅读。

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

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

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

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


0
投票

当我添加数字并且总和超过10时,它会显示符号而不是数字

© www.soinside.com 2019 - 2024. All rights reserved.