Нужно написать проверочный код на ассемблере для Insert, не знаю как сделать - Assembler

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

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

Без понятия, как написать проверочную прогу на ассемблере для процедуры Insert (вставка подстроки в строку на заданную позицию) . код прилагаю: laba3.asm
CODE         SEGMENT BYTE PUBLIC
 
             ASSUME  CS:CODE

             PUBLIC  SInsert
SInsert      PROC    FAR
             PUSH    BP                ; save TURBO-Pascal framepointer
             PUSH    DS                ; save TURBO-Pascal data segment
             MOV     BP, SP            ; make new framepointer
             LDS     SI, [BP+16]       ; address of object string
             XOR     CX, CX            ; clear msb of length of object string
             OR      CL, [SI]          ; get length of object string
             JZ      $end_ins          ; exit, if length of object string zero
             MOV     DX, [BP+8]        ; DX=pos
             MOV     AX, [BP+10]       ; AX=maximum length of target string
             LES     DI, [BP+12]       ; address of target string
             MOV     BL, ES:[DI]       ; get current length of target string
             MOV     BH, CH            ; clear msb of length of target string
                         cmp     bx, dx
             jb $end_ins
             DEC     DX                ; pos - 1
             CMP     DH, 80h           ; is pos-1 < 0 ?
             SBB     BP, BP            ; BP = FFFF if pos-1 > 0, else BP = 0
             AND     DX, BP            ; if pos-1 < 0 then set pos-1 = 0 (pos=1)
             SUB     DX, BX            ; pos-1 - targetlength
             SBB     BP, BP            ; BP = FFFF, if result negative, else 0
             AND     DX, BP            ; pos-1 - targetlength (0, if res. pos)
             ADD     DX, BX            ; pos-1, if result neg., else target len.
             MOV     BP, AX            ; maximum length of target string
             SUB     BP, DX            ; (maximum length - pos + 1) <= 0 ?
             JBE     $end_ins          ; yes, don't insert
             SUB     BP, CX            ; maximum length - pos + 1 - objectlength
             CLD                       ; select auto-increment
             JA      $make_gap         ; jump, if result positiv
             STOSB                     ; new targetlength will be maximum length
             ADD     CX, BP            ; adjust length of object string
             ADD     DI, DX            ; object string inserted after this char
             JMP     $fill             ; insert object
$make_gap:   MOV     DX, CX            ; save length of object string
             ADD     CX, BX            ; new targetlength = objectlen+targetlen
             SUB     CX, AX            ; new targetlength - maximum length
             SBB     BX, BX            ; BX=FFFF, if result negative, else BX=0
             AND     CX, BX            ; new targetlength - maximum length
             ADD     AX, CX            ; new targetlength = Min(TargLen, MaxLen)
             STOSB                     ; store it
             DEC     DI                ; correct pointer
             ADD     CX, BP            ; new targetlength - objectlength - pos+1
             ADD     DI, AX            ; this will be the last char in target
             XCHG    AX, SI            ; save offset of adress of object string
             MOV     SI, DI            ; now calculate
             SUB     SI, DX            ;  the starting position
             PUSH    DS                ; save segment of address of objectstring
             MOV     BX, ES            ; let both segment register point
             MOV     DS, BX            ; to the segment containing targetstring
             STD                       ; auto-decrement
             REP     MOVSB             ; create gap
             MOV     DI, SI            ; object will be inserted after this char
             MOV     CX, DX            ; get length of object string
             MOV     SI, AX            ; get offset of address of object string
             POP     DS                ; get segment of address of object string
             INC     DI                ; object string will be inserted here
             CLD                       ; auto-increment
$fill:       INC     SI                ; first char of object string
             SHR     CX, 1             ; number of chars to move odd ?
             JNC     $even_ins         ; no
             MOVSB                     ; yes, move a single byte
$even_ins:   REP     MOVSW             ; move the rest
$end_ins:    POP     DS                ; restore TURBO-Pascal data segment
             POP     BP                ; restore TURBO-Pascal frame pointer
             RET     12                ; return and pop parameters
SInsert      ENDP
 
             ALIGN   4
 
CODE         ENDS
 
             END
laba3.pas
{$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.
Помогите, пожалуйста, завтра сдавать надо, а я сам никак не сделаю

Решение задачи: «Нужно написать проверочный код на ассемблере для Insert, не знаю как сделать»

textual
Листинг программы
var
  s1, s2: string;
.......
  s1:=s;
  s2:=s;
  SInsert(SubS,s1,P);
  Insert(SubS,s2,P);
  if s1=s2 then
    writeln('Ok')
  else
    writeln('ploho');

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

В данном коде:

  1. Объявлены две переменные типа string: s1 и s2.
  2. Значение переменной s1 присваивается переменной s.
  3. Значение переменной s2 присваивается переменной s.
  4. Вызывается функция SInsert с аргументами SubS, s1, P.
  5. Вызывается функция Insert с аргументами SubS, s2, P.
  6. Если s1 равно s2, то выводится Ok.
  7. Если s1 не равно s2, то выводится ploho.

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


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

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

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