Assembly “使用”有什么区别;抵销;及;[……”是;在GAS.intel语法汇编中的内存标签和寄存器上?

Assembly “使用”有什么区别;抵销;及;[……”是;在GAS.intel语法汇编中的内存标签和寄存器上?,assembly,x86,gnu-assembler,addressing-mode,intel-syntax,Assembly,X86,Gnu Assembler,Addressing Mode,Intel Syntax,使用GCC,为32位英特尔体系结构编译,使用.Intel\u语法noprefix。 假设我有以下.data部分: A: .int 0x1, 0x2 当用作操作数时,A,[A],偏移量A,以下各项之间有什么区别? 另外,在寄存器和内存标签上使用[…]时有什么区别 简单地编写寄存器和将其放入[…]之间的区别得到了很好的回答。让我给你一个简单的解释。 []方括号的意思是“不处理内容,但处理地址”。 当使用带标签的数据时,可以省略它们(这取决于汇编程序的语法,但在MASM中它肯定是这样工作的)。为什么

使用GCC,为32位英特尔体系结构编译,使用
.Intel\u语法noprefix
。 假设我有以下
.data
部分:

A: .int 0x1, 0x2
当用作操作数时,
A
[A]
偏移量A
,以下各项之间有什么区别? 另外,在寄存器和内存标签上使用
[…]
时有什么区别


简单地编写寄存器和将其放入
[…]
之间的区别得到了很好的回答。

让我给你一个简单的解释。
[]方括号的意思是“不处理内容,但处理地址”。 当使用带标签的数据时,可以省略它们(这取决于汇编程序的语法,但在MASM中它肯定是这样工作的)。为什么?无法直接处理内存中的数据;相反,您只需处理内存中某个位置(某个地址上)的数据。所以不会出现歧义,您总是使用地址上的数据。 当您将它们与寄存器一起使用时,情况就完全不同了:

MOV EAX, 10
只需在EAX寄存器中加载10(0x0000000A)。您直接使用注册表。但是:

MOV EAX, 666
MOV BYTE PTR [EAX], 77
将77加载到内存地址666中。
BYTE PTR
指令是必需的,因为汇编程序不知道是否应该使用1、2、4等字节。
[EAX]
说明“不要使用EAX,而是使用EAX中包含的地址(内存位置)

如果您想找出
[VAR]
VAR
偏移VAR
之间的差异,请尝试逐步使用此代码:

.DATA
VAR DWORD 77

.CODE
    MOV EAX, VAR
    MOV EBX, OFFSET VAR
    MOV ECX, [VAR]
    MOV EDX, OFFSET [VAR]

您将清楚地看到差异。

什么汇编程序?如果是MASM,请参阅。
A
[A]
是等效的。事实上GAS
也是如此。英特尔语法
也是如此。我使用gcc并针对32位英特尔体系结构进行编译。汇编语言是特定于汇编程序的,而不是目标。因此,虽然汇编程序可能只有一种解决方案,但各种解决方案包括[a],字节ptr a,(a),#a和这些主题的变体。根据汇编程序的作者和他们的偏好,有时使用处理器文档中的语法,有时不使用。或者处理器文档中的伪代码也随着时间的推移而发生了变化。一些语法(取决于isa)也可以使用标签或者寄存器一些只是寄存器当您尝试它并检查特定汇编程序的输出时,您发现了什么?请发布您所有的工作和一个完整的最小问题示例。这样就不会出现歧义,-这实际上不是语法设计的唯一选择。NASM做了相反的选择,其中
mov eax,symbol
始终是带有符号地址的mov立即数。(如MASM/GAS.intel\u语法中的
mov eax,OFFSET symbol
)请注意,您的
mov eax,10
有一个立即源,而不是寄存器源,您刚才谈论的是源,而不是目标。在GAS intel语法中,
mov reg,123
是一个mov立即源,而不是从该绝对地址加载。(与AT&T语法不同,
mov 123,%eax
是一个负载,
mov$123,%eax
是mov immediate)。NASM语法的一个很好的功能(AT&T也有,但GAS.intel语法/尤其是MASM本身没有)您可以随时知道它是什么类型的指令,而无需查看
symbol
是EQ常量还是标签/其他符号。NASM中没有括号表示它肯定是一个负载。在GAS.intel\u语法中,如果符号在此指令之前定义
.EQ
,则是立即数,如果在此指令之后定义,则是内存操作数r、 在我看来,这太可怕了。我想让示例尽可能简单(因此我使用了立即加载)。不过,感谢您的解释!我只使用了MASM(因为它由VS支持)…你的例子很好,只是文本让一些陈述看起来不正确。这是一个任意的选择,就像
mov eax,symbol
所做的那样,因此我更清楚地解释它是MASM语法中的一个负载,而不是试图证明这是唯一可能的选择。我的第二条评论中的拼写错误:NASM中没有括号意味着什么这不是一种负担,而是一种直接的负担。