Изменить регистр букв на противоположный используя инструкцию scas - Assembler/FASM

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

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

В общем пользователь вводит строку. Требуется изменить регистр букв на противоположный. Без процедуры scas получилось примерно так. Но надо обязательно с ней. Знатоки, выручайте!
        org     100h
        jmp     start
 
;------------------------
str3    db      'Result : $'
buff    db      80 dup('$')
ent     db      10,13,'$'
;------------------------
start:
        mov     di,buff  ;приемник для buff
 
@input:
        mov     ah,1     ;Запрос на ввод символа
        int     21h
        cmp     al,13    ;Enter - закончить ввод
        je      print
        test    al,20h   ;проверяем бит в веденной строке
        jnz     small    ;если строчная буква
        or      al,20h   ;Если заглавная, то меняем на строчную
        stosb            ;сохраняем в буфер
        jmp     @input   ;следующий символ
 
small:
        and     al,$0DF   ;Меняем на заглавную
        stosb             ;сохраняем в буфер
        jmp     @input    ;следующий символ

print:
        mov     ah,9
        mov     dx,str3   
        int     21h
 
        mov     dx,buff   ;выводим содержимое буфера
        int     21h
 
exit:
        mov     ah,$08
        int     21h
        ret

Решение задачи: «Изменить регистр букв на противоположный используя инструкцию scas»

textual
Листинг программы
............
   BigChar db 'AZ'
  SmallChar db 'az'
........
   mov si, buff
@input:
        mov     ah,1     ;Запрос на ввод символа
        int     21h
        cmp     al,13    ;Enter - закончить ввод
        je      print
        mov di, BigChar
        scasb
        jb      small
        scasb
        ja small
 
здесь преобразование в маленькую букву
 
        mov [bx], al
        inc bx            ;сохраняем в буфер
        jmp     @input   ;следующий символ
 
small:
        scasb
        jb      store
        scasb
        ja store
 
здесь преобразование в большую букву
 
store:
        mov [bx], al
        inc bx            ;сохраняем в буфер
        jmp     @input    ;следующий символ

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

В этом коде на языке Assembler преобразуют введённые символы в противоположный регистр — строчные буквы становятся заглавными, а заглавные — строчными. Список действий:

  1. Указывают на буфер для хранения введённых символов — переменная buff.
  2. Передают в качестве регистра ввода — ah=1, для вывода — dl=13 (Enter).
  3. Происходит ввод одного символа.
  4. Если введённый символ — Enter, то переходят к функции вывода.
  5. Передают в качестве регистра сравнения — al, в качестве памяти — BigChar, для строчных букв — SmallChar.
  6. Начинают процесс сравнения строк.
  7. Если первая и последняя буквы сравниваемых строк совпадают, то происходит преобразование в противоположный регистр.
  8. Происходит сохранение в буфер.
  9. Переходят к следующей итерации ввода.
  10. Если введённый символ не является Enter, то переходят к функции преобразования в противоположный регистр.
  11. Происходит сохранение в буфер.
  12. Переходят к следующей итерации ввода.

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

9   голосов , оценка 3.889 из 5
Похожие ответы