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

Emu8086手动打印3x3网格时执行光标下移位置异常问题咨询

程序输出异常的核心原因

  1. 缺少显示页号的显式设置:int 10h的09h(打印字符)、02h(设置光标)功能都要求BH寄存器传入显示页号,你仅在初始化设置光标时赋值了BH=0,后续在print_char、carriage_return过程中调用对应中断时,没有重新给BH赋值,寄存器值很容易被中断操作篡改,导致字符打印到错误位置、甚至不显示。
  2. 视频模式选择不匹配:你初始化时设置的13h是320200 256色图形模式,字符输出的坐标逻辑和文本模式有差异,你要输出文本网格,建议替换为03h(8025 16色文本模式),更适配字符打印的需求。
  3. 属性参数传递不稳定:你在初始化阶段给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:45:04