Перевод символов или строки - 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, чтобы завершить работу программы.
- Выполняется команда