比较NASM程序集中的变量

时间:2015-09-25 03:34:41

标签: assembly nasm cmp

试图让这个工作变得严重麻烦..刚刚开始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

1 个答案:

答案 0 :(得分: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

由于eaxebx是32位寄存器,因此它们同时读取字符' 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