汇编部分寄存器

Assembly partial registers

我看过部分寄存器的解释 并想了解为什么这段代码:

XOR EAX,EAX
MOV AX, BX

仅当 eax 包含一个无符号正数时才有效 但是如果eax中有一个带符号的负数 你需要确保你添加的新位是 111..,我知道它与二进制补码有关 但是还是没看懂

编辑:

我知道上面的代码可以用任何一种方式工作 我想了解为什么您需要填充那些额外的 1(当我不将 eax 归零时)

您经常在手写汇编时使用无符号数字。当然,也不总是这样,C的int促销活动应该会以某种方式实施吧?

让我们从位级别解释二进制补码开始。首先,最高位设置时表示负数,清除时表示非负 nne。如果很清楚,这些东西就会像您期望的那样起作用。即0写成0x000000002147483647写成0x7FFFFFFF。但是,对于任何负数 N,为了获得其绝对值,您必须执行 ~N-1,并进行所有相应的环绕。这导致 -1 被写入 0xFF,而 -2147483648 被写入 0x80。这有一些很好的副作用,例如 -0 == 0 和 addition/subtraction 对所有数字都是相同的操作。

现在,你的代码....

XOR EAX,EAX

作为一条数学规则,对某事物自身进行异或运算的结果始终为零。因此,您可以将其视为优化的“MOV EAX,0”。顺便说一句,您可能想阅读 。那么...

MOV AX, BX

MOV是一条指令,字面意思是"to copy the bits as-is"。即,源中所有被清除的位在目标中分别被清除,源中所有设置的位分别在目标中被设置。在这种情况下,AX 现在将包含 BX 内容的精确副本。在x86架构中,EAXEBXECXEDX都是这样划分的...

 ________________ ________ ____ ____
|      ERX       |   RX   | RH | RL |
|________________|________|____|____|
 \_________________________________/
          |       \________________/
      32 bits              |    \__/
                       16 bits   ||
                               8 bits

这意味着对于每个寄存器RERX代表它的所有32位,RX代表它的低16位,RH代表它的高字节它的低16位,RL表示它的低16位的低字节。因此,返回到您的代码,并假设 BX 包含 0xFFFF-1 的二进制补码),这就是发生的情况...

 ______________ __________________________________ __________________________________
| Instruction  | EAX                              | EBX                              |
|______________|__________________________________|__________________________________|
| XOR EAX, EAX | 00000000000000000000000000000000 | 00000000000000001111111111111111 |
|______________|__________________________________|__________________________________|
| MOV AX, BX   | 00000000000000001111111111111111 | 00000000000000001111111111111111 |
|______________|__________________________________|__________________________________|

那么,如果我们将AX解释为一个补码数,我们就得到了正确答案,即-1。但是,如果我们将 EAX 解释为二进制补码,我们会得到 错误的 答案 65535。为了正确地做到这一点,我们必须做一个符号扩展的举动。这意味着该指令将考虑到该值是二进制补码形式的事实,因此将正确地对其进行操作。看,例如...

 _______________ __________________________________ __________________________________
| Instruction   | EAX                              | EBX                              |
|_______________|__________________________________|__________________________________|
| MOVSX EAX, BX | 11111111111111111111111111111111 | 00000000000000001111111111111111 |
|_______________|__________________________________|__________________________________|

现在,将 EAX 解释为 32 位二进制补码将得出正确答案 -1。这是(还)二进制补码的另一个优势。您可以根据需要多次复制最高位来进行符号扩展。