Assembly 在ATT汇编语言中,内存地址的类型是否与整数类型不同?
我知道ATT汇编语言有整数类型(字、双字、四字)和浮点类型(单精度、双精度) 内存地址是整数类型,还是它自己的类型Assembly 在ATT汇编语言中,内存地址的类型是否与整数类型不同?,assembly,att,Assembly,Att,我知道ATT汇编语言有整数类型(字、双字、四字)和浮点类型(单精度、双精度) 内存地址是整数类型,还是它自己的类型 我看到内存地址是直接指定的,而整数常量是用前缀$指定的。这是因为整数和内存地址的类型不同吗?在AT&T语法中,不同的操作数由不同的语法表示: %eax register operand (%eax) indirect operand foo direct operand $foo
我看到内存地址是直接指定的,而整数常量是用前缀
$
指定的。这是因为整数和内存地址的类型不同吗?在AT&T语法中,不同的操作数由不同的语法表示:
%eax register operand
(%eax) indirect operand
foo direct operand
$foo immediate operand
foo(%eax) indexed operand
foo(%eax,%ebx,4) scale, index, base operand
所以foo
和$foo
之间的区别在于前者指的是地址foo
处的内存,而后者指的是foo
的地址。作为一个例子,两者之间的区别
mov 0x1234, %eax
及
前者将地址
0x1234
处的值加载到%eax
中,而后者加载地址0x1234
处的值。汇编语言有哪些数据类型?我知道有整数类型(字、双字、四字)和浮点类型(单精度、双精度)。内存地址是整数类型,还是它自己的类型?@Ben没有单一的“汇编语言”,所以你的问题一般无法回答。进一步注意,对象没有数据类型,它们只是RAM中某个地方的值。当您指示CPU对其进行操作时,您会告诉CPU应该如何处理数据。内存地址同样只是数字。它们通常是字、DWORD、QWORD,具体取决于您是以16位、32位还是64位模式编程。对于分段,这是稍微不同的。@Ben:在asm中,所有内容都是字节。这取决于程序员如何使用指令来做一些有用的事情。e、 g.通常,您希望在以IEEE754双精度浮点格式保存位模式的XMM寄存器上使用addsd
。但您可以在FP位模式上使用整数增量来实现nextafter
,以此类推。有符号/无符号整数也完全取决于程序员根据您在x86上检查的标志,或者您使用的乘法指令。在32位代码中是“double”,在64位代码中是“quad”。还有一个不喜欢它的原因。在硬件级别上,它只是存储在顺序内存地址中的裸位模式,每个地址包含8位(一个字节)。这是存储在HW中的全部信息。然后,x86 CPU了解如何以更大的块(16b字、32b dword,…)访问内存,获取/写入多个连续字节,但内存的特定字节不知道它是由dword还是字节指令写入的,以及它在dword中的位置(如果是作为整数或浮点值的一部分的8位模式),所有这些都被剥离,只剩下8位模式。(一些内存芯片存储某种一致性检查位(“ECC”系统是一个IIRC),然后是“额外的”在芯片上有专门用于存储这些检查值的额外位的信息,但这对程序员来说应该是非常透明的(除了那些在支持这种内存检查的操作系统上工作的程序员),从asm程序员的角度来看,每个内存地址只存储8位。)如果您的问题已解决,请将答案标记为已接受。如果问题未解决,请让我知道您缺少什么,以便我可以解决该问题。
mov $0x1234, %eax