Внешняя подпрограмма перевода заглавных букв в строчные - Assembler

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

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

Ассемблер начал изучать недавно, вроде написал правильно но не работает. В голову ничего здравого не приходит, поэтому обращаюсь к вам. Задание. Необходимо написать внешнюю функцию на ассемблере LoCase(S:string):string, возвращающая строку, в которой все прописные латинские буквы заменены на строчные.
code segment byte public 
     assume cs:code,ds:code
     public LoCase
     
LoCase proc near
;адреса параметров в стеке
varC equ dword ptr[bp+4]; адрес параметра строки
Res equ dword ptr[bp+6] ; адрес строки результата
push bp        ;сохранение bp
mov bp,sp      ;настройка bp на вершину стека
push ds        ;сохранение ds
les di,Res     ; es:di:=адрес результата
lds si,varC    ;ds:si:=адрес исходной строки
cld            ; очистка флага направления 
lodsb          ;al:=(ds:[si]), si:=si+1 (al - длина S)
stosb          ; (es:[di]):=al, di:di+1 (запись длины)
mov ch,0       ; подготовка сх в качестве счетчика
mov cl, al     ; количества сиволов строки S
jcxz Exit      ; выход, если S - пустая строка (сх=0)
Repeat:
  lodsb        ;считать в al очередной символ S
   cmp al,'A'  ; символ меньше "A" 
   jb Save     ; да, сохранить
   cmp al,'Z'  ;символ больше "Z"
   ja Save     ; да сохранить
   add al,20h  ; перевод: прописная в строчную
   loop Save   ; сохранить
 Save: 
  stosb ;записать очередной символ результата Res
  loop Repeat ;повторять, пока есть символы в S (cx>0)
Exit: pop ds ;восстановить ds
pop bp ;восстановить bp
ret 4 ;выход с удалением параметров
LoCase endp
code ends
end

Решение задачи: «Внешняя подпрограмма перевода заглавных букв в строчные»

textual
Листинг программы
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
.286
Begin:
Poisk:
    pusha
    pushf
    lea si,String
    xor bp,bp
    xor bx,bx
    xor ax,ax
poisk2:    
    lodsb
    cmp al,0
    jz poisk2
    cmp al,24h
    jz exit
    cmp al,20h
    jz poisk2
    mov bx,5Bh
    cmp ax,bx
    jae poisk2
    mov bx,40h
    cmp ax,bx
    jbe poisk2
    mov bp,si
    dec bp
    add al,20h
    mov byte ptr cs:[bp],al 
    jmp poisk2
exit:
    popf
    popa
 
       mov ah,9
       lea dx,String
       int 21h
 
       mov ah,10h
       int 16h
 
       ret
 
String db ' pG aJ HSDFGHJKLOI    ,$'
 
CSEG ends
end Begin

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

В этом коде реализуется функция перевода строки из регистра pG aJ HSDFGHJKLOI, возможно, с использованием внешнего кода, который не представлен. Вот список действий, которые происходят в коде:

  1. Функция начинается с сохранения регистров и сегментов стека.
  2. Затем происходит инициализация регистров для работы с подстрокой.
  3. Далее, основной цикл обработки строки начинается с проверки наличия символа в регистре AX.
  4. Если символ не равен нулю, то выполняется проверка на наличие символа в регистре BX.
  5. Если символ равен 20h (заглавная буква), то выполняется перевод в регистре BX.
  6. Если символ не равен 20h, то выполняется проверка на наличие символа в регистре BX.
  7. Если символ равен 24h (знак доллара), то выполняется перевод в регистре BX и переход к обработке следующего символа.
  8. Если символ не равен 24h, то выполняется перевод в регистре BX.
  9. После обработки всех символов в строке, происходит возврат в основную программу.
  10. Затем регистры AX и BX используются для вывода строки.
  11. Функция завершается с возвратом в основную программу. Обратите внимание, что код написан для работы с 16-битным процессором и использует сегментный режим работы.

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


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

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

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