ХАНДЫФАР

Функция GetKeyState возвращает код нажатой пользователем клавиши.

Параметры:

  • Функция не принимает параметров.

Возвращаемое значение:

  • AX: Код нажатой пользователем клавиши.

Состояние флагов:

  • Функция влияет на все флаги.

Особенности:

  • Функция не изменяет значения регистров, кроме AX.

ПРИМЕР 1:

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db "Нажмите ALT+F4, чтобы "
  6. ___________db "выйти из программы...\n\0"
  7. data ends
  8. code segment public
  9. ____assume _ds:data, cs:code
  10. ____include Handyfar.inc
  11. ____include Handykey.inc
  12. ____main proc
  13. ________call____SetDataSegment
  14. ________lea_____ax, ds:[string]
  15. ________call____WriteString
  16. ____WaitUserKeyPress:
  17. ________call____GetKeyState
  18. ________cmp_____ax, KB_ALT_F4
  19. ________jne_____WaitUserKeyPress
  20. ________xor_____al, al
  21. ________call____ExitProcess
  22. ____main endp
  23. code ends
  24. end main

ПРИМЕР 2:

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fmtout db "%b\n\0"
  6. ____number dw 0001000110100101b
  7. data ends
  8. code segment public
  9. ____assume _ds:data, cs:code
  10. ____include Handyfar.inc
  11. ____include Handykey.inc
  12. ____main proc
  13. ________call____SetDataSegment
  14. ________mov_____cx, 16
  15. ____MainLoop:
  16. ________push____cx
  17. ________push____number
  18. ________lea_____ax, ds:[fmtout]
  19. ________call____PrintFormatString
  20. ________add_____sp, 2
  21. ________call____GetKeyState
  22. ________cmp_____ax, KB_SPACE
  23. ________jne_____Done
  24. ________rol_____number, 1
  25. ________pop_____cx
  26. ________loop____MainLoop
  27. ____Done:
  28. ________xor_____al, al
  29. ________call____ExitProcess
  30. ____main endp
  31. code ends
  32. end main
Функция GetKeyState возвращает код нажатой пользователем клавиши.

Параметры:

  • Функция не принимает параметров.

Возвращаемое значение:

  • AX: Код нажатой пользователем клавиши.

Состояние флагов:

  • Функция влияет на все флаги.

Особенности:

  • Функция не изменяет значения регистров, кроме AX.

ПРИМЕР 1:

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db "Нажмите ALT+F4, чтобы выйти из программы...\n\0"
  6. data ends
  7. code segment public ______________; Начало сегмента кода
  8. ____assume _ds:data, cs:code
  9. ____include Handyfar.inc__________; Подключаем файл с функциями
  10. ____include Handykey.inc__________; Подключаем файл со значениями клавиш клавиатуры
  11. ____main proc ____________________; Начало процедуры main
  12. ________call____SetDataSegment____; Вызываем процедуру SetDataSegment
  13. ________lea_____ax, ds:[string]___; Загружаем адрес переменной string в регистр ds:ax
  14. ________call____WriteString_______; Вызываем процедуру WriteString(ax:string)
  15. ____WaitUserKeyPress:
  16. ________call____GetKeyState_______; Вызываем процедуру GetKeyState() := AX
  17. ________cmp_____ax, KB_ALT_F4_____; Сравниваем введённое пользователем значение с KB_ALT_F4
  18. ________jne_____WaitUserKeyPress__; Если ZF=0, то прыгаем на метку WaitUserKeyPress
  19. ________xor_____al, al____________; Обнуляем регистр al
  20. ________call____ExitProcess_______; Вызываем процедуру ExitProcess
  21. ____main endp ____________________; Конец процедуры main
  22. code ends ________________________; Конец сегмента кода
  23. end main _________________________; Конец файла. Точкой входа указывается процедура main

ПРИМЕР 2:

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fmtout db "%b\n\0"
  6. ____number dw 0001000110100101b
  7. data ends
  8. code segment public _______________; Начало сегмента кода
  9. ____assume _ds:data, cs:code
  10. ____include Handyfar.inc___________; Подключаем файл с функциями
  11. ____include Handykey.inc___________; Подключаем файл со значениями клавиш клавиатуры
  12. ____main proc _____________________; Начало процедуры main
  13. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  14. ________mov_____cx, 16_____________; Устанавливаем счётчик равным 16
  15. ____MainLoop:
  16. ________push____cx_________________; Сохраняем значение счётчика в стеке
  17. ________push____number_____________; 2-й: Сохраняем значение переменной number
  18. ________lea_____ax, ds:[fmtout]____; 1-й: Загружаем строки формата fmtout в регистр ds:ax
  19. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:fmtout, number)
  20. ________add_____sp, 2______________; Выравниваем стек
  21. ________call____GetKeyState________; Вызываем процедуру GetKeyState() := AX
  22. ________cmp_____ax, KB_SPACE_______; Сравниваем введённое пользователем значение с KB_SPACE
  23. ________jne_____Done_______________; Если ZF=0, то прыгаем на метку Done
  24. ________rol_____number, 1__________; Поворачиваем биты влево на 1
  25. ________pop_____cx_________________; Выталкиваем значение счётчика из стека обратно в регистр сx
  26. ________loop____MainLoop___________; Выполняем цикл пока ZF≠0 или CX≠0
  27. ____Done:
  28. ________xor_____al, al_____________; Обнуляем регистр al
  29. ________call____ExitProcess________; Вызываем процедуру ExitProcess
  30. ____main endp _____________________; Конец процедуры main
  31. code ends _________________________; Конец сегмента кода
  32. end main __________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda