src 或 destination 中两个值的汇编语言含义
Posted
技术标签:
【中文标题】src 或 destination 中两个值的汇编语言含义【英文标题】:Assembly language meaning of two values in src or destination 【发布时间】:2019-10-04 23:14:25 【问题描述】:比如有什么区别
cmpl $0x7, 0x8(%rsp)
和
cmpl $0x7, (%rsp)
还有cmp
和cmpl
有什么区别?
【问题讨论】:
cmpl $0x7, (%rsp)
与cmpl $0x7, 0x0(%rsp)
相同
(%rsp)之前的0x8呢?
这是添加到rsp
值的偏移量。请参阅有关有效地址语法的文档。至于l
后缀,如果可以从操作数中推断出操作大小,则无需输入。在这种情况下,您确实需要它,因为两个操作数都没有固有大小。
请阅读 GNU 汇编器手册。它很好地解释了这一切。
【参考方案1】:
宽度后缀
Intel将指令助记符描述为CMP
(在Intel 64 and IA-32 Architectures software Developer's Manual中),但是指令的形式有很多种,比如比较8-、16、 32 位或 64 位数字,将立即数与内存中的值进行比较,等等。
一些汇编器使用后缀来区分操作数的宽度,使用:
b
为字节,
w
for word(英特尔在这些架构中使用两个字节),
l
用于长字(四个字节),以及
q
用于四字(四个字,八个字节)。
如果其中一个操作数是寄存器,则汇编器可以从中计算出(至少在理论上;某些汇编器可能不具备此功能)它的宽度。
例如,cmp $0x7, %rsp
将是 64 位比较,因为 %rsp
命名为 64 位寄存器。 (%esp
是 32 位寄存器,%sp
是 16 位寄存器。)
操作数形式
cmpl $0x7, (%rsp)
表示立即值0x7
与内存中%rsp
寄存器中包含的地址的数据进行32 位比较。
没有l
后缀,这条指令的宽度是未知的。 0x7
是一个立即数。与 C 不同,它没有默认类型。
同样,(%rsp)
是内存中没有关联类型的位置。所以需要l
。 (注意这里的区别:cmp $0x7, %rbp
会将 7 与 %rbp
中的值进行比较,而 cmp $0x7, (%rbp)
会将 7 与内存中地址%rbp
中的值进行比较。)
8(%rsp)
是(%rsp)
加8得到的地址。
更完整的形式是offset(base, index, scale),表示中的地址em>base(这是一个寄存器)加上 index(另一个寄存器)乘以 scale(常数 1、2、4 或 8)加上 偏移量。
这种形式用于索引数组:假设一个数组从地址%rax
开始并且有4 个字节宽的元素,并且您想要索引在%rbx
中的元素。然后你用(%rax, %rbx, 4)
寻址这个元素。可以添加额外的偏移量来引用数组内结构中的成员或调整数组相对于%rax
的基地址。
【讨论】:
@ecm:修正了你的编辑。cmpL
指定 32 位操作数大小,因此是 64 位寄存器上的汇编时错误。 cmp $7, %rsp
是 64 位比较,让寄存器名称像正常人一样暗示操作数大小。【参考方案2】:
AT&T 语法中 x86 上的内存操作数一般是 "offset(base, index, scale) " 其中 offset 是(常量)偏移量,base 是(基)寄存器,index 是(索引)寄存器,scale 是常数 1、2、4 或 8。但是,这些字段中的大部分可以省略以获得默认值。没有 offset 表示偏移量为 0。没有 base 表示没有基本寄存器。没有 index 和 scale 表示没有索引寄存器。
在您的具体示例中,(%rsp)
表示 %rsp
作为基址寄存器,没有偏移量和索引。 0x8(%rsp)
表示%rsp
作为基址寄存器,0x8 (8) 作为偏移量。
【讨论】:
【参考方案3】:我相信您的问题的答案可以在另一个 SO 问题中找到:The difference between cmpl and cmp
【讨论】:
那么明智的做法是作为副本关闭,确定吗?但是我不清楚其他帖子如何回答偏移问题。 @paxdiablo:this 问题的问题在于它是关于 AT&T 语法的 2 个不相关的问题。所以它太宽泛了,或者应该作为2个不同问题的副本关闭,这是其中之一。但同意这应该是一个评论或只是一个近距离投票,在这种状态下绝对不是一个答案。 (有时,对于两个或多个 interwoven 事物重复的问题,发布带有指向其他 SO 答案的链接的答案可能是有意义的。但这只是“我也想知道另一件事,也”。)以上是关于src 或 destination 中两个值的汇编语言含义的主要内容,如果未能解决你的问题,请参考以下文章