Перевод первой и последней букв строки в заглавные, а остальных - в строчные - Assembler

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

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

Программа в принципе работает, она переводит первую и последнюю буквы строки в заглавные, а остальные в строчные. Но почему-то выводит результат с пробелом(на скрине видно). Подскажите как можно исправить. .EXE файл. Пишу в EMU8086
 .MODEL    tiny    
    org 100h
.DATA
PROMPT    DB    'Input string', 0DH, 0AH, '$'
 
INPUTBUFER    LABEL    BYTE
MAXLEN    DB    79+1
LEN    DB    ?
STRIN    DB    79 DUP (?), ?, ?, ?
.CODE
MAIN    PROC    FAR
MOV    AX,@DATA    ;инициализация
    MOV    DS,AX
    MOV    AH,09H    ;Вывод приглашения "Input string"
    LEA    DX,PROMPT
    INT    21H
 
    MOV    AH,0AH    ;Ввод строки
    LEA    DX,INPUTBUFER
    INT    21H
 
    MOV    AH,02H    ;Перевод строки на экране
    MOV    DL,0AH    ;   (после ввода функциией 0AH был выведен
    INT    21H    ;   только символ 0DH)
 
    CMP    LEN,0    ;Если была введена пустая строка, то выход
    JE    EXIT
            ;Преобразование строки:
    LEA    BX,STRIN    ;Загрузить в BX адрес первого символа
    CALL    UCASE; PASCAL, BX    ;Преобразовать его к строчному
    INC    BX    ;Перейти к следующему символу
    MOV    CL,LEN    ;Инициализация цикла: Счётчик CX равен длина
    DEC    CL    ;   строки минус 2. Минус 2 потому как не
    DEC    CL    ;   преобразуется первый и последний.
CIRCLE1:    CALL    LCASE; PASCAL, BX    ;Цикл: преобразовать текущий символ к заглавному
    INC    BX    ;и перейти к следующему
    LOOP    CIRCLE1    ;Повторить
    CALL    UCASE ;PASCAL, BX    ;Преобразовать текущий (последний) симв. к строчному.
 
    MOV    WORD PTR [BX+2], 240AH    ;В конце строки поставить символы перевода и конца строки
    MOV    AH,09H    ;Вывод строки (результата)
    LEA    DX,STRIN
    INT    21H
            ;Выход:
EXIT:    MOV    AH,07H    ;Ждать нажатия любой клавиши
    INT    21H
 
    MOV    AX,4C00H    ;Завершение работы программы
    INT    21H
MAIN    ENDP
 
    ;===Подпрограммы===
 
;Функция LCASE. Преобразует латинский символ в строчной.
;Функции передаётся 1 аргумент: слово, являющеесе адресом
;   (относительно DS) символа, который преобразуется. 
LCASE    PROC    NEAR
;    PUSH    BP
;   MOV    BP,SP
    PUSH    AX 
    push    BX    ;Сохранить регистры
;    MOV    BX,[BP+4]    ;Загрузить в BX первый аргумент (адрес символа)
    MOV    AL,[BX]    ;Загрузить в AL символ
    CMP    AL,41H    ;Если код символа меньше 41H
    JB    LDONOT
    CMP    AL,5AH    ;   или больше 5AH, то выход
    JA    LDONOT
    XOR    AL,00100000B    ;иначе: инвертировать 5-ый бит.
    MOV    [BX],AL    ;Загрузить преобразованный символ в адр. из 1-ого арг.
LDONOT:    POP    BX 
    pop AX; BP    ;Восстановить регистры
    RET        ;Выход
LCASE    ENDP
 
;Функция UCASE. Преобразует латинский символ в заглавный.
;Функции передаётся 1 аргумент: слово, являющеесе адресом
;   (относительно DS) символа, который преобразуется. 
UCASE    PROC    NEAR
;    PUSH    BP
;    MOV    BP,SP
    PUSH    AX 
    push    BX    ;Сохранить регистры
;    MOV    BX,[BP+4]    ;Загрузить в BX первый аргумент (адрес символа)
    MOV    AL,[BX]    ;Загрузить в AL символ
    CMP    AL,61H    ;Если код символа меньше 61H
    JB    UDONOT
    CMP    AL,7AH    ;   или больше 7AH, то выход
    JA    UDONOT
    XOR    AL,00100000B    ;иначе: инвертировать 5-ый бит.
    MOV    [BX],AL    ;Загрузить преобразованный символ в адр. из 1-ого арг.
UDONOT:    POP    BX
    pop AX; BP    ;Восстановить регистры
    RET        ;Выход
UCASE    ENDP
 
    END    MAIN

Решение задачи: «Перевод первой и последней букв строки в заглавные, а остальных - в строчные»

textual
Листинг программы
org  100h
jmp  start
 
hello  db  13,10,'String: $'
bye    db  13,10,'Result: $'
buff   db  80 dup('$')
 
start:
   mov   ah,9             ;
   mov   dx,hello         ;
   int   21h              ;
 
   mov   di,buff          ;
   xor   cx,cx            ; длина строки
input:                    ;
   mov   ah,1             ;
   int   21h              ;
   cmp   al,13            ; Enter заканчивает ввод
   je    print            ;
   cmp   al,41h           ; цифры не трогаем
   jb    miss             ;
   or    al,20h           ; переводим все символы в нижний регистр
miss:                     ;
   inc   cx               ; считаем длину строки
   stosb                  ; ..и записываем всё в буфер
   jmp   input            ;
 
print:                    ;
   dec   cx               ;
   dec   di               ; вернёмся к последнему символу
   and   byte[di],0DFh    ; перевод в вержний регистр
   sub   di,cx            ; идём в начало строки
   and   byte[di],0DFh    ;
   mov   ah,9             ; выводим мессагу
   mov   dx,bye           ;
   int   21h              ;
   mov   dx,buff          ; ..и строку из буфера
   int   21h              ;
 
exit:                     ;
   xor   ax,ax            ;
   int   16h              ;
   int   20h              ;' выход в DOS...

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


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

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

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