如何在 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 定位光标相对于控制台的起始位置,而不是相对于当前位置。这是我遇到的问题。

我认为应该有一种获取当前光标位置的方法,以便我可以通过在 dhdl 的当前值中加减来来回定位光标,而连续生成形状。

【问题讨论】:

没有众所周知的gotoxy通用汇编函数,所以你必须使用某种支持库,其中包含这样的函数。检查您使用的是哪种库,以及它的文档(或者它的源代码,如果源代码可用)。也许这是尔湾图书馆? 32位windows变种?然后你可以试试programming.msjc.edu/asm/help/index.html ... Irvine lib中没有读取光标位置的函数,你可以使用底层的windows API调用,或者通过重新设计代码逻辑来完全避免这种需要。 如果是 Irvine32 库,那么 gotoxy(以及其他调用,如 writedecwritechar)将不会修改 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中获取光标的当前位置? [复制]

如何获取文件在`BufReader`中的当前位置?[重复]

如何从 GWT 中的 RichTextArea 获取光标位置或位置?

如何滚动到 UITextView 中的当前光标位置?

Delphi中如何判断当前光标的位置

WPF RichTextBox 如何滚动到光标所在位置滚动条操作