⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 l73.asm

📁 8086上的双机实时字符通信
💻 ASM
字号:
DATA SEGMENT
	BUF DB 100 DUP(?)
	MUS DB 100 DUP(?)
	PICT DB 100 DUP(?)
	MES1 DB 0DH,0AH,'You have send a string!',0DH,0AH
	LEN1 EQU $-MES1
	MES2 DB 0DH,0AH,'A string has been received!',0DH,0AH
	LEN2 EQU $-MES2
	MARK DB 00H
	VAR DB 00H
DATA ENDS

STACK SEGMENT STACK
     STA DB 50 DUP(?)
     TOP DW $
STACK ENDS

CODE SEGMENT
	ASSUME CS:CODE,DS:DATA,SS:STACK

START:

   MOV AX,STACK
   MOV SS,AX
   MOV SP,TOP
	MOV AX,CS
	MOV DS,AX
	LEA DX,INT7					;设置中断向量
	MOV AX,250FH
	INT 21H
	CLI
	IN AL,21H
	AND AL,7FH					;解除IRQ7的屏蔽
	OUT 21H,AL
	MOV AX,DATA
	MOV DS,AX

	MOV DX,2B9H					;设置8251
	MOV AL,0
	OUT DX,AL
	OUT DX,AL
	OUT DX,AL

	MOV AL,40H
	OUT DX,AL
	MOV AL,4EH
	OUT DX,AL
	MOV AL,27H
	OUT DX,AL

	MOV AL,14H					;设置8253
	MOV DX,283H
	OUT DX,AL
	MOV AL,52
	MOV DX,280H
	OUT DX,AL

N:
   MOV MARK,00H
   MOV BP, OFFSET BUF
	MOV SI,0
	MOV BH,0
L1:
	CMP BH,0					  ;BH为0且未启动发送时,程序在L1与L3间来回跳转,处于查询状态
	JE L3
L2:
   CMP BH,2
	JNE L2
	CMP MARK,1
	JNZ NEXT1
	CALL DRAW               ;接收到图片,调用显示函数
	JMP N
NEXT1:
   CMP MARK,2             ;接到音乐,调用播放函数
   JNZ NEXT2
   CALL PLAY
   JMP N
NEXT2:
	LEA SI,MES2					;接收完毕,输出已收到信息,并显示接收内容
	MOV CX,LEN2
	MOV AH,0EH
DISP2:
	LODSB
	INT 10H
	LOOP DISP2
	JMP N
L3:
	MOV AH,1
	INT 16H
	JZ L1
	MOV AH,0					   ;有键按下,ESC跳出,回车发送,否则记录下来接着查询
	INT 16H
	CMP AL,1BH
	JE EXIT
	CMP AL,'*'              ;文件发送标志
	JNZ DATASEND
	
	CALL JUDGE
	
	
DATASEND:
	MOV AH,0EH
	INT 10H
	MOV [BP+SI],AL
	INC SI
	CMP AL,0DH					;如果是回车则需要发送
	JNE L3
	MOV AL,0DH
	MOV AH,0EH
	INT 10H
	MOV AL,0AH
	MOV AH,0EH
	INT 10H
	MOV BX,SI
	MOV SI,0
   
   CALL DATA_SEND
   
	MOV AX,DATA
	MOV DS,AX
	LEA SI,MES1
	MOV CX,LEN1
	MOV AH,0EH
DISP1:
	LODSB
	INT 10H
	LOOP DISP1
	JMP N
EXIT:
	IN AL,21H
	OR AL,80H
	OUT 21H,AL
	MOV AH,4CH					
	INT 21H

INT7 PROC FAR						;中断接收程序也与自发自收类似,不同的是用BH来判断是否
							         ;什么都没有收到(发送方发了空行),并用BH给发送者以反馈
	PUSH AX
	PUSH DX
	MOV DX,2B8H
	IN AL,DX
	CMP BH,0
	JNE M
	MOV BH,1
	MOV AH,0
	MOV SI,AX
	JMP FINISHED
M:
   CMP MARK,AL
	MOV AH,0EH
	INT 10H
	DEC SI
	CMP SI,0
	JNE FINISHED
	MOV BH,2
FINISHED:
	MOV AL,20H
	OUT 20H,AL
	POP DX
	POP AX
	IRET
INT7 ENDP



JUDGE PROC NEAR
   MOV AH,0EH
	INT 10H
LL1:  
	MOV AH,1
	INT 16H
	JZ LL1
	CMP AL,1BH
	JE EXIT2
	MOV VAR,AL
	MOV AL,VAR-48
	MOV MARK,AL
	RET
EXIT2:
	IN AL,21H
	OR AL,80H
	OUT 21H,AL
	MOV AH,4CH					
	INT 21H
JUDGE ENDP


DATA_SEND PROC NEAR
   CMP MARK,0
   JZ SEND0
   CMP MARK,1
   JNZ MUSIC
   MOV BP,OFFSET PICT
   JMP SEND0
MUSIC:
   MOV BP,OFFSET MUS
   
SEND0:
   MOV DX,2B9H                ;发送模块用B是否等于SI来判断是否发送结束
   IN AL,DX
   TEST AL,1
   JZ SEND0
   MOV AL,MARK                ;标记位
   MOV DX,2B8H
   OUT DX,AL
SEND1:							      
	MOV DX,2B9H
	IN AL,DX
	TEST AL,1
	JZ SEND1
	MOV AL,BL                   ;BL中是数据长度
	MOV DX,2B8H
	OUT DX,AL
SEND2:
	MOV DX,2B9H
	IN AL,DX
	TEST AL,1
	JZ SEND2
	MOV AL,[BP+SI]             ;发送数据内容
	MOV DX,2B8H
	OUT DX,AL
	INC SI
	CMP SI,BX
	JNE SEND2
   RET
DATA_SEND ENDP

DRAW PROC NEAR
     RET
DRAW ENDP

PLAY PROC NEAR
     RET
PLAY ENDP

CODE ENDS
END START

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -