如何在x86中立即使用SUB?

时间:2018-02-14 17:10:12

标签: assembly

我有这段代码:

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.这是怎么回事?

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