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

emu8086汇编代码运行时出现中断未定义错误求助

问题分析

错误提示的核心原因是代码中使用的INT 29h在emu8086环境里默认未被定义。INT 29h是DOS的快速字符输出中断,但emu8086并未预置该中断的向量表项,运行时触发未定义中断的报错。

修复方案

直接将所有INT 29h替换为emu8086完全支持的DOS标准字符输出功能——INT 21h AH=02h,这是最简洁可靠的解决方式。

修改后的完整代码

.model tiny 
.code
ORG 100h
begin: 
JMP start
 
start:
   MOV   AH,9          ; 输出message0
   MOV   DX, offset mess0                                           
   INT   21h
 
   MOV   DI, offset buff       ; 将STOSB写入DI中      
   MOV   BX,4          ; 行计数器
   MOV   DX,4          ; 每行数字计数器
create:         ;<=====; 开始输入并保存 ================//
   MOV   CX,2          ; 限制数字为2个字符
   DEC   DX            ; 递减数字计数器
@1:
   MOV   AH,1          ; 输入
   INT   21h
   STOSB               ; 将第一个字符存储到DI
   LOOP  @1            ; ..接着存储第二个字符。
   MOV   DL,' '        ; 空格/分隔符
   MOV   AH,02h        ; 使用INT 21h AH=02h输出字符
   INT   21h
   STOSB               ; 同样存储到DI中..
   OR    DX,DX         ; 是否为该行最后一个数字?
   JNZ   create        ; 否 - 继续填充该行
   MOV   AH,9          ; 行结束。
   MOV   DX,offset crlf       ; 换行!                     
   INT   21h
   DEC   BX            ; 递减行计数器
   OR    BX,BX         ; 是否为最后一行?
   JZ    next          ; 是 - 退出输入循环
   MOV   DX,4          ; 恢复每行的数字数量
   JMP   create        ; 填充数组的下一行
 
next:           ;<=====; 在屏幕上显示结果 ================//
   MOV   AH,9         
   MOV   DX, offset mess1                                                
   INT   21h
 
   MOV   CX,4          ; 要输出的数字对数量
   MOV   SI, offset buff       ; 源 - 缓冲区                        
print:
   LODSB               ; 读取第一个字符
   MOV   DL,AL
   MOV   AH,02h
   INT   21h           ; 在屏幕上显示
   LODSB               ; 第二个字符..
   MOV   DL,AL
   MOV   AH,02h
   INT   21h
   LODSB               ; 读取空格
   MOV   DL,AL
   MOV   AH,02h
   INT   21h
   ADD   SI,12         ; 将指针移动到4个字符三元组
   LOOP  print         ; 循环直到CX > 0
 
exit:                  ; 退出
   XOR   AX,AX
   INT   16h
   INT   20h
 
ret 
 
mess0  DB  'CREATE ARRAY...',13,10
       DB  '====================',13,10,'$'
mess1  DB  '====================',13,10
       DB  'RESULT: $'
crlf   DB  13,10,'$'
buff   DB  80 DUP(0)   
end begin

修改细节

  • 输入阶段的MOV AL,' '; INT 29h替换为MOV DL,' '; MOV AH,02h; INT 21h,用标准DOS中断实现空格输出。
  • 打印循环里的所有INT 29h,都替换为MOV DL,AL; MOV AH,02h; INT 21h,确保每个字符都能正常输出。
补充说明

如果一定要保留INT 29h,可以手动修改emu8086的中断向量表,将其指向自定义的字符输出函数,但这种方法操作复杂且没必要,不如直接用标准中断稳妥。

内容的提问来源于stack exchange,提问作者Артем Лебідь

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 19:09:31