我有这段代码:
mov al, 0
sub al, 240
240超过了8位寄存器al的有符号范围。我想SUB会照常执行吗?我的意思是:
mov al, 0
mov cl, 240
neg cl
add cl ; two complement
add al, cl
但是,当我在计算机上尝试此代码时,结果与实际的子指令不同1.这是怎么回事?
答案 0 :(得分:6)
我假设add cl ; two complement
,你的意思是add cl, 1
?
neg
指令已经对寄存器进行了二次补码否定,因此neg cl
相当于
not cl ; invert all bits
add cl, 1 ; correct for two's complement.
所以你在第二个例子中额外增加了1。因此,您需要摆脱额外的添加,或将neg
更改为not
。
关于你的初始问题,是240对于一个有符号的字节来说太大了,但是由于操作数大小相同,汇编器并不真正关心一个是否有符号,所以它只是把它编码为240那么不仅仅是
sub al, 240
sub al, -16
等价,它们都被编码为相同的指令:80 e9 f0
。