You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:39:17