汇编语言 去除字符串中的空格并输出

有一个首地址为string的字符串 ,剔除string中所有的空格字符。
要求:请从字符串最后一个字符开始逐个向前判断、并进行处理。


算法思想:
       假设 串以0作为结束标志,从右向左扫描,遇到空格后,将其后的所有字符向前移动一个位置,直到首字符为止。 由于串长是动态变化的,所以需要设置三个指针,tailP指向串尾, 扫描用的指针scanP, 及移动时用的指针moveP。

算法描述:
 1. scanP=tailP=sLen-2;
 2. while (scanP>=0) do
         if sStr[scanP]==' '  then
         { for moveP=scanP+1 to tailP do
                 sStr[moveP-1]=sStr[moveP];
           tailP--; }
         else
            scanP++;
 3. print  sStr;

代码实现:
.data
	sStr db 'ae f d g',0        ;定义一个含空格的字符串
	sLen equ $-sStr             ;获取字符串长度
	output byte 'result: %s',10,0
	tailP dword ?
	scanP dword ?
	moveP dword ?

.code
main proc
	mov scanP,sLen-2
	mov tailP,sLen-2
	mov ecx,sLen-1	;判断次数
	mov edi,tailP	;串尾指针
	mov esi,scanP	;扫描指针
	mov ebx,moveP	;移动指针
	mov edx,sLen-1
again:
	cmp sStr[esi],20h	;比较当前字符是否为空格
	jne  left	
	push esi	;若当前字符为空格,先将当前扫描位置压入栈保存起来
	add esi,1	
	mov ebx,esi	;移动指针指向空格后面的元素
	pop esi		;esi弹出,即扫描指针恢复到空格位置

L1:
	cmp ebx,edx	;判断移动指针的位置超出字符串结束符
	ja next		;若超出,跳转;否则将后续元素前移一位
	mov al,sStr[ebx]
	mov sStr[ebx-1],al
	inc ebx		;移动指针右移一位
	jmp L1

next:
	dec edi		;串尾指针前移
	jmp L2

left:
	cmp esi,0	;若当前字符不是空格,判断是否扫描到首字符
	jz done
	dec esi		;未扫描到首字符则将扫描指针前移一位

L2:
	loop again	

done:
	pushad 
		invoke printf,offset output,offset sStr
	popad
	ret

main endp
end main

运行结果: aefdg

实验过程中的问题:
    刚开始去除空格后进行移位时没有将 字符串的串尾结束符考虑在内,导致输出字符串长度与原来的一样。

必须将字符串的串尾结束符一起前移才能输出正确的字符串。

猜你喜欢

转载自blog.csdn.net/weixin_39830846/article/details/80266740