С клавиатуры вводятся два символа. Вывести их в обратном порядке. - Assembler
Формулировка задачи:
С клавиатуры вводятся два символа. Вывести их в обратном порядке (Например: '1gg1', 'assa', '-==-')
Решение задачи: «С клавиатуры вводятся два символа. Вывести их в обратном порядке.»
textual
Листинг программы
.model small .stack 100h .data First db ? Second db ? Prompt db 'Enter two characters:', '$' .code main proc mov ax, @data mov ds, ax ;вывод приглашения mov ah, 09h lea dx, [Prompt] int 21h ;ввод 1-го символа mov ah, 01h int 21h mov [First],al ;ввод 2-го символа mov ah, 01h int 21h mov [Second],al ;вывод 2-го символа mov ah, 02h mov dl, [Second] int 21h ;вывод 1-го символа mov ah, 02h mov dl, [First] int 21h ;ожидание нажатия любой клавиши mov ah, 08h int 21h or al, al jnz @@Skip ;если нажата функциональная клавиша, mov ah, 08h ;то считать расширенный символ int 21h ;очистив тем самым буфер клавиатуры @@Skip: ;конец программы mov ax, 4C00h int 21h main endp end main
Объяснение кода листинга программы
- .model small - устанавливает модель памяти, в данном случае небольшую, для программы.
- .stack 100h - определяет стек размером в 100 байтов.
- .data - определяет область данных.
- First db ? - объявляет переменную типа
байт
с именемFirst
и инициализирует её значением?
(вопросительный знак). - Second db ? - объявляет переменную типа
байт
с именемSecond
и инициализирует её значением?
(вопросительный знак). - Prompt db 'Enter two characters:', '$' - объявляет строковую переменную с именем
Prompt
, которая содержит приглашение для ввода двух символов. - .code - определяет область кода.
- main proc - определяет процедуру с именем
main
. - mov ax, @data - перемещает регистр
ax
в область данных. - mov ds, ax - устанавливает сегмент данных равным сегменту регистра
ax
. - mov ah, 09h - устанавливает регистр
ah
равным 09h, который используется для вывода строки на экран. - lea dx, [Prompt] - перемещает регистр
dx
в адрес строкиPrompt
в области данных. - int 21h - вызывает функцию BIOS, которая выводит строку на экран.
- mov ah, 01h - устанавливает регистр
ah
равным 01h, который используется для ввода символа. - int 21h - вызывает функцию BIOS, которая вводит первый символ.
- mov [First], al - перемещает символ, введенный пользователем, из регистра
al
в переменнуюFirst
. - mov ah, 01h - устанавливает регистр
ah
равным 01h, который используется для ввода символа. - int 21h - вызывает функцию BIOS, которая вводит второй символ.
- mov [Second], al - перемещает символ, введенный пользователем, из регистра
al
в переменнуюSecond
. - mov ah, 02h - устанавливает регистр
ah
равным 02h, который используется для вывода символа. - mov dl, [Second] - перемещает символ из переменной
Second
в регистрdl
. - int 21h - вызывает функцию BIOS, которая выводит символ на экран.
- mov ah, 02h - устанавливает регистр
ah
равным 02h, который используется для вывода символа. - mov dl, [First] - перемещает символ из переменной
First
в регистрdl
. - int 21h - вызывает функцию BIOS, которая выводит символ на экран.
- mov ah, 08h - устанавливает регистр
ah
равным 08h, который используется для ввода символа. - int 21h - вызывает функцию BIOS, которая вводит символ и очищает буфер клавиатуры.
- or al, al - устанавливает флаг
al
в 1, если была нажата функциональная клавиша. - jnz @@Skip - если был введен не пустой символ, то переходит к следующему шагу.
- mov ah, 08h - устанавливает регистр
ah
равным 08h, который используется для ввода символа. - int 21h - вызывает функцию BIOS, которая вводит символ и очищает буфер клавиатуры.
- @@Skip: - метка для перехода после проверки ввода символа.
- mov ax, 4C00h - устанавливает регистр
ax
равным 4C00h, что означает конец программы. - int 21h - вызывает функцию BIOS, которая завершает программу.