src或目标中两个值的汇编语言含义

问题描述 投票:-1回答:3

例如,两者之间有什么区别

cmpl $0x7, 0x8(%rsp)

cmpl $0x7, (%rsp)

[cmpcmpl之间还有什么区别?

assembly x86-64 att addressing-mode
3个回答
2
投票

宽度后缀

Intel将指令助记符描述为CMP(在Intel 64和IA-32体系结构软件开发人员手册中),但是指令的形式很多,例如比较8、16、32-或64位数字,将立即值与内存中的值进行比较,等等。

某些汇编程序使用后缀来区分操作数宽度,使用:

  • b为字节,
  • w一词(在这些体系结构中,英特尔使用两个字节),
  • 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的地址。

更完整的形式是offsetbaseindexscale),它表示base(是寄存器)中的地址加上 index(另一个寄存器)乘以scale(常数1、2、4或8)加上offset

此形式用于对数组建立索引:假设数组起始于地址%rax,并且元素的宽度为4个字节,并且您希望元素的索引为%rbx。然后用(%rax, %rbx, 4)为该元素添加地址。可以添加额外的偏移量以引用数组内结构内的成员,或相对于%rax调整数组的基址。


2
投票

AT&T语法中x86上的内存操作数通常为“ offsetbaseindexscale)”,其中offset是一个(恒定)偏移量,base是一个(基本)寄存器,index是一个(索引)寄存器,而scale是常数1、2、4或8。但是,这些字段中的大多数都可以是省略以获得默认值。 No offset表示偏移量为0。No base表示没有基本调节器。没有indexscale表示没有索引寄存器。

在您的特定示例中,(%rsp)表示%rsp作为基址寄存器,没有偏移且没有索引。 0x8(%rsp)表示%rsp作为基址寄存器,0x8(8)作为偏移量。


-1
投票

我相信您的问题的答案可以在另一个SO问题中找到:The difference between cmpl and cmp

© www.soinside.com 2019 - 2024. All rights reserved.