比较 NASM 程序集中的变量

Comparing variables in NASM Assembly

尝试让它工作时遇到严重问题.. 刚开始 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

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

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

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

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

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

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

cmp     byte eax, ebx

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

编辑:

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

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

cmp    al, ah