📄 sjtxs.asm
字号:
;STACKSG SEGMENT STACK 'S‘
; DW 64 DUP('ST')
;STACKSG ENDS
DATASTARTX EQU 02F8H ;对方机器端口号
DATASTART1 EQU 03F8H ;数据入口地址 当DL=0,RBR、THR 当DL=1 为DLL
DATASTART2 EQU 03F9H ;DL=0,IER,当DL=1,DML
DATASTATE EQU 03FDH ;线路状态寄存器端口号 LSR
com1k equ 3fbh ;线路控制寄存器 也可能为02fb
data segment
p1 db "system ready!$"
p3 db "communication error!$"
INPUTDATA DB ? ;输入的字符串
data ends
code segment
assume cs:code,ds:data
main proc far
start: push ds
xor ax,ax
push ax
mov ax,data
mov ds,ax
;下面是要自己写的内容1==========================
;写LCR 设8位数据,2位停止位,偶校验 无间隔传送,则线路控制寄LCR=9FH。
MOV AL,9FH
MOV DX,COM1K
OUT DX,AL
;写分频系数 当编程的线路控制寄存器LCR的D7位DL=1时,
;接下来向02f8H和02f9H端口写入的值为分频系数16位值,允许仅写低8位。
;例如,置波特率9600时,分频系数=12。则为000CH
;写入低地址
MOV DX,DATASTART1
MOV AL,0CH ;根据波特率的不同而变化的
OUT DX,AL
;写入高地址
MOV DX,DATASTART2
MOV AL,00H ;根据波特率的不同而变化的
OUT DX,AL
;为FIFO的DL位回写零
MOV DX,COM1K
MOV AL,1FH
OUT DX,AL
;1============================================
mov dx,DATASTART1+4 ;=3fch ;设置MCR 可能会变化的值
mov al,03h
out dx,al
mov dx,DATASTART2 ;IER 屏蔽所有中断
mov al,0
out dx,al
call back
mov dx,offset p1 ;输出字符串
mov ah,9
int 21h
;下面是要自己写的内容2====================
;发送部分 包括发送状态判断 读键盘输入 有输入则发送
SEND: MOV DX,DATASTATE ;本机状态端口号
IN AL,DX ;读状态
TEST AL,20H ;检发送器就绪 LSR中的THRE位 发总状态寄存器空
JZ SEND
MOV DX,DATASTARTX ;数据端口号 另一个机器的端口号 未知
;从键盘输入字符 *表示输入结束
MOV AH,01H ;1号功能 带回显的字符输入
INT 21H ;要发送的数据 已经在AL中了
OUT DX,AL
;2==========================================
cmp al,'*'
jz stop
mov bx,7
mov ah,14
int 10h
;下面是自己写的内容3=======================
;接收部分
;包括接收状态判断
;出错状态判断
RECV: MOV DX,DATASTATE ;状态端口号 本机状态端口号
IN AL,DX ;读状态
TEST AL,01H ;是否接收到数据 老师课件有错
JZ RECV
TEST AL,0EH ;检3个错误
JNZ error ;出错转处理
MOV DX,DATASTART1 ;数据端口号 本机端口号
IN AL,DX ;读数据
;显示接收到的字符
MOV DL,AL
MOV AH,02H ;2号功能显示字符 输出DL对应的ASCII值
INT 21H
;3=======================================
cmp al,'*'
jz stop
;输出响铃字符
mov bx,7 ;响铃字符的ASCII值
mov ah,14
int 10h
jmp send ;循环发送
error: call back
mov dx,offset p3
mov ah,9
int 21h
jmp send
stop: ret
main endp
;回车换行功能
back proc near
push ax
push dx
mov dl,0dh ;功能号:2 DL=字符的ASCII值 输出DL对应的ASCII值
mov ah,2
int 21h
mov dl,0ah ;功能号:2 DL=字符的ASCII值 输出DL对应的ASCII值
mov ah,2
int 21h
pop dx
pop ax
ret
back endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -