带括号和地址的 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,那么这里的有效地址为0x80498d8
。 eax
中的值与该地址的值进行比较。
@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的主要内容,如果未能解决你的问题,请参考以下文章
PowerShell 中带括号的环境变量名称,如 %ProgramFiles(x86)%?
如何在WPS中将带括号数字[1][2]...[N]设置为自动编号模式?