【发布时间】:2018-04-22 09:08:13
【问题描述】:
我正在尝试解码 intel IA32 x86 cmp 命令的语法。
有问题的命令是
cmp 0x804a38(,%ebx,4), %eax
我对发生的事情有一个粗略的估计 - 然后从eax 中减去(ebx *4 的内容)+0x0804a38,然后设置条件代码。
但是,我知道我错了,因为之后的跳转命令没有执行 - 它的 je
我在这里做错了什么?是因为 cmp 缺少参数吗?
【问题讨论】:
-
欢迎来到 SO。请查看此处了解如何改进您的问题(格式化、校对、提供代码等):stackoverflow.com/help/how-to-ask
-
你要和 eax 比较的是 (0x804a38 + ebx * 4) 的内容,对吧?你的说法是模棱两可的。
-
从你的问题的措辞听起来你完全错过了这样一个事实,即第一个参数是内存引用,即
0x80...+ebx*4被计算为内存地址,然后从中加载 4 字节值内存地址,并与eax比较。在 Intel 语法中,指令看起来像这样:cmp eax,[ebx*4+0x804a38](在 Intel 语法中,内存引用在方括号中,而不是普通括号中,并且语法很宽松,即[0x804a38+ebx*4] == [ebx*4+0x804a38],大多数汇编程序甚至会为您计算简单的表达式,比如[ebx*4+label+15]。
标签: assembly x86 att addressing-mode