Вывод последовательности всех целых чисел из заданного диапазона на 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.
- Печать символа новой строки.
- Конец программы.
- Ошибки, которые могут возникнуть в коде:
- Переполнение при выполнении операций с плавающей точкой.
- Недостаточное количество памяти для выполнения операций со стеком.
- Ошибки ввода/вывода при попытке чтения или записи за пределами допустимого диапазона.
- Ошибки сегментации при попытке обращения к памяти, находящейся в неправильном сегменте.
- Ошибки выполнения инструкций при попытке выполнения недопустимых операций.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д