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,提问作者Артем Лебідь
相关产品推荐
相关产品推荐

