Подмена вывода - Assembler
Формулировка задачи:
model tiny jumps ; для генерации <длинных> переходов segm segment para public 'code' assume cs:segm,ds:segm org 100h start: MOV AH, 1 ;АН = 1 INT 21h ;вызываем функцию DOS 01h CMP ah, 11h ;если AL = 21h, то была нажата клавиша w JZ fTxt ;тогда переходим к метке w JMP btnTxt ;иначе переходим к метке btnTxt ;CMP AH, 2Eh ;если AL = 2Eh, то была нажата клавиша c ;JZ cTxt ;тогда переходим к метке c ;JMP btnTxt ;иначе переходим к метке btnTxt ;CMP AH, 11h ;если AL = 11h, то была нажата клавиша w ;JZ wtxt ;тогда переходим к метке w ;JMP btnTxt ;иначе переходим к метке btnTxt btnTxt: MOV bx, offset btn JMP OutTxt ;переход к метке OutTxt fTxt: MOV bx, offset STR_F JMP OutTxt wTxt: MOV bx, offset STR_W JMP OutTxt cTxt: MOV bx, offset STR_C JMP OutTxt OutTxt: MOV ah, 09h ;выводим сообщение о нажатой клавише MOV dx, bx INT 21h btnEsc: RET ;завершение программы STR_C DB 'cprintf $' STR_W DB 'WHILE $' STR_F DB 'FOR $' F1 DB ' sumbol F1$' btn DB ' 123456$' END start
Решение задачи: «Подмена вывода»
textual
Листинг программы
mov ah,05 int 16h
Объяснение кода листинга программы
ah
- это регистр сегмента аккумулятора (AH), который используется для хранения данных и кодов, выполняемых процессором. Значение05
в данном случае указывает на выполнение команды чтения данных с порта ввода/вывода (IN).int 16h
- это команда прерывания, которая вызывает обработчик прерывания номер 16 (в данном случае используется стандартный обработчик прерываний BIOS).