如何在x86中立即使用SUB?

Tun*_*yen 0 assembly

我有这个代码:

mov al, 0
sub al, 240
Run Code Online (Sandbox Code Playgroud)

240超过8位寄存器al的有符号范围.我想SUB会照常执行吗?我的意思是:

mov al, 0
mov cl, 240
neg cl
add cl ; two complement
add al, cl
Run Code Online (Sandbox Code Playgroud)

但是,当我在我的计算机上尝试此代码时,结果与实际的子指令不同1.这是怎么回事?

小智 6

我假设add cl ; two complement你真的是这个意思add cl, 1吗?

neg指令已经对寄存器进行了二次补码否定,因此neg cl相当于

not cl ; invert all bits
add cl, 1 ; correct for two's complement.
Run Code Online (Sandbox Code Playgroud)

所以你在第二个例子中额外增加了1.因此,您需要摆脱额外的添加,或者更改negnot.

关于你的初始问题,是240对于一个有符号的字节来说太大了,但是由于操作数大小相同,汇编器并不真正关心一个是否有符号,所以它只是把它编码为240.所以不是只有

sub al, 240
sub al, -16
Run Code Online (Sandbox Code Playgroud)

相当于,它们都被编码为相同的指令:80 e9 f0.