assembly 计算子字符串在字符串中出现的次数

pbpqsu0x  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(113)

大学要求我用x86汇编语言编写代码,计算一个子串在一个字符串中包含多少次,比如字符串“QWWQQWWQQW”包含子串“QQ”多少次,计数代码必须在一个子程序中。
我知道你可以找出一个子串是否包含在一个repe cmpsb的字符串中,但是你怎么做一个计数器呢?

data segment
msg1    DB  "Enter string: $"
msg2    DB  0Ah, 0Dh, "Enter substring to find: $"
msg3    DB  0Ah, 0Dh, "Yes!$"
msg4    DB  0Ah, 0Dh, "No such substring$"
 
str1ml  DB  200
str1l   DB  '$'
str1    DB  200 dup('$')
 
str2ml  DB  200
str2l   DB  '$'
str2    DB  200 dup('$')
data ends
code segment
assume cs:code, ds:data
start:
    mov ax, data
    mov ds, ax
    mov es,ax
    xor ax,ax
 
    lea dx, msg1    
    call    strout
 
    lea dx, str1ml  ;input string str1

    call    strin
 
    lea dx, msg2    
    call    strout
 
    lea dx, str2ml  ;input string str1

    call    strin
 
    xor cx, cx
    mov cl, str1l   
    sub cl, str2l
    inc cl
    cld         
    lea di, str2    ;in di - the string to be found
    lea si, str1    ;in si - the string in which we are looking for
    xor ax, ax
    call mainp
 
 
quit:
    mov     ah, 4ch     
    int 21h
 
 
;*****************Procedures***********************
 
;*************************************************
strin   proc
    mov ah, 0Ah
    int 21h
    ret
strin   endp
;*************************************************
strout  proc
    mov ah, 09h
    int 21h
    ret
strout  endp
;*************************************************
mainp proc
all_string:         
    
    push    cx
    push    di
    push    si
    mov bx, si
    mov cl, str2l
    repe cmpsb
    je  _eq
    jne _neq
_eq:
    lea dx, msg3    
    call    strout
    jmp quit
_neq:
    pop si
    pop di
    pop cx
    inc si
loop    all_string
lea dx, msg4
call    strout
jmp quit    
mainp endp
code ends
end start
e37o9pze

e37o9pze1#

str1ml  DB  200
str1l   DB  '$'
str1    DB  200 dup('$')

str2ml  DB  200
str2l   DB  '$'
str2    DB  200 dup('$')

最好将 str1lstr2l 字段写为0。

  • mainp* 过程在第一次发现结果为正时停止。现在不停止,而是增加一个计数器并继续循环。

all_string 循环结束时,您当前显示的是“not found”消息。新代码必须根据新计数器中的值来显示此消息。
下一个修正将帮助你继续前进,尽管还有改进的空间。例如,“WWQQQW”将算作1发现还是2发现?显示实际的发现数量而不是盯着调试器的输出怎么样?

mainp proc
    xor  bx, bx     ; Counter=0
all_string:         
    push cx
    push di
    push si
    mov  cl, str2l  ; CH=0
    repe cmpsb
    jne  _neq
    inc  bx         ; Counter++
_neq:
    pop  si
    pop  di
    pop  cx
    inc  si
    loop all_string

    lea  dx, msg4     ; 'Not found'
    test bx, bx
    jz   _None
    lea  dx, msg3     ; 'Yes'  (Count is in BX)
_None:
    call strout
    ret   
mainp endp

相关问题