Вывод введенного числа в 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            ;

Объяснение кода листинга программы

  1. org 100h — начало программы, задаёт базовый адрес в 100h
  2. jmp start — переход к метке start
  3. mes0 db 13,10,'Введите число: $' — описание сообщения для вывода на экран
  4. mes1 db 13,10,'Вы ввели.....: $' — описание сообщения для вывода на экран
  5. mes2 db 13,10,'------------------------' — описание сообщения для вывода на экран
  6. db 13,10,'Нажмите любую клавишу...$' — описание сообщения для вывода на экран
  7. start: mov ah,9 — подготовка к выводу сообщения
  8. mov dx,mes0 — указание на сообщение для вывода
  9. int 21h — вывод сообщения на экран
  10. mov ah,1 — подготовка к вводу символа
  11. int 21h — ввод символа
  12. cmp al,'0' — сравнение введенного символа со значением '0'
  13. jb start — если символ меньше или равен '0', то переход на начало цикла
  14. cmp al,'9' — сравнение введенного символа со значением '9'
  15. ja start — если символ больше '9', то переход на начало цикла
  16. push ax — сохранение введенной цифры в стеке
  17. mov ah,9 — подготовка к выводу сообщения
  18. mov dx,mes1 — указание на сообщение для вывода
  19. int 21h — вывод сообщения на экран
  20. pop ax — восстановление цифры из стека
  21. int 29h — вывод цифры на экран
  22. mov ah,9 — подготовка к выводу сообщения
  23. mov dx,mes2 — указание на сообщение для вывода
  24. int 21h — вывод сообщения на экран
  25. exit: xor ax,ax — остановка программы, переход в режим ожидания
  26. int 16h — переход в режим ожидания
  27. mov ax,4C00h — выход из программы
  28. int 21h — выход из программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы