Emu8086手动打印3x3网格时执行光标下移位置异常问题咨询
程序输出异常的核心原因
- 缺少显示页号的显式设置:int 10h的09h(打印字符)、02h(设置光标)功能都要求BH寄存器传入显示页号,你仅在初始化设置光标时赋值了BH=0,后续在
print_char、carriage_return过程中调用对应中断时,没有重新给BH赋值,寄存器值很容易被中断操作篡改,导致字符打印到错误位置、甚至不显示。 - 视频模式选择不匹配:你初始化时设置的
13h是320200 256色图形模式,字符输出的坐标逻辑和文本模式有差异,你要输出文本网格,建议替换为03h(8025 16色文本模式),更适配字符打印的需求。 - 属性参数传递不稳定:你在初始化阶段给BL赋值了0Fh作为文本属性,但后续过程中如果有修改BL寄存器的操作,会导致打印属性异常,建议把属性值定义为常量,在打印时显式赋值。
代码优化通用建议
- 增加寄存器保护逻辑:自定义过程内部用到的寄存器,在进入时压栈保存,返回前弹栈恢复,避免寄存器值被意外修改影响全局逻辑,示例修改后的
print_char如下:
print_char PROC push ax push bx push cx push dx ; 显式设置所有需要的参数 mov BH, 0 mov BL, 0Fh mov AH, 09h mov CX, 1 int 10h ; 更新光标位置 inc DL mov AH, 2h int 10h pop dx pop cx pop bx pop ax ret print_char ENDP
- 抽离硬编码为常量:把视频模式、页号、属性、初始光标位置这些固定值用
equ定义为常量,后续修改更方便,无需遍历代码找硬编码值:
; 常量定义 VIDEOMODE equ 03h PAGE_NUM equ 0 TEXT_ATTR equ 0Fh INIT_ROW equ 1 INIT_COL equ 1
- 简化重复打印逻辑:你当前每行字符都是手动逐个调用
print_char输出,可以把每行的字符序列预存到数据区,用循环遍历输出,大幅减少冗余代码。 - 补充边界校验:在
carriage_return中增加行号越界校验,如果行号超过当前视频模式的最大行限制,补充滚屏逻辑,避免光标越界导致输出异常。
内容的提问来源于stack exchange,提问作者Hayden
相关产品推荐
相关产品推荐

