我有这个代码:
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.因此,您需要摆脱额外的添加,或者更改neg为not.
关于你的初始问题,是240对于一个有符号的字节来说太大了,但是由于操作数大小相同,汇编器并不真正关心一个是否有符号,所以它只是把它编码为240.所以不是只有
sub al, 240
sub al, -16
Run Code Online (Sandbox Code Playgroud)
相当于,它们都被编码为相同的指令:80 e9 f0.