x86汇编如何跳过字符串开头空格?对应的正确循环应如何编写?
x86汇编跳过字符串开头空格的实现方案
现有代码的核心错误
- 仅在进入循环前读取了一次当前si指向的字符存入ah,循环过程中没有重新读取新的si位置的字符,每次判断的始终是第一个字符,逻辑完全失效
- 跳转条件写反:和空格
20h比较结果非零(说明当前不是空格)的时候,应该直接结束循环,而不是继续移动si;比较结果为零(是空格)的时候才需要移动si继续检查下一个字符 - 滥用
loop指令:loop执行依赖cx寄存器存储的循环次数,你没有预先给cx赋值字符串总长度,循环次数不可控,且此处不需要用loop指令也能实现逻辑
正确实现
场景1:处理以0结尾的C风格字符串(最常用场景)
mov si, offset buff+2 ; 取字符串起始地址,buff+2是你原代码的偏移,按需调整 skip_space_loop: mov al, [si] ; 读取当前si指向的字符 cmp al, 20h ; 和空格ASCII码比对 jne skip_space_done ; 不是空格就直接退出循环,已找到目标位置 inc si ; 是空格,si加1指向下一个字符 cmp byte ptr [si], 0 ; 可选判断:防止字符串全是空格的情况越界 jne skip_space_loop ; 没到结尾就继续循环 skip_space_done: ; 此处si已经指向第一个非空格字符,或字符串结束位置,可直接执行后续处理
场景2:处理已知长度的字符串
提前把字符串总长度存入cx寄存器即可:
mov si, offset buff+2 mov cx, 字符串长度 ; 替换为实际的字符串长度变量/立即数 skip_space_loop: jcxz skip_space_done ; cx为0说明全是空格,直接退出 mov al, [si] cmp al, 20h jne skip_space_done inc si dec cx jmp skip_space_loop skip_space_done:
内容的提问来源于stack exchange,提问作者NewAtC
相关产品推荐
相关产品推荐

