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

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

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

Доброго времени суток! Есть код(см. ниже) который удаляет каждое вхождение заданной буквы(символа). Как переписать что-бы удалить каждое вхождение двух разных букв? А лучше объясните, пожалуйста, как работает код с 20-й по 39 строчку. Буду признателен! Код программы:
data segment
               string db 'asdfhfdafafafsdfdfhdafdsfdnfbkjbajdfasfa',0ah,'$'
               l    dw $ - string
data ends
 
code segment
assume cs:code,ds:data
start:
    mov ax,data
    mov ds,ax
    
    lea dx,string                      ;вывод на экран строки до обработки
    mov ah,9
    int 21h 
    
    mov dx,30h
    lea di,string
    mov cx,l
n:
    cmp byte ptr [di],'a'                    ;собственно здесь указан искомый символ.
    jne nn
 
;если найден искомый символ то перезапишем строку, без этого символа.
        mov si,di
        inc si
        push di
        push cx
        inc cx
        m:
            mov al,byte ptr [si]
            mov byte ptr [di],al
            inc si
            inc di
            loop m
            pop cx
            pop di
nn:
    inc di
    loop n
    
    lea dx,string                            ;вывод после обработки
    mov ah,9
    int 21h 
        
    mov ah,4ch
    int 21h
code ends
end start

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

textual
Листинг программы
; *******************************************************
; *                                                     *
; *     Turbo Pascal Runtime Library Version 7.0        *
; *     String Pos Function                             *
; *                                                     *
; *     Copyright (C) 1990-1993 Norbert Juffa           *
; *                                                     *
; *******************************************************
 
             TITLE   STPOS
 
 
CODE         SEGMENT BYTE PUBLIC
 
             ASSUME  CS:CODE
 
; Publics
 
             PUBLIC  SPos
 
;-------------------------------------------------------------------------------
; Pos standard function: Pos (VAR Obj, Target: STRING): BYTE
;
; Pos searches the string Target for the first occurence of a string Obj. If Obj
; is found in Target, the index at which the first character of Obj appears in
; Target is returned. If Obj is not found in Target, zero is returned. The
; routine searches the first character of Obj in the first Len(Target)-Len(Obj)
; charcters of Target. Whenever there is a match, the following characters of
; Target are compared to the characters in Obj. If all characters match, Obj has
; been succesfully found in Target.
;
; On entry:  [SP+4] Address of Target
;            [SP+8] Address of Obj
;
; On exit:   AX     index at which Obj first found in Target (0 if not found)
;-------------------------------------------------------------------------------
 
SPos         PROC    FAR
             CLD                       ; auto-increment for string instructions
             PUSH    DS                ; save TURBO-Pascal data segment
             PUSH    BP                ; save TURBO-Pascal's frame pointer
             MOV     BP, SP            ; make new frame pointer
             LES     DI, [BP+8]        ; address of target string
             LDS     SI, [BP+12]       ; address of object string
             MOV     AX, [SI]          ; AL=length of object, AH=1. char of obj.
             INC     SI                ; adjust
             INC     SI                ;  string pointer
             XOR     CH, CH            ; init result
             DEC     AX                ; length - 1 (changes AH only when AL=0)
             MOV     CL, ES:[DI]       ; length of target string
             SUB     CL, AL            ; targetlength <= objectlength - 1 ?
             JBE     $not_found        ; yes, object not found
             MOV     BH, CL            ; save length of target string
             INC     DI                ; first char of target string
             XCHG    AL, AH            ; AL=1. char of object, AH=length of obj.
             MOV     BP, SI            ; save offset into object
$search:     REPNZ   SCASB             ; scan target string for 1. char of obj.
             JNZ     $not_found        ; exit, if not found
             MOV     BL, CL            ; save remaining length of target string
             MOV     CL, AH            ; number of char to be compared
             MOV     DX, DI            ; save offset into target string
             REPZ    CMPSB             ; compare remaining char of target & obj.
             MOV     SI, BP            ; restore offset into object string
             MOV     DI, DX            ; restore offset into target string
             MOV     CL, BL            ; restore remaining length of target str
             JNZ     $search           ; cont. search, if not all chars matched
             SUB     BH, BL            ; Pos = targetlength - remain. targetlen.
             MOV     CH, BH            ; Pos
$not_found:  POP     BP                ; restore TURBO-Pascal's frame pointer
             POP     DS                ; restore TURBO-Pascal data segment
             MOV     AL, CH            ; Pos
             XOR     AH, AH            ; clear msb
             RET     8                 ; return and pop parameters
SPos         ENDP
 
             ALIGN   4
 
CODE         ENDS
 
             END

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


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

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

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