如何跳过程序集x86中字符串开头的空格 [英] How to skip spaces at the beginning of the string in assembly x86
本文介绍了如何跳过程序集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?。
- 避免
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:
- 避免
loop
并使用分隔符13(回车)
mov si, offset buff+1
loop_skip_space:
inc si
cmp byte ptr [si], ' '
je loop_skip_space
这篇关于如何跳过程序集x86中字符串开头的空格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文