汇编部分寄存器
Assembly partial registers
我看过部分寄存器的解释
并想了解为什么这段代码:
XOR EAX,EAX
MOV AX, BX
仅当 eax 包含一个无符号正数时才有效
但是如果eax中有一个带符号的负数
你需要确保你添加的新位是 111..,我知道它与二进制补码有关
但是还是没看懂
编辑:
我知道上面的代码可以用任何一种方式工作
我想了解为什么您需要填充那些额外的 1(当我不将 eax 归零时)
您经常在手写汇编时使用无符号数字。当然,也不总是这样,C的int
促销活动应该会以某种方式实施吧?
让我们从位级别解释二进制补码开始。首先,最高位设置时表示负数,清除时表示非负 nne。如果很清楚,这些东西就会像您期望的那样起作用。即0
写成0x00000000
,2147483647
写成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架构中,EAX
、EBX
、ECX
、EDX
都是这样划分的...
________________ ________ ____ ____
| ERX | RX | RH | RL |
|________________|________|____|____|
\_________________________________/
| \________________/
32 bits | \__/
16 bits ||
8 bits
这意味着对于每个寄存器R
,ERX
代表它的所有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
。这是(还)二进制补码的另一个优势。您可以根据需要多次复制最高位来进行符号扩展。
我看过部分寄存器的解释 并想了解为什么这段代码:
XOR EAX,EAX
MOV AX, BX
仅当 eax 包含一个无符号正数时才有效 但是如果eax中有一个带符号的负数 你需要确保你添加的新位是 111..,我知道它与二进制补码有关 但是还是没看懂
编辑:
我知道上面的代码可以用任何一种方式工作 我想了解为什么您需要填充那些额外的 1(当我不将 eax 归零时)
您经常在手写汇编时使用无符号数字。当然,也不总是这样,C的int
促销活动应该会以某种方式实施吧?
让我们从位级别解释二进制补码开始。首先,最高位设置时表示负数,清除时表示非负 nne。如果很清楚,这些东西就会像您期望的那样起作用。即0
写成0x00000000
,2147483647
写成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架构中,EAX
、EBX
、ECX
、EDX
都是这样划分的...
________________ ________ ____ ____
| ERX | RX | RH | RL |
|________________|________|____|____|
\_________________________________/
| \________________/
32 bits | \__/
16 bits ||
8 bits
这意味着对于每个寄存器R
,ERX
代表它的所有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
。这是(还)二进制补码的另一个优势。您可以根据需要多次复制最高位来进行符号扩展。