Вывод последовательности всех целых чисел из заданного диапазона на TASM - Assembler

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста, надо: Разработать программу, решающую следующую задачу: Пользователь вводит с клавиатуры начальное и конечное значения диапазона десятичных беззнаковых однобайтных чисел. Программа выводит на экран последовательность всех чисел этого диапазона. Если начальное значение больше конечного, и если вводятся неправильные символы, то программа должна выдать ошибку

Решение задачи: «Вывод последовательности всех целых чисел из заданного диапазона на TASM»

textual
Листинг программы
  1.     .model compact
  2.     .386
  3. ; сегмент стека
  4. seg_s segment
  5.     db 128 dup(?)
  6. seg_s ends
  7. ; сегмент данных   
  8. seg_d segment
  9.     left     db ?
  10.     right    db ?
  11.     str_err  db 13,10,'Err$'   
  12. seg_d ends
  13.  
  14. ; снгмент кода
  15.     .code
  16.     assume ds:seg_d
  17. ; макросы  
  18. input_byte macro num
  19.     local @@1, @@2
  20.     xor dx, dx
  21. @@1:
  22.     mov ah,01h  ; чтение символа из ввода  
  23.     int 21h
  24.     ; проверяем конец строки, пробел или табуляцию
  25.     cmp al, 13
  26.     je @@2
  27.     cmp al, ' '
  28.     je @@2
  29.     cmp al, 9
  30.     je @@2
  31.            
  32.     ; проверяем цифру
  33.     cmp al, '0'
  34.     jb err
  35.     cmp al, '9'        
  36.     ja err
  37.    
  38.     imul dx, 1010b
  39.     test dh, dh
  40.     jnz err       ; переполнение           
  41.     sub al, '0'
  42.     add dl, al
  43.     jc err       ; переполнение
  44.     jmp @@1
  45.    
  46. @@2:
  47.     mov num, dl
  48. endm
  49.  
  50. print_byte macro num
  51.     local @@1, @@2
  52.     mov ax, num
  53.     xor cx, cx
  54.     mov dl,10
  55. @@1:test ax, ax
  56.     jz @@2
  57.     ; отделяем справо очередную цифру и складываем её в стек   
  58.     div dl
  59.     push ax
  60.     inc cx
  61.     xor ah, ah
  62.     jmp @@1
  63.        
  64. @@2:; печать цифр числа
  65.     mov ah, 02h
  66.     pop dx
  67.     add dh, '0'
  68.     mov dl, dh 
  69.     int 21h  
  70.     loop @@2
  71. endm
  72.  
  73. main:
  74.     ; устанавливаем сегменты
  75.     mov ax, seg_d
  76.     mov ds, ax
  77.     mov ax, seg_s
  78.     mov ss, ax
  79.  
  80.     ; ввод первого числа
  81.     input_byte left
  82.     ; ввод второго числа
  83.     input_byte right   
  84.    
  85.     nop
  86.    
  87.     movzx si, left
  88.     movzx di, right
  89.     cmp si, di
  90.     ja err           
  91. @1: cmp si, di
  92.     ja quit            
  93.     print_byte si
  94.     mov ah, 02h
  95.     mov dl, ' '
  96.     int 21h
  97.     inc si
  98.     jmp @1         
  99. err:
  100.     mov ah, 09h   ; вывод строки
  101.     mov dx, offset str_err
  102.     int 21h
  103. quit:      
  104.     mov ax, 4C00h ; выход из программы
  105.     int 21h
  106. ; точка входа в программу и последняя инструкция
  107. end main

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

  1. Описание переменной:
    • left: переменная для хранения первого числа, введенного пользователем.
    • right: переменная для хранения второго числа, введенного пользователем.
    • str_err: строка, содержащая сообщение об ошибке.
    • num: временная переменная, используемая в макросах.
    • ax, cx, dl, dh: регистры процессора, используемые для выполнения операций в программе.
    • seg_s, seg_d: сегменты стека и данных соответственно.
    • ss, ds: сегменты стека и данных, установленные в начало программы.
    • ah: регистр процессора, используемый для выполнения операций ввода/вывода.
    • al: регистр процессора, используемый для хранения символов, введенных пользователем.
    • si, di: индексные регистры, используемые для обращения к элементам массива.
  2. Описание макросов:
    • input_byte: макрос для чтения одного символа из ввода пользователя.
    • print_byte: макрос для печати одной цифры числа.
  3. Описание шагов основной программы:
    1. Установка сегментов стека и данных.
    2. Ввод первого числа с помощью макроса input_byte.
    3. Ввод второго числа с помощью макроса input_byte.
    4. Сравнение введенных чисел.
    5. Если числа равны, переход к следующей итерации цикла.
    6. Если числа не равны, переход к обработке ошибок.
    7. Обработка ошибок: вывод сообщения об ошибке.
    8. Если числа равны, продолжение цикла.
    9. Печать цифры первого числа с помощью макроса print_byte.
    10. Печать пробела.
    11. Переход к следующей итерации цикла.
    12. Если числа равны, продолжение цикла.
    13. Печать цифры второго числа с помощью макроса print_byte.
    14. Печать символа новой строки.
    15. Конец программы.
  4. Ошибки, которые могут возникнуть в коде:
    • Переполнение при выполнении операций с плавающей точкой.
    • Недостаточное количество памяти для выполнения операций со стеком.
    • Ошибки ввода/вывода при попытке чтения или записи за пределами допустимого диапазона.
    • Ошибки сегментации при попытке обращения к памяти, находящейся в неправильном сегменте.
    • Ошибки выполнения инструкций при попытке выполнения недопустимых операций.

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


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

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

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы