Процедура 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 (символ, на который необходимо заменить). Процедура работает следующим образом:

  1. Создается стек для хранения параметров.
  2. Начинается обработка строки S.
  3. Переменная Res инициализируется как пустая строка, которая будет хранить результат.
  4. Устанавливаются начальные значения счетчиков ch и cl.
  5. Если длина строки S равна нулю, то процедура завершается.
  6. Если очередной символ строки S не равен Ch1, то он копируется в результат без изменений.
  7. Если очередной символ строки S равен Ch1, то он заменяется на Ch2.
  8. После обработки всех символов строки S, результат возвращается. В результате выполнения процедуры Change в переменной Res будет содержаться строка, в которой все вхождения символа Ch1 будут заменены на символ Ch2.

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


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

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

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