难以找到程序集中的字符数

Difficulty finding the number of characters in the assembly

我写了一个程序,接收一个字符串然后我想搜索并显示字符串中的字符数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

I want to search and display the number of characters

如果字符数是指字符串的长度,则不需要搜索,因为您已将输入设计为长度始终为 11。

更有用的可能是计算 非白人space 字符的数量。如果当前字符恰好是 space 字符 :

,则循环将不得不 不增加计数器
         mov  bx, 10
search:  cmp  byte ptr string[bx], ' '
         je   skip
         inc  character
skip:    dec  bx
         jns  search

“您的文本中的字符数 (L):”

下一段代码计算小写“l”和大写“L”的个数。如果不区分大小写,你就不会像图中那样得到3!这次循环 skips 递增计数器是当前字符,在大写之后,不是 "L".

         mov  bx, 10
search:  mov  al, string[bx]
         and  al, 0xDF          ; For case-insensitive
         cmp  al, "L"
         jne  skip
         inc  character
skip:    dec  bx
         jns  search

保持显示数值结果,而您当前的程序不显示!
看到这个 Displaying numbers with DOS

ps Jester 和 Peter Cordes 在评论中充分解决了您 search 循环中的问题。

迟到

m09 p2
m09 al      <<<< This won't work!
m4c

要打印 AL 寄存器中的数字,您不能使用用于输出字符串的 m09 宏。
为此,您有 m02 宏。一旦代码正常工作,剩下的唯一事情就是将 AL 中的值 3 转换为字符 "3" .

m09 p2
mov al, character
add al, 48
m02
m4c