Удаление символов из строки - Assembler

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

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

Доброго времени суток! Есть код(см. ниже) который удаляет каждое вхождение заданной буквы(символа). Как переписать что-бы удалить каждое вхождение двух разных букв? А лучше объясните, пожалуйста, как работает код с 20-й по 39 строчку. Буду признателен! Код программы:
Листинг программы
  1. data segment
  2. string db 'asdfhfdafafafsdfdfhdafdsfdnfbkjbajdfasfa',0ah,'$'
  3. l dw $ - string
  4. data ends
  5. code segment
  6. assume cs:code,ds:data
  7. start:
  8. mov ax,data
  9. mov ds,ax
  10. lea dx,string ;вывод на экран строки до обработки
  11. mov ah,9
  12. int 21h
  13. mov dx,30h
  14. lea di,string
  15. mov cx,l
  16. n:
  17. cmp byte ptr [di],'a' ;собственно здесь указан искомый символ.
  18. jne nn
  19. ;если найден искомый символ то перезапишем строку, без этого символа.
  20. mov si,di
  21. inc si
  22. push di
  23. push cx
  24. inc cx
  25. m:
  26. mov al,byte ptr [si]
  27. mov byte ptr [di],al
  28. inc si
  29. inc di
  30. loop m
  31. pop cx
  32. pop di
  33. nn:
  34. inc di
  35. loop n
  36. lea dx,string ;вывод после обработки
  37. mov ah,9
  38. int 21h
  39. mov ah,4ch
  40. int 21h
  41. code ends
  42. end start

Решение задачи: «Удаление символов из строки»

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

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


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

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

7   голосов , оценка 4.143 из 5

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

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

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