如何在MASM中获取当前光标位置

时间:2018-05-29 16:55:51

标签: assembly masm irvine32

我正在编写智商测试生成程序,其中我必须随机生成包含口头非语言问题的问题。为了生成非语言问题,我想显示字母和字母将以圆形或三角形出现的问题。

但我不确定如何定位它们。例如,在非语言问题中,我希望通过编写此代码来将字母和数字定位成三角形:

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 = rows

     

(DL)=列

     

调用gotoxy

Gotoxy相对于控制台的起始位置定位光标,而不是相对于当前位置。这是我遇到的问题。

我认为应该有一种获取当前光标位置的方法,以便我可以通过在 dh dl 的当前值中加上和减去来回来定位光标。生成串联形状。

1 个答案:

答案 0 :(得分: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