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
修正说明
- 把
search循环里的je skip改为jne skip,修复计数逻辑 - 移除了无效的
mov cx,11语句 - 新增十进制数值转ASCII的逻辑,调用
m02宏逐个输出数字字符,替代原来错误的m09 al调用
内容的提问来源于stack exchange,提问作者Good
相关产品推荐
相关产品推荐

