宫野真守passage:一道汇编程序题中有地方不懂
来源:百度文库 编辑:高校问答 时间:2024/06/01 13:37:27
题目:在缓冲区buff中存有3个字符串,将3个字符串连接在一起输出到屏幕上
DATA SEGMENT
BUFF DB 'HOW',0DH,0AH
DB 'ARE',0DH,0AH
DB 'YOU',0DH,0AH
DB 0DH,0AH
DB '$'
N EQU $-BUFF
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
MAIN PROC
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV DI,OFFSET BUFF
IP1: MOV BX,N
SUB BX,2 ;减二是为什么
CMP DI,BX
JZ THEEND
CMP WORD PTR [DI],0A0DH
JNZ CONTINUE
PUSH DI
MOV SI,DI
INC SI
INC SI
MOV CX,N
SUB CX,DI
CLD
REP MOVSB
MOV AX,N ;这里ax干了什么
SUB AX,2 ;好像没有被调用唉
POP DI
CONTINUE:
INC DI
JMP IP1
THEEND:
MOV AH,9
LEA DX,BUFF
INT 21H
MOV AH,4CH
INT 21H
MAIN ENDP
CODE ENDS
END MAIN
请回答一下前面两个问题 再稍微解释下程序 谢谢!
DATA SEGMENT
BUFF DB 'HOW',0DH,0AH
DB 'ARE',0DH,0AH
DB 'YOU',0DH,0AH
DB 0DH,0AH
DB '$'
N EQU $-BUFF
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
MAIN PROC
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV DI,OFFSET BUFF
IP1: MOV BX,N
SUB BX,2 ;减二是为什么
CMP DI,BX
JZ THEEND
CMP WORD PTR [DI],0A0DH
JNZ CONTINUE
PUSH DI
MOV SI,DI
INC SI
INC SI
MOV CX,N
SUB CX,DI
CLD
REP MOVSB
MOV AX,N ;这里ax干了什么
SUB AX,2 ;好像没有被调用唉
POP DI
CONTINUE:
INC DI
JMP IP1
THEEND:
MOV AH,9
LEA DX,BUFF
INT 21H
MOV AH,4CH
INT 21H
MAIN ENDP
CODE ENDS
END MAIN
请回答一下前面两个问题 再稍微解释下程序 谢谢!
1.-2的作用是因为DB 0DH,0AH这句,这个程序是根据回车换行来判断一个字符串的结束的,所以每次都把字符的个数存入BX,然后-2去掉最后一个换行.
2.AX存放了N的值,也就是从BUFF开始到$总共占用的内存字节数.SUB AX,2被调用了,当程序检测到回车换行的时候就会调用这里.AX这里似乎没什么用.
3.这段程序就是根据检测到的回车换行确定换行前面的字符串,然后把它们存起来,最后再调用中断输出出去.
上面的兄弟说的很正确,但是这个程序编的太没水平