【问题标题】:what happens when we do mov eax , -4?当我们执行 mov eax , -4 时会发生什么?
【发布时间】: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


【解决方案1】:

二进制补码的转换由汇编程序完成。汇编器发出的机器码包含二进制形式的数据。

一些操作码将数据解释为无符号值,一些对有符号值起作用,而一些操作码对两者都是相同的。没有专门针对负数的操作码。

当解释为有符号数时,eax 的范围是 -2^31 .. 2^31-1。

假设使用有符号乘法指令并且没有溢出,将负数乘以正数会得到正确的负数结果,即二进制补码值。

【讨论】:

  • 在c中我们声明有符号和无符号整数来指定符号,x86汇编中如何指定有符号和无符号整数?
  • 你没有用数据表明类型;数据类型由用于对其执行操作的操作码控制。您可以使用不同的操作码对相同的数据执行有符号乘法和无符号乘法。
  • 所以数据只是二进制的,但不同的操作码对二进制的看法不同。我说的对吗?
  • 如果a声明了一个负值的变量,add指令怎么看ti?
  • @Naveenprakash:二进制补码的加法和减法并不关心数字应该被解释为有符号还是无符号,因为该操作适用于两者。
猜你喜欢
  • 1970-01-01
  • 2013-04-18
  • 2012-08-08
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多