请教:这个程序的有些语句是什么意思啊

请问:这个程序的有些语句是什么意思啊?
;功能;   接收一个字符串,去掉其中的空格后按相反的顺序显示它
;符号常量的定义
MAXLEN   =   64
SPACE   =   '   '
CR   =   0DH
LF   =   0AH
DSEG   SEGMENT
BUFFER   DB   MAXLEN+1,   0,   MAXLEN+1   DUP(0)
STRING   DB   MAXLEN+3   DUP(0)
DSEG   ENDS

CSEG   SEGMENT
ASSUME   CS:CSEG,   DS:DSEG,   ES:DSEG
START:
MOV   AX,   DSEG
MOV   DS,   AX
MOV   ES,   AX
MOV   DX,   OFFSET   BUFFER
MOV   AH,   10
INT   21H
XOR   CH,   CH
MOV   CL,   BUFFER+1
JCXZ   OK

CLD
MOV   SI,   OFFSET   BUFFER+2
MOV   DI,   OFFSET   STRING
XOR   AL,   AL
STOSB
MOV   AL,   SPACE
PP1: XCHG   SI,   DI                                           //这里把si,di换了干什么啊
REPZ   SCASB         //这里比较AL,与DI,   di里放的是什么啊
XCHG   SI,   DI                             //更晕的是,它又换回来了。
JCXZ   PP3                               //这里为什么要转.从这开始,下面就完全看
DEC   SI         //不明白了,它这里的思想到底是怎样的啊?
INC   CX
PP2: CMP   BYTE   PTR[SI],   SPACE
JZ   PP1
MOVSB
LOOP   PP2

PP3: MOV   AL,   CR
STOSB
MOV   AL,   LF
MOV   [DI],   AL
STD
MOV   SI,   DI
PP4: LODSB
OR   AL,   AL
JZ   OK
MOV   DL,   AL
MOV   AH,   2
INT   21H
JMP   PP4
OK:   MOV   AH,   4CH
INT   21H
CSEG   ENDS  
END   START

------解决方案--------------------
就一次. 这个是为了最后输出时判别字符串结束的个标记字节. 因为输出是反序的, 从最后向前逐个字符输出, 所以这个标记字节就放在了最开始处