如何在 MASM 中获取当前光标位置
Posted
技术标签:
【中文标题】如何在 MASM 中获取当前光标位置【英文标题】:how to get current cursor position in MASM 【发布时间】:2018-05-29 16:55:51 【问题描述】:我正在编写一个 IQ 测试生成程序,在该程序中我必须随机生成包括口头非口头问题的问题。为了生成非语言问题,我想显示字母和字母以圆形或三角形出现的问题。
但我不知道如何定位它们。例如,在一个非语言问题中,我想通过编写以下代码将字母和数字定位为三角形:
mov al, alpha
call writechar
add dl, 4
call gotoxy
mov al, num
call writedec
sub dl, 2
add dh, 1
call gotoxy
mov al, alpha
call writechar
这是我已经知道的
dh= 行
dl=列
调用gotoxy
Gotoxy 定位光标相对于控制台的起始位置,而不是相对于当前位置。这是我遇到的问题。
我认为应该有一种获取当前光标位置的方法,以便我可以通过在 dh 和 dl 的当前值中加减来来回定位光标,而连续生成形状。
【问题讨论】:
没有众所周知的gotoxy
通用汇编函数,所以你必须使用某种支持库,其中包含这样的函数。检查您使用的是哪种库,以及它的文档(或者它的源代码,如果源代码可用)。也许这是尔湾图书馆? 32位windows变种?然后你可以试试programming.msjc.edu/asm/help/index.html ... Irvine lib中没有读取光标位置的函数,你可以使用底层的windows API调用,或者通过重新设计代码逻辑来完全避免这种需要。
如果是 Irvine32 库,那么 gotoxy
(以及其他调用,如 writedec
和 writechar
)将不会修改 dx
寄存器中的值,因此您可以继续调整 dh/dl
all像您发布的类似代码中的时间,它将保留其价值。所有 Irvine lib 调用都保留所有寄存器值,但返回函数值的输出寄存器除外。但是writechar
本身可能会将内部控制台光标移动1 个字符,因此下一个writechar
不会覆盖前一个(而您的dx
不受call write***
的影响)。 =不清楚,你在问什么/什么不起作用
如果这是关于初始位置,然后设计屏幕,它应该看起来如何......你是否为每个问题重绘整个屏幕?然后您可以准确地设计最初要从哪里开始绘图,您不需要读取旧的光标位置,只需根据需要重新绘制屏幕并将所有内容放在计划的位置上。 (寻找某种“清除屏幕”..我从未使用过 Irvine32,所以我不确定那个控制台的工作原理)继续试验一段时间)
是的,我正在使用 irvine32 库
您确定它不是 16 位 DOS 版本吗?从您发布的代码来看,这并不明显,因为您只使用 8 位和 16 位寄存器,所以这种代码在两个目标平台上看起来都是一样的,但它对于理解控制台行为可能至关重要,因为 Windows“控制台”是模拟的东西(就像它可以调整到一些奇怪的大小,比如 174x33),而 DOS 具有图形卡支持的硬件文本模式(具有固定大小/等)。
【参考方案1】:
您可以在线获得 Irvine32 帮助:http://programming.msjc.edu/asm/help/。为获取光标位置指定了一个 WinAPI 函数:GetConsoleScreenBufferInfo。不幸的是,CONSOLE_SCREEN_BUFFER_INFO
结构的描述不正确。相应的 COORD 结构的名称是 dwCursorPosition
。
这是一个如何使用它的示例:
INCLUDE Irvine32.inc
INCLUDELIB Irvine32.lib
.DATA
txt1 db "Current Cursor Position is X=",0
txt2 db " Y=",0
BufferInfo CONSOLE_SCREEN_BUFFER_INFO <>
.CODE
main PROC
lea edx, txt1
call WriteString
invoke GetStdHandle, STD_OUTPUT_HANDLE
invoke GetConsoleScreenBufferInfo, eax, ADDR BufferInfo
movzx eax, BufferInfo.dwCursorPosition.X
call WriteInt
lea edx, txt2
call WriteString
movzx eax, BufferInfo.dwCursorPosition.Y
call WriteInt
exit
main ENDP
END main
【讨论】:
hsu.logdown.com/posts/2016/05/18/masm-ms-windows-programming-3 这里是对结构 CONSOLE_SCREEN_BUFFER_INFO 的所有成员的解释,在示例代码之前我不清楚.以上是关于如何在 MASM 中获取当前光标位置的主要内容,如果未能解决你的问题,请参考以下文章
如何在contenteditable中获取光标的当前位置? [复制]