Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Intel 80586
- .586P
- ; плоская модель памяти
- .model flat, stdcall
- ; константы
- std_output_handle equ -11
- std_input_handle equ -10
- key_release equ 0
- key_pressed equ 1
- capslock_on equ 128
- shift equ 42
- ; прототипы внешних процедур
- extern GetStdHandle@4:near
- extern WriteConsoleA@20:near
- extern ReadConsoleInputA@16:near
- ; подключаемые библиотеки
- includelib C:\masm32\lib\user32.lib
- includelib C:\masm32\lib\kernel32.lib
- ; сегмент данных
- data segment
- output word ?
- return dword ?
- output_handle dword ?
- input_handle dword ?
- co dword ?
- buf_key word 9 dup(?)
- caps_flag word 0
- shift_flag byte 0
- upper_msg db "UPPERCASE ",0
- lower_msg db "lowercase ",0
- new_line db 10,0
- data ends
- ; сегмент кода
- text segment
- start:
- ; получение хэндлов ввода\вывода
- push std_input_handle
- call GetStdHandle@4
- mov input_handle, eax
- push std_output_handle
- call GetStdHandle@4
- mov output_handle, eax
- main_loop:
- ; считываем со входа
- push offset co
- push 1
- push offset buf_key
- push input_handle
- call ReadConsoleInputA@16
- ; проверяем нажатие клавиши
- cmp word ptr buf_key + 4, key_pressed
- je check_shift
- ; проверяем отжатие клавиши
- cmp word ptr buf_key + 4, key_release
- jne main_loop
- check_shift:
- cmp word ptr buf_key + 12, shift
- jne main_loop_cont
- not shift_flag
- cmp shift_flag, 0
- main_loop_cont:
- ; сохраним состояние капслока
- mov ax, buf_key + 16
- mov bx, capslock_on
- and ax, bx
- mov caps_flag, ax
- cmp caps_flag, capslock_on
- je caps_on
- jne caps_off
- jmp main_loop
- caps_on:
- cmp shift_flag, 0
- je uppercase
- jne lowercase
- caps_off:
- cmp shift_flag, 0
- je lowercase
- jne uppercase
- uppercase:
- push 0
- push offset return
- push 11
- push offset upper_msg
- push output_handle
- call WriteConsoleA@20
- jmp printkey
- lowercase:
- push 0
- push offset return
- push 11
- push offset lower_msg
- push output_handle
- call WriteConsoleA@20
- jmp printkey
- printkey:
- mov ax, word ptr buf_key + 14
- mov output, ax
- push 0
- push offset return
- push 1
- push offset output
- push output_handle
- call WriteConsoleA@20
- push 0
- push offset return
- push 2
- push offset new_line
- push output_handle
- call WriteConsoleA@20
- jmp main_loop
- text ends
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement