Внешняя подпрограмма перевода заглавных букв в строчные - 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
, возможно, с использованием внешнего кода, который не представлен. Вот список действий, которые происходят в коде:
- Функция начинается с сохранения регистров и сегментов стека.
- Затем происходит инициализация регистров для работы с подстрокой.
- Далее, основной цикл обработки строки начинается с проверки наличия символа в регистре AX.
- Если символ не равен нулю, то выполняется проверка на наличие символа в регистре BX.
- Если символ равен 20h (заглавная буква), то выполняется перевод в регистре BX.
- Если символ не равен 20h, то выполняется проверка на наличие символа в регистре BX.
- Если символ равен 24h (знак доллара), то выполняется перевод в регистре BX и переход к обработке следующего символа.
- Если символ не равен 24h, то выполняется перевод в регистре BX.
- После обработки всех символов в строке, происходит возврат в основную программу.
- Затем регистры AX и BX используются для вывода строки.
- Функция завершается с возвратом в основную программу. Обратите внимание, что код написан для работы с 16-битным процессором и использует сегментный режим работы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д