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