如何在MASM中获取当前光标位置?IQ测试程序字符布局需求
解决控制台光标位置获取问题,实现非文字类IQ题形状布局
嘿,我来帮你搞定这个问题!你正在开发的IQ测试生成程序想法很棒,尤其是要把字母、数字做成三角形这类视觉化的非文字题目,肯定能让测试更有意思。
你现在遇到的核心问题是:现有的gotoxy是基于控制台起始点的绝对定位,没法直接用当前光标位置的dh/dl做偏移计算。要解决这个,关键是先获取当前光标的位置,之后就能基于这个位置做加减调整,轻松画出你想要的形状。
获取当前光标位置的方法(DOS汇编环境)
从你的代码片段(writechar、writedec这些函数)来看,你应该是在DOS环境下用汇编开发(比如MASM/TASM)。这种场景下,我们可以直接调用BIOS中断int 10h的03h功能来获取光标位置:
; 子功能:获取当前光标位置 mov ah, 03h ; 设置AH为03h,代表获取光标位置功能 mov bh, 0 ; BH指定控制台页号,通常用第0页即可 int 10h ; 调用BIOS中断 ; 执行后,BIOS会把当前光标信息存入寄存器: ; dh = 当前光标所在行 ; dl = 当前光标所在列
结合你的三角形布局需求修改代码
拿到当前光标位置后,你就可以基于dh和dl做偏移计算,再设置新的光标位置来输出字符。比如针对你原来的三角形布局逻辑,修改后可以这样写:
; 先获取当前光标位置,保存初始值 mov ah, 03h mov bh, 0 int 10h push dx ; 把当前行(dh)、列(dl)压栈保存 ; 输出顶部的字母 mov al, alpha call writechar ; 基于当前位置右移4列,设置光标位置 pop dx ; 取出之前保存的光标位置 add dl, 4 ; 列数加4 call gotoxy ; 跳转到新位置 ; 输出数字 mov al, num call writedec ; 基于当前位置下移1行、左移2列,设置光标位置 add dh, 1 ; 行数加1 sub dl, 2 ; 列数减2 call gotoxy ; 输出底部的字母 mov al, alpha call writechar
额外小提示
如果你的gotoxy函数内部也是通过int 10h的02h功能实现的(设置光标位置),你也可以直接调用int 10h 02h来设置光标,不用依赖现有的gotoxy,这样灵活性更高:
; 设置光标位置的直接写法 mov ah, 02h ; AH=02h,代表设置光标位置功能 mov bh, 0 ; 控制台页号 ; dh = 目标行,dl = 目标列 int 10h
这样一来,你就能轻松基于当前光标位置连续调整,画出三角形、圆形等各种形状的非文字题目了!
内容的提问来源于stack exchange,提问作者Saman Zahid
相关产品推荐
相关产品推荐

