功能:任意输入一个字符串,去掉其中的空格后反序输出
注:使用 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