Перевод символов или строки - Assembler

Узнай цену своей работы

Формулировка задачи:

Добрый день-однополчане) Я вот написал программу для переповада строчных латинских букв в прописные.
Листинг программы
  1. MODEL small
  2. STACK 256
  3. STDIN EQU 0 ;Дескриптор стандартного ввода
  4. STDOUT EQU 1 ;Дескриптор стандартного вывода
  5. STDERR EQU 2 ;Дескриптор стандартной ошибки (экрана)
  6. DATASEG
  7. msg DB 'Input to string'
  8. msglen EQU $-msg
  9. Buf DB 80 DUP('')
  10. actlen DW 0
  11. CODESEG
  12. Start: mov ax,@data ;Установка в ds адреса
  13. mov ds,ax ;сегмента данных
  14. mov ah,40h ;Функция вывода
  15. mov bx,stderr
  16. mov cx,msglen ;Длина сообщения
  17. mov dx,offset msg ;Адрес сообщения
  18. int 21h
  19. mov ah,3fh ;Функция ввода
  20. mov bx,stdin
  21. mov cx,80 ;Ввод максимум 80 байт
  22. mov dx,offset Buf ;Адрес буфера
  23. int 21h
  24. mov actlen,ax ;Фактически введено
  25. mov cx,actlen ;Счётчик элементов строки
  26. mov si,0 ;Инициализация указателя элементов строки
  27. filter:
  28. mov si,0
  29. mov al,buf[si] ;Возьмём символ
  30. cmp al,'a' ;Меньше 'a'?
  31. jb nolet ;Да, не преобразовывать
  32. cmp al,'z' ;Больше 'z'?
  33. ja nolet ;Да, не преобразовывать
  34. sub al,20h ;Преобразуем в прописную
  35. mov Buf[si],al ;Отправим в Buf
  36. nolet:
  37. inc si
  38. loop filter ;Цикл
  39. mov ah,40h ;Функция вывода
  40. mov bx,stdout
  41. mov cx,[actlen] ;Длина сообщения
  42. mov dx,offset Buf ;Адрес сообщения
  43. int 21h
  44. Exit:
  45. mov ax,4Ch ;Функция DOS 4Сh: выход из программы
  46. int 21h ;Вызов DOS. Останов
  47. END Start ;Конец программы/точка входа
она не работает, помогите пожалуйста найти и поправить ошибку?

Решение задачи: «Перевод символов или строки»

textual
Листинг программы
  1. org 100h
  2. jmp start
  3.  
  4. mes1  db  13,10,'Input string: $'
  5. mes2  db  13,10,'      Result: $'
  6. buff  db  80 dup('$')
  7.  
  8. start:
  9.    mov   ah,9
  10.    mov   dx,mes1
  11.    int   21h
  12. ;=======================================================
  13.    mov   di,buff
  14.    mov   ah,1
  15. filter:
  16.    int   21h
  17.    cmp   al,13
  18.    je    print
  19.    cmp   al,'A'               ;Меньше 'A'?
  20.    jb    nolet                ;Да, не преобразовывать
  21.    cmp   al,'Z'               ;Больше 'Z'?
  22.    ja    nolet                ;Да, не преобразовывать
  23.    add   al,20h
  24. nolet:
  25.    stosb
  26.    jmp   filter
  27. ;======================================================
  28. print:
  29.    mov   ah,9
  30.    mov   dx,mes2
  31.    int   21h
  32.    mov   dx,buff
  33.    int   21h
  34.  
  35.    xor   ax, ax        ;
  36.    int   16h           ;
  37.    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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут