【发布时间】:2021-11-03 12:04:41
【问题描述】:
我写了一个程序,接收一个字符串,然后我想搜索并显示字符串中l的字符数
显示号码(如果有); 0 如果不存在
程序的问题正是在search 循环中
程序的其余部分正常工作。我拿了字符串,但我无法搜索和显示结果。
我还从输出中放入了我想要的图像
请帮忙。我很困惑
m02 macro
mov ah,02
mov dl,al
int 21h
endm
m08 macro
mov ah,08
int 21h
endm
m09 macro str1
mov ah,09
mov dx,offset str1
int 21h
endm
m4c macro
mov ah,4ch
int 21h
endm
stk segment stack 'stack'
dw 32 dup(?)
stk ends
dts segment
p1 db 10,13,'Please enter you text:',10,13,'$'
p2 db 10,13,'Number of characters (L) in the your text: $'
string db 11 dup(?),'$'
newLine db 10,13,'$'
character db 0
dts ends
cds segment
assume cs:cds,ss:stk,ds:dts
main proc far
mov ax,seg dts
mov ds,ax
mov si,offset string
m09 p1
mov cx,11
tek: m08
mov byte ptr [si],al
inc si
m02
loop tek
mov cx,11
mov bx, 10
mov al,character
search: cmp byte ptr string[bx], 'l'
je skip
inc al
skip: dec bx
jns search
m09 p2
m09 al
m4c
main endp
cds ends
end main
【问题讨论】:
-
你想要
cmp而不是test。inc也更改了标志,因此您的je不使用比较结果。显然,如果匹配,您只想增加计数。此外,您需要确保循环运行适当的次数。dx[character]不是有效的寻址模式,因此它甚至不应该汇编。 -
运行它时会发生什么?不是没有测试结果的minimal reproducible example。但也许你应该在手册中查找
test,并注意它是按位与。您正在寻找cmp。 (另外,inc写入 ZF,所以如果inc产生零,inc character/je search会跳转。而且我认为您正在添加两个带有dx[character]的地址,如果这甚至与dx在外面组装方括号。哦,不,绝对不会,DX 在 16 位寻址模式下不可用。你根本不想要character db 0,你想要寄存器中的指针或整数数组索引。)跨度> -
@PeterCordes 我是一个初学者,是否可以编写正确的代码以获得结果以更好地理解我?
-
您可以用 C 语言编写它并让编译器为您创建一个示例。 How to remove "noise" from GCC/clang assembly output? 或者,如果您搜索堆栈溢出,很可能存在一些现有的问答,其中包含用于计算字符串或字符数组中字符出现次数的工作代码。 (或者用于计算整数数组中的匹配项,这实际上是同一个问题;计算机将字符表示为整数。)
-
我对在 Stack Overflow 上为每个新手编写自定义教程不感兴趣;我关注性能/优化问题的程序集标签。其中一些东西,比如寻址语法,已经在大多数现有教程中介绍过,一旦你组装好调试器,单步调试应该会让很多其他问题更清楚。如果您仍然有无法通过这种方式解决的谜题,请发布minimal reproducible example,详细说明您在调试器中看到的内容与您预期会发生的情况。