Процедур обработки строк Insert, Delete, Pos - Assembler

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

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

Реализовать на языке ассемблера набор процедур обработки строк из системы Turbo Pascal, спасибо 1. Delete(S, p, i). Удалить из строки S i символов начиная с позиции p; 2. Insert(S1, S2, p). Вставить подстроку S1 в строку S2 начиная с позиции p; 3. Pos(S1, S2). Найти номер позиции, с которой начинается подстрока S1 в строке S2;

Решение задачи: «Процедур обработки строк Insert, Delete, Pos»

textual
Листинг программы
  1. ; *******************************************************
  2. ; *                                                     *
  3. ; *     Turbo Pascal Runtime Library Version 7.0        *
  4. ; *     String Pos Function                             *
  5. ; *                                                     *
  6. ; *     Copyright (C) 1990-1993 Norbert Juffa           *
  7. ; *                                                     *
  8. ; *******************************************************
  9.  
  10.              TITLE   STPOS
  11.  
  12.  
  13. CODE         SEGMENT BYTE PUBLIC
  14.  
  15.              ASSUME  CS:CODE
  16.  
  17. ; Publics
  18.  
  19.              PUBLIC  SPos
  20.  
  21. ;-------------------------------------------------------------------------------
  22. ; Pos standard function: Pos (VAR Obj, Target: STRING): BYTE
  23. ;
  24. ; Pos searches the string Target for the first occurence of a string Obj. If Obj
  25. ; is found in Target, the index at which the first character of Obj appears in
  26. ; Target is returned. If Obj is not found in Target, zero is returned. The
  27. ; routine searches the first character of Obj in the first Len(Target)-Len(Obj)
  28. ; charcters of Target. Whenever there is a match, the following characters of
  29. ; Target are compared to the characters in Obj. If all characters match, Obj has
  30. ; been succesfully found in Target.
  31. ;
  32. ; On entry:  [SP+4] Address of Target
  33. ;            [SP+8] Address of Obj
  34. ;
  35. ; On exit:   AX     index at which Obj first found in Target (0 if not found)
  36. ;-------------------------------------------------------------------------------
  37.  
  38. SPos         PROC    FAR
  39.              CLD                       ; auto-increment for string instructions
  40.              PUSH    DS                ; save TURBO-Pascal data segment
  41.              PUSH    BP                ; save TURBO-Pascal's frame pointer
  42.              MOV     BP, SP            ; make new frame pointer
  43.              LES     DI, [BP+8]        ; address of target string
  44.              LDS     SI, [BP+12]       ; address of object string
  45.              MOV     AX, [SI]          ; AL=length of object, AH=1. char of obj.
  46.              INC     SI                ; adjust
  47.              INC     SI                ;  string pointer
  48.              XOR     CH, CH            ; init result
  49.              DEC     AX                ; length - 1 (changes AH only when AL=0)
  50.              MOV     CL, ES:[DI]       ; length of target string
  51.              SUB     CL, AL            ; targetlength <= objectlength - 1 ?
  52.              JBE     $not_found        ; yes, object not found
  53.              MOV     BH, CL            ; save length of target string
  54.              INC     DI                ; first char of target string
  55.              XCHG    AL, AH            ; AL=1. char of object, AH=length of obj.
  56.              MOV     BP, SI            ; save offset into object
  57. $search:     REPNZ   SCASB             ; scan target string for 1. char of obj.
  58.              JNZ     $not_found        ; exit, if not found
  59.              MOV     BL, CL            ; save remaining length of target string
  60.              MOV     CL, AH            ; number of char to be compared
  61.              MOV     DX, DI            ; save offset into target string
  62.              REPZ    CMPSB             ; compare remaining char of target & obj.
  63.              MOV     SI, BP            ; restore offset into object string
  64.              MOV     DI, DX            ; restore offset into target string
  65.              MOV     CL, BL            ; restore remaining length of target str
  66.              JNZ     $search           ; cont. search, if not all chars matched
  67.              SUB     BH, BL            ; Pos = targetlength - remain. targetlen.
  68.              MOV     CH, BH            ; Pos
  69. $not_found:  POP     BP                ; restore TURBO-Pascal's frame pointer
  70.              POP     DS                ; restore TURBO-Pascal data segment
  71.              MOV     AL, CH            ; Pos
  72.              XOR     AH, AH            ; clear msb
  73.              RET     8                 ; return and pop parameters
  74. SPos         ENDP
  75.  
  76.              ALIGN   4
  77.  
  78. CODE         ENDS
  79.  
  80.              END

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

  1. Объявление титула программы, указание версии и авторских прав.
  2. Объявление сегмента кода.
  3. Объявление и описание функции SPos, которая ищет первое вхождение строки Obj в строке Target.
  4. Инициализация переменных и регистров для начала поиска.
  5. Процесс сканирования строк, поиск первого символа строки Obj в строке Target.
  6. Сравнение оставшихся символов строк Target и Obj.
  7. Возврат результата поиска (индекс, где найдена строка Obj в строке Target, или 0, если не найдена).

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


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

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

14   голосов , оценка 4.286 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы