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