EMU 8086中16位减法计算结果异常问题咨询
问题分析与解决
核心误解:补码与十进制负数的等价性
你得到的EEEFh和预期的-1111h其实是同一个值——在8086的16位有符号数体系中,负数以补码形式存储:
- 计算
-1111h的补码:对1111h取反得到EEEEh,加1后就是EEEFh。 - 因此
EEEFh就是-1111h的补码表示,结果本身是正确的,CF置1仅表示无符号减法发生了借位,不影响有符号数的正确性。
代码中的错误
你代码里的sbb ax,0000h是多余且错误的:
sub ax,bx执行后,若发生借位(CF=1),sbb ax,0000h会让ax = ax - 0 - CF,也就是额外减1,直接破坏了sub指令得到的正确补码结果。
修正后的代码
; multi-segment executable file template. data segment a1 dw 1199h,2255h,0FFFFh a2 dw 2210h,3333h,0EEEEh count dw 0003h ends code segment start: mov ax,data mov ds,ax lea si,a1 lea di,a2 mov cx,count next: mov bx,[si] mov ax,[di] sub ax,bx ; 直接执行有符号/无符号减法,结果以补码存储 mov [di],ax inc si inc si inc di inc di loop next mov ah,4ch int 21h end start ; set entry point and stop the assembler.
验证说明
修正后,计算0EEEEh - 0FFFFh时:
sub ax,bx执行后,ax的值为EEEFh(即-1111h的补码)- CF标志置1(无符号减法借位),OF标志为0(有符号减法未溢出),符合预期结果
内容的提问来源于stack exchange,提问作者TRUMPiler
相关产品推荐
相关产品推荐

