Вывод введенного числа в TASM - Assembler
Формулировка задачи:
Здравстуйте, никак не могу разобраться с ассемблером на примере кода.
Нужно вывести введенное число с текстом "Вы ввели"
И нужно сделать проверку это то число или нет, если то - то пусть выводится "нажмите любую клавишу" если нет "то введите число еще раз" . Пожалуйста, очень срочно
data segment para public "data" ;начало сегмента данных
message db 'Enter: $' ;наша строка (приглашение для ввода двух символов с клавы)
data ends ;конец сегмента данных
stk segment stack ;начало сегмента стека
db 256 dup ("?") ;выделение памяти под стек
stk ends ;конец сегмента стека
code segment para public "code" ;начало сегмента кода
main proc ;начало процедуры
assume cs:code,ds:data,ss:stk ;сопоставление сегментных регистров и сегментов
mov ax,data
mov ds,ax ;инициализация сегмента данных через промежуточный регистр ax
mov ah,9 ;функция вывода сообщения на экран
mov dx,offset message ;адрес начала сообщения
int 21h ;прерывание, чтобы функция выполнилась
xor ax,ax ;обнуление регистра ax (здесь это не обязательно, можно удалить эту строку)
mov ah,1h ;функция ввода с клавиатуры символа с эхом
int 21h ;прерывание, чтобы функция выполнилась
;ASCII-код введенного символа помещается в регистр al
mov dl,al ;помещаем ASCII-код введенного символа в регистр dl
sub dl,30h ;предполагаем, что была нажата цифра. преобразовываем ASCII-код цифры в символ
cmp dl,9h ;проверяем, действительно ли была нажата цифра
jle M1 ;если была нажата цифра, то прыгаем на метку M1
sub dl,7h ;если была нажата буква, то дополнительно преобразовываем ASCII-код буквы в символ
M1: ;метка M1
mov cl,4h ;один шестнадцатеричный символ занимает 4 бита (полубайт)
shl dl,cl ;сдвигаем символ из младшего полубайта в старший
int 21h ;вводим второй символ. прерывание, чтобы функция ввода выполнилась
sub al,30h ;предполагаем, что была нажата цифра. преобразовываем ASCII-код цифры в символ
cmp al, 9h ;проверяем, действительно ли была нажата цифра
jle M2 ;если была нажата цифра, то прыгаем на метку M2
sub al,7h ;если была нажата буква, то дополнительно преобразовываем ASCII-код буквы в символ
M2: ;метка M2
add dl,al ;помещаем символ в младший полубайт
mov ax,4c00h;функция выхода из программы. код возврата - ноль
int 21h ;прерывание, чтобы функция выполнилась
main endp ;конец процедуры
code ends ;конец сегмента кода
end main ;указывается метка (процедура), с которой должна начаться выполняться программаРешение задачи: «Вывод введенного числа в TASM»
textual
Листинг программы
org 100h jmp start mes0 db 13,10,'Введите число: $' mes1 db 13,10,'Вы ввели.....: $' mes2 db 13,10,'------------------------' db 13,10,'Нажмите любую клавишу...$' start: mov ah,9 ; мессага mov dx,mes0 ; int 21h ; mov ah,1 ; вводим символ int 21h ; cmp al,'0' ; jb start ; переход, если мень нуля cmp al,'9' ; ja start ; переход, если больше 9 push ax ; значит цифра - запомним её mov ah,9 ; mov dx,mes1 ; мессага int 21h ; pop ax ; восстанавливаем цифру int 29h ; выводим её на экран mov ah,9 ; mov dx,mes2 ; мессага int 21h ; exit: xor ax,ax ; пауза.. int 16h ; mov ax,4C00h ; выход! int 21h ;
Объяснение кода листинга программы
- org 100h — начало программы, задаёт базовый адрес в 100h
- jmp start — переход к метке start
- mes0 db 13,10,'Введите число: $' — описание сообщения для вывода на экран
- mes1 db 13,10,'Вы ввели.....: $' — описание сообщения для вывода на экран
- mes2 db 13,10,'------------------------' — описание сообщения для вывода на экран
- db 13,10,'Нажмите любую клавишу...$' — описание сообщения для вывода на экран
- start: mov ah,9 — подготовка к выводу сообщения
- mov dx,mes0 — указание на сообщение для вывода
- int 21h — вывод сообщения на экран
- mov ah,1 — подготовка к вводу символа
- int 21h — ввод символа
- cmp al,'0' — сравнение введенного символа со значением '0'
- jb start — если символ меньше или равен '0', то переход на начало цикла
- cmp al,'9' — сравнение введенного символа со значением '9'
- ja start — если символ больше '9', то переход на начало цикла
- push ax — сохранение введенной цифры в стеке
- mov ah,9 — подготовка к выводу сообщения
- mov dx,mes1 — указание на сообщение для вывода
- int 21h — вывод сообщения на экран
- pop ax — восстановление цифры из стека
- int 29h — вывод цифры на экран
- mov ah,9 — подготовка к выводу сообщения
- mov dx,mes2 — указание на сообщение для вывода
- int 21h — вывод сообщения на экран
- exit: xor ax,ax — остановка программы, переход в режим ожидания
- int 16h — переход в режим ожидания
- mov ax,4C00h — выход из программы
- int 21h — выход из программы