Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly src或destination中两个值的汇编语言含义_Assembly_X86 64_Att_Addressing Mode - Fatal编程技术网

Assembly src或destination中两个值的汇编语言含义

Assembly src或destination中两个值的汇编语言含义,assembly,x86-64,att,addressing-mode,Assembly,X86 64,Att,Addressing Mode,例如,它们之间的区别是什么 cmpl $0x7, 0x8(%rsp) 及 还有cmp和cmpl之间的区别是什么?我相信你的问题的答案可以在另一个SO问题中找到:AT&T语法中x86上的内存操作数通常是“偏移量(基、索引、刻度)”,其中偏移量是(常量)偏移量,基是(基)寄存器,索引是(索引)寄存器,刻度是常数1,2,4或8。但是,这些字段中的大多数可以忽略以获得默认值。无偏移表示偏移量为0。没有碱基意味着没有碱基寄存器。没有索引和刻度意味着没有索引寄存器 在您的具体示例中,(%rsp)表示%rs

例如,它们之间的区别是什么

cmpl $0x7, 0x8(%rsp)


还有
cmp
cmpl
之间的区别是什么?

我相信你的问题的答案可以在另一个SO问题中找到:

AT&T语法中x86上的内存操作数通常是“偏移量(基、索引、刻度)”,其中偏移量是(常量)偏移量,基是(基)寄存器,索引是(索引)寄存器,刻度是常数1,2,4或8。但是,这些字段中的大多数可以忽略以获得默认值。无偏移表示偏移量为0。没有碱基意味着没有碱基寄存器。没有索引和刻度意味着没有索引寄存器

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

表示宽度后缀 英特尔将指令助记符描述为
CMP
(在《英特尔64和IA-32体系结构软件开发人员手册》中),但指令有多种形式,如比较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)
指将8添加到
(%rsp)
后产生的地址

更完整的形式是偏移量(base、index、scale),它表示基址(这是一个寄存器)加上索引(另一个寄存器)乘以刻度(常数1、2、4或8)加上偏移量的地址


此表单用于索引数组:假设一个数组从地址
%rax
开始,元素宽度为4字节,并且您希望该元素的索引位于
%rbx
中。然后用
(%rax,%rbx,4)
对该元素进行寻址。可以添加额外的偏移量来引用数组中结构中的成员,或者调整数组相对于
%rax

cmpl$0x7,(%rsp)
cmpl$0x7,0x0(%rsp)
之前的0x8(%rsp)如何?这是添加到
rsp
值的偏移量。请参阅有关有效地址语法的文档。至于
l
后缀,如果可以从操作数推断操作大小,则不需要键入该后缀。在这种情况下,您确实需要它,因为两个操作数都没有内部大小。请阅读GNU汇编程序手册。它很好地解释了这一切。那么明智的做法应该是以复制品的形式结束,对吗?然而,我不清楚另一篇文章是如何回答抵消问题的。@paxdiablo:这个问题的问题是,它是关于AT&T语法的两个不相关的问题。所以它太宽泛了,或者应该作为两个不同问题的副本关闭,这是其中之一。但同意这应该是一个评论或只是一个接近投票,在这个州绝对不是一个答案。(有时,发布一个答案并链接到其他SO答案是有意义的,因为这些答案是两个或多个相互交织的问题的副本。但这只是“我也在想其他的事情”。@ecm:修复了您的编辑
cmpL
指定32位操作数大小,因此是64位寄存器上的汇编时错误
cmp$7,%rsp
是一个64位比较,让寄存器名像普通人一样暗示操作数大小。
cmpl $0x7, (%rsp)