Процедура Insert в ассмблере - Assembler
Формулировка задачи:
Здрасьте! Вот, дали задание: составить внешнюю подпрограмму procedure Insert(SubS: string; var S:string; Start:byte).
Вставляет подстроку SubS в строку S, начиная с позиции Start. Если Start, больше длины S, то ничего не изменяется
Я написал на паскали как бы подпрограмму, где есть необходимая процедура Insert. паскаль здесь считывает файл, созданный ассемблером, но результат не выводит
А вот собственно и сам код на ассемблере, но кажется, что саму процедуру надо описать и здесь, но я не знаю как:-(
Вобщем, помогите, кто как сможет
{$F+} {$L demo.obj} procedure Insert(SubS:string;var S:string; Start:byte); external; var S,SubS: string; P: byte; begin write('Vvod stroki: '); readln(S); write('Chto vstavlyat: '); readln(SubS); write('Ї®§ЁжЁп: '); readln(P); Insert(SubS,S,P); Writeln(S); end.
code segment public assume cs:code public insert insert proc far push bp mov bp,sp pop bp ret 10 insert endp code ends end
Решение задачи: «Процедура Insert в ассмблере»
textual
Листинг программы
code segment byte public assume cs:code,ds:code public Change ; function Change(S: string; Ch1, Ch2: char): ;string, возвращает строку, в которой все вхождения ;Сh1 заменены на Ch2 Change proc far ; адреса параметров в стеке: Ch2 equ byte ptr [bp+6] ; параметр Ch2 Ch1 equ byte ptr [bp+8] ; параметр Ch1 S equ dword ptr [bp+10]; адрес строки S Res equ dword ptr [bp+14]; адрес строки ; результата push bp ; сохранение bp mov bp,sp ; настройка bp на вершину ; стека push ds ; сохранение ds les di,Res ; es:di:=адрес результата lds si,S ; 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,Ch1; символ равен Ch1? jne Save; нет, сохранить без изменений mov al,Ch2 ; да, заменить на Ch2 Save: stosb; записать очередной символ результата Res loop Repeat ; повторять, пока есть ; символы в S (cx>0) Exit: pop ds ; восстановить ds pop bp ; восстановить bp ret 8; выход с удалением параметров Ch1, ; Ch2 и адреса S (Res удалять нельзя!) Change endp code ends end
Объяснение кода листинга программы
В коде представлена процедура под названием Change, которая принимает три параметра: S (строка, в которой необходимо выполнить замену), Ch1 (символ, который необходимо заменить) и Ch2 (символ, на который необходимо заменить). Процедура работает следующим образом:
- Создается стек для хранения параметров.
- Начинается обработка строки S.
- Переменная Res инициализируется как пустая строка, которая будет хранить результат.
- Устанавливаются начальные значения счетчиков ch и cl.
- Если длина строки S равна нулю, то процедура завершается.
- Если очередной символ строки S не равен Ch1, то он копируется в результат без изменений.
- Если очередной символ строки S равен Ch1, то он заменяется на Ch2.
- После обработки всех символов строки S, результат возвращается. В результате выполнения процедуры Change в переменной Res будет содержаться строка, в которой все вхождения символа Ch1 будут заменены на символ Ch2.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д