【问题标题】:Comparing variables in NASM Assembly比较 NASM 装配中的变量
【发布时间】:2015-09-25 03:34:40
【问题描述】:

试图让它正常工作时遇到了严重的麻烦.. 刚开始 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

【问题讨论】:

  • 这与您的问题没有直接关系,但您应该使用jmp 指令而不是call 在线call _Exitcall 只是毫无意义地添加到调用堆栈中
  • 我最初是这样做的,但由于未知原因无法正常工作,并且通话正常,所以我把它留在那里..
  • 您使用的是 32 位还是 64 位系统?每个调用向量都不同

标签: assembly nasm cmp


【解决方案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

【讨论】:

  • 这很有意义!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 2014-01-27
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
相关资源
最近更新 更多