带括号和地址的 x86 中的 CMP

Posted

技术标签:

【中文标题】带括号和地址的 x86 中的 CMP【英文标题】:CMP in x86 with parentheses and address 【发布时间】:2014-10-09 23:17:37 【问题描述】:

我在 x86 汇编语言中有以下行,我不知道它是做什么的......

cmp %eax,0x80498d4(,%ebx,4)

我知道它在比较语句的两半,但我不知道地址在其中的作用以及括号的作用。一些澄清将不胜感激!

【问题讨论】:

What does a comma in a parenthesis mean in the AT&T syntax for x86 assembly?的可能重复 【参考方案1】:

在 AT&T 语法中,这种形式表示

OFFSET(BASE REGISTER, INDEX REGISTER, INDEX SCALE)

所以表示的地址是BASE REGISTER(如果存在)+ INDEX * SCALE(如果存在)+ OFFSET的值,所以

EBX*4 + 0x80498d4 在你的情况下。

【讨论】:

Ebx 在这种情况下是 1 而另一个地址是 -1 所以在这种情况下它应该是 3 但不幸的是它不起作用。 the other address 是什么意思?如果ebx为1,那么这里的有效地址为0x80498d8eax 中的值与该地址的值进行比较。 @Konnor:“它不起作用”到底是什么意思?准确地说,即您是否收到错误消息,如果是,它到底是什么,或者什么也没发生,还是什么?如果什么都没有发生,您究竟希望发生什么?我假设有更多的汇编代码。多贴一点(确切地说,即复制和粘贴)。 抱歉没有更清楚,这是一个二进制炸弹程序,所以这是基本上确定炸弹是否引爆的行,我已经追踪到。所以用户输入进入 %eax,我需要这个比较命令来设置零标志。所以我很困惑这一切是如何工作的,因为 0x80498d4 的值是 0xffffffff,所以 2 的补码是 -1,所以我只需要找出这个语句是如何真正起作用的,这样我就可以化解炸弹了。我希望这能让我更清楚地了解我想要实现的目标。 实际上,@500-InternalServerError 我刚刚注意到您的评论并且它有效!谢谢大家!【参考方案2】:

那是 AT&T 语法:

cmp %eax,0x80498d4(,%ebx,4)

Intel 语法中的等价物是:

cmp [080498D4H + EBX*4],EAX

表示它将地址[0x80498D4 + 4*EBX]处的DWORD内容与EAX寄存器的内容进行比较,并设置处理器标志好像这两个值彼此相减。之后,您可以使用这些标志来执行条件跳转等操作。

【讨论】:

以上是关于带括号和地址的 x86 中的 CMP的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 中怎么不带括号的调用函数

PowerShell 中带括号的环境变量名称,如 %ProgramFiles(x86)%?

如何在WPS中将带括号数字[1][2]...[N]设置为自动编号模式?

Python和MATLAB的小括号( )、中括号[ ]和大括号

python 类带括号和不带括号的区别

带方括号的链表