Вставка подстроки в строку (раздельная компиляция Turbo Pascal и TASM) - Assembler/TASM
Формулировка задачи:
В общем, было вот задание написать код в ассемблере и паскале, который будет выполнять следующую функцию:
18. procedure Insert(SubS: string; var S:string; Start:byte). Вставляет подстроку SubS в строку S, начиная с позиции Start. Если Start, больше длины S, то ничего не изменяется. Я написал код и там, и там. прога работает без ошибок, но выполняется лишь часть задуманного. сумел реализовать фичу, где если start>длины SubS , то ничего не меняется. Также написал код, где должна выполняться вставка подстроки S в SubS на разрешенную позицию, но код немного неверный. Помогите, пожалуйста, исправить, ну или переписать код, я не знаю, как исправить that shit. Спасибо Ассемблерский код:code segment byte public assume cs:code public SInsert SInsert proc far push bp push ds mov bp, sp lds si, [bp+10] ; si - object string xor dx,dx xor cx, cx lodsb mov cl, al mov dl, [bp+8] ; DL=pos cmp dl, cl ja $end_ins les di, [bp+14] ; address of target string mov bl, es:[di] ; get current length of target string inc di add al,bl mov [si-1],al add si,dx ;adress 1 push si push di mov di,si add di,bx ; adress 2 sub cx,dx push ds pop es rep movsb mov cl,bl pop si ; istochnik podstroka pop di ; priemnik stroka rep movsb $end_ins: pop ds ; restore TURBO-Pascal data segment pop bp ; restore TURBO-Pascal frame pointer ret 10 ; return and pop parameters SInsert endp code ends end
{$F+} {$L laba3.obj} procedure SInsert(SubS:string;var S:string;Start:byte); external; var S,SubS:string; P:byte; begin write('vvod stroki: '); readln(S); write('vstavlyaemaya stroka: '); readln(SubS); write('posiciya: '); readln(P); SInsert(SubS,S,P); Writeln(S); end.
Решение задачи: «Вставка подстроки в строку (раздельная компиляция Turbo Pascal и TASM)»
textual
Листинг программы
program string6; uses crt; procedure SInsert(SubS: string; var S: string; Start: word); far; external; {$L SIns.obj} var stroka1, stroka2: string; len1, len2, nomer: integer; begin clrscr; stroka1 := 'abcdefgh'; stroka2 := '1234'; writeln(stroka1); writeln(stroka2); SInsert(stroka2, stroka1, 3); writeln(stroka1); writeln(stroka2); end.
Объяснение кода листинга программы
Код выполняет вставку подстроки в строку с помощью функции SInsert. Список действий:
- Объявление переменных:
- stroka1, stroka2: string;
- len1, len2, nomer: integer;
- Инициализация строк:
- stroka1 := 'abcdefgh';
- stroka2 := '1234';
- Вывод на экран исходных строк:
- writeln(stroka1);
- writeln(stroka2);
- Вставка подстроки с помощью функции SInsert:
- SInsert(stroka2, stroka1, 3);
- Вывод на экран измененной строки:
- writeln(stroka1);
- Вывод на экран неизменной строки:
- writeln(stroka2); Функция SInsert принимает три параметра:
- SubS: подстрока, которую необходимо вставить;
- S: строка, в которую необходимо вставить подстроку;
- Start: смещение от начала строки, где необходимо начать вставку. В данном случае, подстрока '1234' вставляется в строку 'abcdefgh' с 3-го символа.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д