1

试图让它工作的严重麻烦..刚刚开始 NASM 组装很抱歉,如果这是一个问题,但任何帮助都非常感谢谢谢!

试图让两个变量呈现相等,以便 cmp 之后的跳转起作用。这让我非常沮丧,因为直接值(如果 mov eax 和 ebx 为 "5" )它可以工作,所以它是地址问题吗?我不知道。

section .data

    str_equal   db      "Equal!", 0xA
    len_equal   equ     $ - str_equal

    str_number_a    db      "5"
    str_number_b    db      "5"

section .text

    global _start

_start:

    mov     eax,        [ str_number_a ]
    mov     ebx,        [ str_number_b ]

    cmp     eax,        ebx
    je      _Equal
    jmp     _Exit

ret


_Equal:

    mov     eax,        4                       ; syscall - write()
    mov     ebx,        1                       ; stdout
    mov     ecx,        str_equal
    mov     edx,        len_equal
    int     0x80                                ; Call dat Kernel

    jmp     _Exit

ret


_Exit:

    mov     eax,        1
    mov     ebx,        0
    int     0x80

ret
4

1 回答 1

1

问题是您在尝试将单个字节从字符串移动到寄存器时用 32 位数据填充 32 位寄存器:

mov    eax,    [ str_number_a ]
mov    ebx,    [ str_number_b ]

如果我们看一下内存,除了字符串的第一个字节之外可能还有任何内容:

xx xx xx 35 1F 4A 59 xx xx xx
         ^   ^^^^^^^
         '5' Garbage

eaxebx32 位寄存器一样,它们读入字符 '5' 和后面的垃圾。这是什么意思?由于两个字符串中字符 '5' 之外的垃圾内存很可能不同,因此 和 之间的比较eaxebx始终不相等。

这可以通过将 32 位/4 字节比较 ( cmp) 更改为 8 位/1 字节(或单个字符)比较来解决:

cmp     byte eax, ebx

这样,只会比较每个寄存器的第一个字节。

编辑:

或者,您可以使用 8 位寄存器来存储数据:

mov    al, [ str_number_a ]
mov    ah, [ str_number_b ]

cmp    al, ah
于 2015-09-25T04:14:03.867 回答