You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

x86汇编统计字符串中l字符数的search循环异常排查求助

故障点排查

  • 计数逻辑颠倒:现有代码判断字符等于l时跳过计数,不等于l时才累加,和需求完全相反
  • 输出调用错误:你定义的m09宏是调用DOS中断09号功能输出$结尾的字符串,要求传入字符串的内存偏移地址,你直接传入存储计数的al寄存器,会把计数数值当成内存地址读取,必然输出乱码
  • 缺少数值转ASCII步骤:统计得到的是十进制数字值,需要转成对应的ASCII编码才能正常显示在屏幕上

修正后完整代码

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  bx, 10
         mov  al,character ; 计数初始值为0
search:  cmp  byte ptr string[bx], 'l'
         jne  skip ; 不等于l就跳过累加,等于才计数
         inc  al
skip:    dec  bx
         jns  search
         m09 p2
         ; 新增:将数值转ASCII输出
         mov bl,10
         div bl ; 除以10,al存十位商,ah存个位余数
         push ax
         add al,30h ; 十位转ASCII
         m02
         pop ax
         mov al,ah
         add al,30h ; 个位转ASCII
         m02
         m4c
main    endp
cds     ends        
        end main

修正说明

  1. 把search循环里的je skip改为jne skip,修复计数逻辑
  2. 移除了无效的mov cx,11语句
  3. 新增十进制数值转ASCII的逻辑,调用m02宏逐个输出数字字符,替代原来错误的m09 al调用

内容的提问来源于stack exchange,提问作者Good

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 19:06:03