【发布时间】:2018-05-03 13:50:43
【问题描述】:
我知道 -4 被复制到 EAX 寄存器中。
我的疑惑:
-4 是否会在复制到 EAX 之前转换为二进制补码表示法?
如果转换成二进制补码,谁来做?
是否有任何特殊的操作码来表示负数?
我们可以在 EAX 寄存器中存储的最大负数是多少?
有符号运算有什么特殊的操作码或指令吗?
当我们在 CPU 中将正数和负数相乘时会发生什么?
【问题讨论】:
-
“当我们在 CPU 中将负数和正数相乘时会发生什么?” 您是否尝试查找除法和乘法 in Intel's manuals?
-
就转化而言,运行时没有转化。
mov带有立即操作数,只是在您组装和链接代码时复制编码到指令中的位。英特尔手册的第 1 卷指出:“有符号整数是以字节、字、双字或四字形式保存的有符号二进制数。对有符号整数的所有操作都采用二进制补码表示。符号位位于 a 中的第 7 位。字节整数,字整数第15位,双字整数第31位,四字整数第63位(见表4-1有符号整数编码)" -
谢谢@Michael
-
@Michael:您可以在运行时使用
add eax, -4获得符号扩展,因为这将使用符号扩展为 32 位的 8 位立即数。 (mov没有任何立即数小于操作数大小的编码,除非在 x86-64 中使用mov r/m64, imm32(例如mov rax, -4),它将在运行时使用 imm32 符号扩展为 64 位。)
标签: x86 signed twos-complement negative-number