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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:00:22