如何通过x86 BIOS调用移动光标?bootloader下设置光标位置失败求助
问题原因分析
首先纠正《Operating systems from 0 to 1》此处的参数描述错误:BIOS INT 0x10 中断AH=0x02(设置光标位置)功能的寄存器定义为:
AH:固定为0x02,代表设置光标位置的功能号BH:显示页号,不是Y坐标DH:光标行号(Y坐标,从0开始计数)DL:光标列号(X坐标,从0开始计数)BL寄存器在该功能下无作用
你当前代码的核心错误有2个:
- 没有给行、列对应的
DH、DL寄存器赋值,系统会使用寄存器默认值,大概率是0 - 显示页号设为了
0x1,实模式下默认激活显示的是第0页,你修改第1页的光标位置,在当前显示的第0页上自然看不到变化
修正后的代码示例
如果你要将光标移动到第2行(Y=1,0起始)、第5列(X=4,0起始),正确代码如下:
MovCursor: pusha mov ah, 0x02 ; 调用设置光标位置功能 mov bh, 0x0 ; 操作当前默认显示的第0页 mov dh, 0x1 ; 行号Y=1 mov dl, 0x4 ; 列号X=4 int 0x10 popa ret ; 不要漏返回指令
补充排查点
如果按维基百科的方法尝试仍不生效,可检查以下项:
- 80x25默认文本模式下,行号最大值为24、列号最大值为79,超出范围时BIOS会自动将光标重置到左上角
- 如果你确实需要使用第1页,需要先调用
INT 0x10 AH=0x05 AL=0x1切换当前显示页到第1页,否则修改非显示页的光标不会有视觉变化 - 确认该函数被正确调用,没有漏写
ret指令导致执行流异常
内容的提问来源于stack exchange,提问作者thewriter300
相关产品推荐
相关产品推荐

