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

Assembly 8086:无法入栈双符号标记的问题求助

8086汇编二进制转十进制:栈结束标记问题解决

问题根源

  • "$$"无法直接入栈:8086的PUSH指令仅支持16位寄存器、内存操作数或16位立即数,"$$"属于字符串常量,语法不被emu8086支持,因此触发报错。
  • 0作为标记的缺陷:除以10的余数范围是0-9,0是合法余数(比如数值10、20运算后都会产生余数0),程序会将正常余数误判为结束标记,或因栈内容异常进入无限循环。

可行解决方案

选择不在余数合法范围(0-9)内的16位数值作为标记,比如0FFFFh(任意大于9的16位值都可,0FFFFh是直观的“无效值”标记)。修改后的代码如下:

PUSH    ax
PUSH    cx
PUSH    dx

MOV cx, 10  
PUSH    0FFFFh    ; 用0FFFFh作为结束标记,避免与余数冲突
Divide:
MOV dx, 0       
DIV cx      
PUSH    dx      
CMP ax, 0   
JA  Divide


MOV ah, 2
Print:
POP dx      
CMP dx, 0FFFFh  ; 判断是否到达结束标记
JE  End
ADD dl, '0'     
INT 21h     
JMP Print   
End:
POP dx          ; 恢复寄存器,保证栈平衡
POP cx
POP ax

额外说明

  • 标记值只要满足大于9即可,比如10、0FF00h都能替代0FFFFh,核心是避开余数的合法范围。
  • 原代码未定义End标签,需补上避免跳转异常;最后要恢复入栈的寄存器,保证栈平衡,防止后续程序出错。

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:35:34