如何跳过程序集x86中字符串开头的空格 [英] How to skip spaces at the beginning of the string in assembly x86

查看:0
本文介绍了如何跳过程序集x86中字符串开头的空格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我想跳过字符串开头的所有空格,并在代码到达字符串的第一个符号时开始处理字符串,我应该编写什么循环。如果我有一个类似

的字符串
a='        s o m e word'

代码应在到达"%s"时启动。它应该是某种循环,但我仍然不知道如何正确编写它。

我的尝试:

    mov  si, offset buff+2 ;buffer

    mov ah, [si]
    
    loop_skip_space:
        cmp ah,20h ;chech if ah is space            
        jnz increase ;if yes increase si 
        jmp done ;if no end of loop
        increase:
                          
            inc si 

    loop loop_skip_space
    
    done:

推荐答案

buff+2处获取其字符串偏移量的16位代码中,我相信可以安全地将此字符串视为属于执行DOS.BufferedInput function 0Ah获得的输入。
下面的代码片段就是基于这个假设的。接下来对OP代码的观察仍然有效。

  • mov ah, [si]必须是循环的一部分。您需要验证字符串中的不同字符,因此需要加载后面的字节。
  • 代码应在找到非空格字符后退出循环。当前您在第一个空格退出。
  • loop指令要求使用字符串长度设置CX寄存器。你遗漏了这一点。
  mov  si, offset buff+2
  mov  cl, [si-1]
  mov  ch, 0
  jcxz done               ; String could start off empty
loop_skip_space:
  cmp  byte ptr [si], ' '
  jne  done
  inc  si                 ; Skip the current space
  loop loop_skip_space
done:

hereSI指向字符串中的第一个非空格字符,剩余的CX个字符。CX可以为零!


如果停止使用loop指令,您可以编写更好的代码,因为它是一种据说很慢的指令。请参阅Why is the loop instruction slow? Couldn't Intel have implemented it efficiently?

  1. 避免loop并不再需要使用CX
  mov  si, offset buff+2
  mov  cl, [si-1]
  test cl, cl
  jz   done               ; String could start off empty
loop_skip_space:
  cmp  byte ptr [si], ' '
  jne  done
  inc  si                 ; Skip the current space
  dec  cl
  jnz  loop_skip_space
done:
  1. 避免loop并使用分隔符13(回车)
  mov  si, offset buff+1
loop_skip_space:
  inc  si
  cmp  byte ptr [si], ' '
  je   loop_skip_space

这篇关于如何跳过程序集x86中字符串开头的空格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆