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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:45:04