Assembly x86中使用immediate的SUB如何工作?

Assembly x86中使用immediate的SUB如何工作?,assembly,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。怎么会这样 我假设通过添加cl;两个补码,你真的是指添加cl,1 neg指令已经对寄存器进行了二次补码求反,因此neg cl相当于 not cl ; invert a

我有以下代码:

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。怎么会这样

我假设通过
添加cl;两个补码
,你真的是指添加cl,1

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

not cl ; invert all bits
add cl, 1 ; correct for two's complement.
因此,在第二个示例中,额外增加了1。因此,您需要去掉额外添加的内容,或者将
neg
更改为
not

关于您最初的问题,yes 240对于有符号字节来说太大,无法容纳,但是由于操作数大小相同,汇编程序并不真正关心一个是否有符号,因此它只将其编码为240。不仅如此

sub al, 240
sub al, -16

等效,它们都被编码为相同的指令:
80e9f0

我假设为
addcl;两个补码
,你真的是指添加cl,1

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

not cl ; invert all bits
add cl, 1 ; correct for two's complement.
因此,在第二个示例中,额外增加了1。因此,您需要去掉额外添加的内容,或者将
neg
更改为
not

关于您最初的问题,yes 240对于有符号字节来说太大,无法容纳,但是由于操作数大小相同,汇编程序并不真正关心一个是否有符号,因此它只将其编码为240。不仅如此

sub al, 240
sub al, -16

等效,它们都按照相同的指令编码:
80e9f0

非常感谢!昨天我在准备考试,我不知道和1的差距有多大,为此我挠头。我以为我从根本上误解了关于汇编的某些内容,直到现在才知道我忘记了NEG不是XD,非常感谢!昨天我在准备考试,我不知道和1的差距有多大,为此我挠头。我以为我从根本上误解了汇编的某些内容,直到现在才知道我忘记了NEG不是xD