📄 l73.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 + -