【问题标题】:x86 instruction meaning [duplicate]x86指令含义[重复]
【发布时间】:2012-09-08 01:50:56
【问题描述】:

我现在正在 gdb 上运行一些代码,但我不知道这两条指令实际上是做什么的。如果有人可以帮助我,我将不胜感激。

add  -0x2c(%ebp, %ebx, 4), %eax
cmp  %eax, -0x28(%ebp, %ebx, 4)

【问题讨论】:

  • 首先,我会关闭粗俗的 AT&T 语法:set disassembly-flavor intel
  • 另请参阅AT&T syntax tag wiki,了解有关语法的更多详细信息,以及指向更多文档的链接。

标签: assembly x86 att addressing-mode


【解决方案1】:

当您使用 Intel 语法而不是 AT&T 语法编写 x86 程序集时,它通常更容易理解。

在 Intel 语法中是:

add eax,[ebp+4*ebx-0x2C]
cmp [ebp+4*ebx-0x28],eax

第一条指令(add)将存储在内存地址[ebp+4*ebx-0x2C]中的字的值与eax的值相加,并将和存储在eax中。

第二条指令(cmp)比较eax[ebp+4*ebx-0x28],方法是从内存地址[ebp+4*ebx-0x28]中存储的字的值中减去eax的值,并设置标志(OFSF, ZF, AF, PF, CF) 相应地但不会将结果保存在任何地方。 cmpsub 完全相同,唯一的区别是sub 中保存了结果,cmp 中没有。

比较类型通常以条件跳转的形式创建。在 x86 汇编中有很多条件跳转,它们是否分支取决于标志的值。

【讨论】:

  • 对不起 >.
  • Intel and AT&T syntaxes cmp 之后的条件跳转如果条件满足则跳转到代码中的其他位置。如果不是,则继续执行下一条指令(无跳转)。还有其他可能的方法(以标志作为键的哈希表),但条件跳转解决了所有情况。请注意,在 Intel 和 AT&T 语法中,操作数的顺序是相反的,在 Intel 中是 dest,src,而在 AT&T 中是 src,dest。这也会影响cmp。见Intel x86 jump quick ref.
【解决方案2】:

这是 AT&T 汇编语法。这些寻址模式看起来有点奇怪,但在伪代码中,它们的意思是:

eax = *(ebp + ebx*4 - 0x2c)

compare eax to *(ebp + ebx*4 - 0x28)

这是complete explanation的链接。

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多