Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/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 在ATT汇编语言中,内存地址的类型是否与整数类型不同?_Assembly_Att - Fatal编程技术网

Assembly 在ATT汇编语言中,内存地址的类型是否与整数类型不同?

Assembly 在ATT汇编语言中,内存地址的类型是否与整数类型不同?,assembly,att,Assembly,Att,我知道ATT汇编语言有整数类型(字、双字、四字)和浮点类型(单精度、双精度) 内存地址是整数类型,还是它自己的类型 我看到内存地址是直接指定的,而整数常量是用前缀$指定的。这是因为整数和内存地址的类型不同吗?在AT&T语法中,不同的操作数由不同的语法表示: %eax register operand (%eax) indirect operand foo direct operand $foo

我知道ATT汇编语言有整数类型(字、双字、四字)和浮点类型(单精度、双精度)

内存地址是整数类型,还是它自己的类型


我看到内存地址是直接指定的,而整数常量是用前缀
$
指定的。这是因为整数和内存地址的类型不同吗?

在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