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