我正在准备一项考试,我必须在没有计算机的情况下找到 x86 汇编程序的结果,特别是我对老师给我们的示例有疑问。
MOV AX,6326
OR EAX,0000FFF1h
AND EAX,0000000Fh
MOV BL,-1
SUB BL,250
MUL BL
什么是AX?
如果我尝试自己做的话,过程似乎是:
在 OR 和
AND, EAX is 00000007h
之后,十进制为 7
SUB BL, 250
= -1 - 250 = -251MUL BL
= -251 x 7 = -1757,因此没有符号 AX 等于 1757
但是如果我尝试在 VS 上运行它,结果是 35。
我认为差异是由两者的补码引起的,但我不明白为什么或在哪里发生这种变化。
MOV AX,6326 18B6h AX
OR EAX,0000FFF1h 0000FFF7h EAX
AND EAX,0000000Fh 00000007h EAX
MOV BL,-1 FFh BL
SUB BL,250 05h BL
MUL BL 0023h AX
你对 EAX 的看法是正确的。
对于
MOV BL,-1
,您应该注意,CPU 在通过 MOV
加载寄存器时不会修改任何标志。该指令也可以读取 MOV BL,255
,因为这是存储在该寄存器中的实际位模式(-1 和 255 共享相同的位模式)。如果你这样看,减法就变成了非常正常的 255 - 250,生成 5。接下来的无符号 MUL
计算同样简单的 7 * 5,生成 35。