【问题标题】:Difficulty finding the number of characters in the assembly难以找到程序集中的字符数
【发布时间】: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 而不是testinc 也更改了标志,因此您的 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,详细说明您在调试器中看到的内容与您预期会发生的情况。

标签: string assembly x86-16


【解决方案1】:

我要搜索并显示字符数

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

更有用的可能是计算非空白字符的数量。如果当前字符恰好是空格字符,则循环必须不增加计数器

         mov  bx, 10
search:  cmp  byte ptr string[bx], ' '
         je   skip
         inc  character
skip:    dec  bx
         jns  search

"文本中的字符数 (L):"

接下来的代码计算小写“l”和大写“L”的数量。如果它不使用不区分大小写,你就不会像图片中那样获得 3 !这次循环跳过递增计数器是当前字符,大写后不是“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 在 cmets 中充分处理了您的 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

【讨论】:

  • 感谢您的帮助我的朋友,我按照您的方式编辑了我的代码,但不幸的是它没有正确显示结果:(
  • @Good 查看已编辑的答案以了解此显示问题的解决方案。
  • 非常感谢亲爱的朋友抽出宝贵时间帮助我:)
猜你喜欢
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
相关资源
最近更新 更多