как получить текущую позицию курсора в MASM - PullRequest
0 голосов
/ 29 мая 2018

Я пишу программу генерации тестов 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 = rows

dl = колонки

вызов gotoxy

Gotoxy позиционирует курсор относительно начальной позиции консоли, а не относительно текущей позиции. Это проблема, которую я получаю.

Я предполагаю, что должен быть способ получить текущее положение курсоров, чтобы я мог позиционировать курсор назад и вперед, добавляя и вычитая из текущего значения dh и dl создавая фигуры в серии.

1 Ответ

0 голосов
/ 29 мая 2018

Вы можете получить справку 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
...