Перевод символов или строки - Assembler
Формулировка задачи:
Добрый день-однополчане) Я вот написал программу для переповада строчных латинских букв в прописные.
она не работает, помогите пожалуйста найти и поправить ошибку?
Листинг программы
- MODEL small
- STACK 256
- STDIN EQU 0 ;Дескриптор стандартного ввода
- STDOUT EQU 1 ;Дескриптор стандартного вывода
- STDERR EQU 2 ;Дескриптор стандартной ошибки (экрана)
- DATASEG
- msg DB 'Input to string'
- msglen EQU $-msg
- Buf DB 80 DUP('')
- actlen DW 0
- CODESEG
- Start: mov ax,@data ;Установка в ds адреса
- mov ds,ax ;сегмента данных
- mov ah,40h ;Функция вывода
- mov bx,stderr
- mov cx,msglen ;Длина сообщения
- mov dx,offset msg ;Адрес сообщения
- int 21h
- mov ah,3fh ;Функция ввода
- mov bx,stdin
- mov cx,80 ;Ввод максимум 80 байт
- mov dx,offset Buf ;Адрес буфера
- int 21h
- mov actlen,ax ;Фактически введено
- mov cx,actlen ;Счётчик элементов строки
- mov si,0 ;Инициализация указателя элементов строки
- filter:
- mov si,0
- mov al,buf[si] ;Возьмём символ
- cmp al,'a' ;Меньше 'a'?
- jb nolet ;Да, не преобразовывать
- cmp al,'z' ;Больше 'z'?
- ja nolet ;Да, не преобразовывать
- sub al,20h ;Преобразуем в прописную
- mov Buf[si],al ;Отправим в Buf
- nolet:
- inc si
- loop filter ;Цикл
- mov ah,40h ;Функция вывода
- mov bx,stdout
- mov cx,[actlen] ;Длина сообщения
- mov dx,offset Buf ;Адрес сообщения
- int 21h
- Exit:
- mov ax,4Ch ;Функция DOS 4Сh: выход из программы
- int 21h ;Вызов DOS. Останов
- END Start ;Конец программы/точка входа
Решение задачи: «Перевод символов или строки»
textual
Листинг программы
- org 100h
- jmp start
- mes1 db 13,10,'Input string: $'
- mes2 db 13,10,' Result: $'
- buff db 80 dup('$')
- start:
- mov ah,9
- mov dx,mes1
- int 21h
- ;=======================================================
- mov di,buff
- mov ah,1
- filter:
- int 21h
- cmp al,13
- je print
- cmp al,'A' ;Меньше 'A'?
- jb nolet ;Да, не преобразовывать
- cmp al,'Z' ;Больше 'Z'?
- ja nolet ;Да, не преобразовывать
- add al,20h
- nolet:
- stosb
- jmp filter
- ;======================================================
- print:
- mov ah,9
- mov dx,mes2
- int 21h
- mov dx,buff
- int 21h
- xor ax, ax ;
- int 16h ;
- int 20h ; на выход!
Объяснение кода листинга программы
- Организация ввода-вывода:
- Переменная
mes1
содержит строкуInput string: $
, где символ '$' обозначает место для ввода строки. - Переменная
mes2
содержит строкуResult: $
, где символ '$' обозначает место для вывода результата. - Переменная
buff
используется как буфер для хранения вводимой строки.
- Переменная
- Организация цикла:
- Цикл начинается с метки
filter
. - Используется условие
al
, которое равно ASCII-коду следующего символа в строке. - Если
al
равен 13 (возврат каретки), то выполняется метокprint
для вывода результата. - Если
al
меньше 'A', то выполняется переход на меткуnolet
, чтобы пропустить преобразование символа. - Если
al
больше 'Z', то также выполняется переход на меткуnolet
, чтобы пропустить преобразование символа. - В противном случае, к
al
добавляется 20h (ASCII-код буквы ' '), чтобы преобразовать символ в верхний регистр. - Цикл продолжается до тех пор, пока не будет выполнено условие выхода.
- Цикл начинается с метки
- Вывод результата:
- Выполняется команда
mov dx, mes2
, чтобы установить точку вывода. - Выполняется команда
int 21h
, чтобы вывести символ. - Выполняется команда
mov dx, buff
, чтобы установить точку ввода. - Выполняется команда
int 21h
, чтобы вывести символ.
- Выполняется команда
- Завершение работы программы:
- Выполняется команда
xor ax, ax
, чтобы очистить регистрax
. - Выполняется команда
int 16h
, чтобы завершить работу программы.
- Выполняется команда
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д