Advertisement
Guest User

Untitled

a guest
Oct 8th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; определить, какой из шифтов нажат
  2.  
  3. ; Intel 80586
  4. .586P
  5. ; плоская модель памяти
  6. .model flat, stdcall
  7.  
  8. ; константы
  9. std_output_handle   equ -11
  10. std_input_handle    equ -10
  11. key_ev              equ 0
  12. left_shift_val      equ 42
  13. right_shift_val     equ 54
  14.  
  15. ; прототипы внешних процедур
  16. extern  GetStdHandle@4:near
  17. extern  WriteConsoleA@20:near
  18. extern  ReadConsoleInputA@16:near
  19.  
  20. ; подключаемые библиотеки
  21. includelib C:\masm32\lib\user32.lib
  22. includelib C:\masm32\lib\kernel32.lib
  23.  
  24. ; сегмент данных
  25. data segment
  26.     return          dword ?
  27.     output_handle   dword ?
  28.     input_handle    dword ?
  29.     co              dword ?
  30.     buf_key         word 9 dup(?)
  31.     left_shift_msg  db "  LEFT SHIFT",10,0 ; 10 - перевод строки, 0 - конец
  32.     right_shift_msg db "  RIGHT SHIFT",10,0
  33. data ends
  34.  
  35. ; сегмент кода
  36. text segment
  37. start:
  38.     ; получение хэндлов ввода\вывода
  39.     push std_input_handle
  40.     call GetStdHandle@4
  41.     mov input_handle, eax
  42.     push std_output_handle
  43.     call GetStdHandle@4
  44.     mov output_handle, eax
  45.    
  46. main_loop:
  47.     ; считываем со входа
  48.     push offset co
  49.     push 1
  50.     push offset buf_key
  51.     push input_handle
  52.     call ReadConsoleInputA@16
  53.    
  54.     ; проверяем отжатие клавиши
  55.     cmp word ptr buf_key + 4, key_ev
  56.     jne main_loop  
  57.    
  58.     mov ax, word ptr buf_key + 12 ; записываем скан-код в регистр ax
  59.    
  60.     cmp ax, left_shift_val ; сравниваем скан-код с кодом клавиши left_shift
  61.     je left_shift
  62.    
  63.     cmp ax, right_shift_val ; сравниваем скан-код с кодом клавиши right_shift
  64.     je right_shift    
  65.        
  66.     jmp main_loop
  67.    
  68. left_shift:
  69.     ; печатаем сообщение о левом шифте
  70.     push 0
  71.     push offset return ; адрес куда вернуть (нам не важен)
  72.     push 13 ; длина сообщения
  73.     push offset left_shift_msg ; первый символ сообщения
  74.     push output_handle
  75.     call WriteConsoleA@20 ; 20 = 4 байта * 5 аргументов
  76.     jmp main_loop
  77.    
  78. right_shift:
  79.     push 0
  80.     push offset return
  81.     push 14
  82.     push offset right_shift_msg
  83.     push output_handle
  84.     call WriteConsoleA@20
  85.     jmp main_loop
  86.  
  87.    
  88. text ends
  89. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement