大学要求我用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
1条答案
按热度按时间e37o9pze1#
最好将 str1l 和 str2l 字段写为0。
在 all_string 循环结束时,您当前显示的是“not found”消息。新代码必须根据新计数器中的值来显示此消息。
下一个修正将帮助你继续前进,尽管还有改进的空间。例如,“WWQQQW”将算作1发现还是2发现?显示实际的发现数量而不是盯着调试器的输出怎么样?