我是汇编语言编程(x86)的初学者。
以下说法是否正确?
在汇编中,BYTE、WORD、DWORD 等数据类型分别表示 8 位、16 位和 32 位模式,而不仅仅是整数。它们本身没有意义,它们只是位模式。使用它们的指令赋予了它们意义。
“汇编”代码涉及许多特殊指令,这些指令对各种大小的操作数(对于 x86,1 个或更多字节)进行操作,其中包含各个指令假定为特定类型的值。
大多数基本指令集(例如,ADD、CMP、XOR)假定/处理其操作数,就像它们是 N 字节 2 的补码整数一样。BYTE、DWORD 等是说明“N”是什么的提示。
注意:大多数现代计算机都使用 2 的补码,因为 ADD、SUBTRACT 和 CMP(因为它本质上是减法)无论您将操作数解释为带符号结果的带符号操作数还是带符号结果的无符号操作数,都会产生正确的答案,因此您只需要一条 ADD 和一条 SUB 指令,而不是每种类型一条。[在 CMP 之后,您确实需要知道操作数是有符号的还是无符号的。大多数现代 CPU 只是从 CMP 指令生成 unsigned-cmp 和signed-cmp 结果,因此您只需要一条 CMP 指令。比较状态通常存储在 CC 中,该 CC 具有用于无符号和有符号比较结果的位。您确实需要 JMP SIGNED LESS 和 JUMP UNSIGNED LESS 指令]。
所谓的“浮点”指令通常将其操作数视为 32 位或 64 位 IEEE 浮点数。有一些“交叉”指令将一个操作数视为 2 的补码整数;这允许程序在这些表示形式之间进行转换。
所谓的字符串指令将操作数视为 1、2、4 或 8 字节值的寄存器 ECX 长字符串。
各种向量指令将其操作数视为 2 的补码整数的短向量或浮点数。
所以,是的,每个单独的机器指令都为其操作数假定特定的数据类型。
x86 汇编源代码经常在这一点上使人们感到困惑,因为汇编语言程序员似乎指定了显式类型,例如 DWORD 或 QWORD PTR。真正发生的事情是,编码器正在编写一大类指令的名称(例如,MOV),并提供足够的提示,以便汇编器可以选择采用显式编码数据类型的特定二进制机器指令。