Перевод символов или строки - 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           ; на выход!

Объяснение кода листинга программы

  1. Организация ввода-вывода:
    • Переменная mes1 содержит строку Input string: $, где символ '$' обозначает место для ввода строки.
    • Переменная mes2 содержит строку      Result: $, где символ '$' обозначает место для вывода результата.
    • Переменная buff используется как буфер для хранения вводимой строки.
  2. Организация цикла:
    • Цикл начинается с метки filter.
    • Используется условие al, которое равно ASCII-коду следующего символа в строке.
    • Если al равен 13 (возврат каретки), то выполняется меток print для вывода результата.
    • Если al меньше 'A', то выполняется переход на метку nolet, чтобы пропустить преобразование символа.
    • Если al больше 'Z', то также выполняется переход на метку nolet, чтобы пропустить преобразование символа.
    • В противном случае, к al добавляется 20h (ASCII-код буквы ' '), чтобы преобразовать символ в верхний регистр.
    • Цикл продолжается до тех пор, пока не будет выполнено условие выхода.
  3. Вывод результата:
    • Выполняется команда mov dx, mes2, чтобы установить точку вывода.
    • Выполняется команда int 21h, чтобы вывести символ.
    • Выполняется команда mov dx, buff, чтобы установить точку ввода.
    • Выполняется команда int 21h, чтобы вывести символ.
  4. Завершение работы программы:
    • Выполняется команда xor ax, ax, чтобы очистить регистр ax.
    • Выполняется команда int 16h, чтобы завершить работу программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.429 из 5