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

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

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

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

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

textual
Листинг программы
    .model compact
    .386
; сегмент стека
seg_s segment
    db 128 dup(?)
seg_s ends
; сегмент данных    
seg_d segment
    left     db ?
    right    db ?
    str_err  db 13,10,'Err$'    
seg_d ends
 
; снгмент кода
    .code
    assume ds:seg_d
; макросы   
input_byte macro num
    local @@1, @@2
    xor dx, dx
@@1:
    mov ah,01h  ; чтение символа из ввода  
    int 21h
    ; проверяем конец строки, пробел или табуляцию
    cmp al, 13
    je @@2
    cmp al, ' '
    je @@2
    cmp al, 9
    je @@2
            
    ; проверяем цифру
    cmp al, '0'
    jb err
    cmp al, '9'         
    ja err
    
    imul dx, 1010b 
    test dh, dh
    jnz err       ; переполнение            
    sub al, '0'
    add dl, al
    jc err       ; переполнение
    jmp @@1
    
@@2:
    mov num, dl 
endm
 
print_byte macro num
    local @@1, @@2
    mov ax, num
    xor cx, cx
    mov dl,10
@@1:test ax, ax
    jz @@2
    ; отделяем справо очередную цифру и складываем её в стек    
    div dl
    push ax
    inc cx
    xor ah, ah
    jmp @@1 
        
@@2:; печать цифр числа
    mov ah, 02h
    pop dx
    add dh, '0'
    mov dl, dh  
    int 21h  
    loop @@2
endm
 
main:
    ; устанавливаем сегменты
    mov ax, seg_d
    mov ds, ax
    mov ax, seg_s
    mov ss, ax
 
    ; ввод первого числа
    input_byte left 
    ; ввод второго числа
    input_byte right    
    
    nop
    
    movzx si, left
    movzx di, right 
    cmp si, di
    ja err           
@1: cmp si, di
    ja quit             
    print_byte si 
    mov ah, 02h
    mov dl, ' '
    int 21h
    inc si
    jmp @1          
err:
    mov ah, 09h   ; вывод строки
    mov dx, offset str_err 
    int 21h 
quit:       
    mov ax, 4C00h ; выход из программы
    int 21h
; точка входа в программу и последняя инструкция
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
Похожие ответы