Вывод последовательности всех целых чисел из заданного диапазона на 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
Объяснение кода листинга программы
- Описание переменной:
- left: переменная для хранения первого числа, введенного пользователем.
- right: переменная для хранения второго числа, введенного пользователем.
- str_err: строка, содержащая сообщение об ошибке.
- num: временная переменная, используемая в макросах.
- ax, cx, dl, dh: регистры процессора, используемые для выполнения операций в программе.
- seg_s, seg_d: сегменты стека и данных соответственно.
- ss, ds: сегменты стека и данных, установленные в начало программы.
- ah: регистр процессора, используемый для выполнения операций ввода/вывода.
- al: регистр процессора, используемый для хранения символов, введенных пользователем.
- si, di: индексные регистры, используемые для обращения к элементам массива.
- Описание макросов:
- input_byte: макрос для чтения одного символа из ввода пользователя.
- print_byte: макрос для печати одной цифры числа.
- Описание шагов основной программы:
- Установка сегментов стека и данных.
- Ввод первого числа с помощью макроса input_byte.
- Ввод второго числа с помощью макроса input_byte.
- Сравнение введенных чисел.
- Если числа равны, переход к следующей итерации цикла.
- Если числа не равны, переход к обработке ошибок.
- Обработка ошибок: вывод сообщения об ошибке.
- Если числа равны, продолжение цикла.
- Печать цифры первого числа с помощью макроса print_byte.
- Печать пробела.
- Переход к следующей итерации цикла.
- Если числа равны, продолжение цикла.
- Печать цифры второго числа с помощью макроса print_byte.
- Печать символа новой строки.
- Конец программы.
- Ошибки, которые могут возникнуть в коде:
- Переполнение при выполнении операций с плавающей точкой.
- Недостаточное количество памяти для выполнения операций со стеком.
- Ошибки ввода/вывода при попытке чтения или записи за пределами допустимого диапазона.
- Ошибки сегментации при попытке обращения к памяти, находящейся в неправильном сегменте.
- Ошибки выполнения инструкций при попытке выполнения недопустимых операций.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д