首页 > 代码库 > (练手备忘)汇编实现将输入的字符串中的空格去掉后反序输出

(练手备忘)汇编实现将输入的字符串中的空格去掉后反序输出

功能:任意输入一个字符串,去掉其中的空格后反序输出


注:使用 int 21h 里的 0AH 功能 输入一个字符串时,字符串的第一个字节存储的是字符串的最大长度,第二个字节存储的是实际读入字符的个数

编译器使用的是MASMPlus

;#Mode = DOS

MAXLEN = 64    ;设置字符串的最大长度
SPACE  = ‘ ‘   ;空格

datasg segment
	buffer db MAXLEN+1,0,MAXLEN+1 dup(0)   ;字符串输入缓冲区
	string db MAXLEN+3 dup(0)              ;字符串反序后的结果
datasg ends

assume cs:codesg,ds:datasg
codesg segment
start: 
	;ds:dx指向输入缓冲区首址
	mov ax,datasg
	mov ds,ax
	mov dx,offset buffer
	
	;输入字符串
	mov ah,10
	int 21h
	
	;判断字符串长度是否为0
	xor ch,ch
	mov cl, buffer[1]     ;cl为字符串长度
	jcxz ok  ;长度为0则结束
	
	;长度不为0
	
	mov si,offset buffer       
	xor bh,bh
	add bl,buffer[1]
	add si,bx                                      
	inc si                        ;设置ds:si指向字符串末尾  
	
	mov ax,datasg
	mov es,ax
	mov di,offset string          ;设置es:di指向翻转字符串首地址
	
	;翻转字符串
	xor ah,ah
	mov al,SPACE
ok1:
	cmp al,BYTE ptr [si]
	jz ok2                        ;去掉空格
	mov bl,BYTE ptr [si]
	mov BYTE ptr [di],bl
	inc di
ok2:
	dec si
	loop ok1
	
	;计算字符串长度
	mov cx,di
	sub cx,offset string
	;---------------------------------------------------自定义输出--------------------------------------------------------
	;ds:si 指向源地址
	mov ax,datasg
	mov ds,ax
	mov si,offset string
	
	;es:di 指向目的地址
	mov ax,0b800h
	mov es,ax
	mov di,160*5+2*10   ;设置显示的位置
	
	;输出
   mov bh,02h    ;设置显示字体的属性
next:
	mov bl,BYTE ptr ds:[si]
	mov BYTE  ptr es:[di],bl
	inc di
	mov BYTE ptr es:[di],bh
	inc si
	inc di
	loop next
	;---------------------------------------------------自定义输出--------------------------------------------------------
	
;  输出翻转后的字符串
;	mov BYTE ptr [di],‘$‘
;	mov dx,offset string
;	mov ah,09h
;	int 21h

s: jmp s                         ;死循环,防止一闪而过,看不到结果

;程序结束
ok:
	mov ax,4c00h
	int 21h
codesg ends
end start