db 256 dup(0)
STACK ends
CODE Segment para public 'code'
start proc far
assume cs:code,ss:stack
PUSH DS
MOV AX,0
PUSH AX
CLI
INITOUT: MOV DX,3FBH ;通讯线控制寄存器第7位置1(DLAB=1),以便设置波特率
MOV AL,80H
OUT DX,AL
MOV DX,3F8H ;设置除数锁存器低位
MOV AL,30H
OUT DX,AL
MOV DX,3F9H ;设置除数锁存器高位
MOV AL,0
OUT DX,AL
MOV DX,3FBH ;设定数据格式,8个数据位,一个停止位,无校验
MOV AL,03H
OUT DX,AL
MOV DX,3FCH ;设置MODEM控制信号
MOV AL,03H
OUT DX,AL
MOV DX,3F9H ;禁止所有8250中断(四种类型)
MOV AL,0
OUT DX,AL
FOREVER: MOV DX,3FDH ;发送保持寄存器不空则循环等待
IN AL,DX
TEST AL,20H
JZ FOREVER
WAITWAIT:MOV AH,01H ;检查键盘缓冲区,无字符则循环等待
INT 16H
JZ WAITWAIT
MOV AH,0 ;若有则取键盘字符
INT 16H
SENDCHAR: MOV DX,3F8H ;发送键入的字符
OUT DX,AL
RECEIVE: MOV DX,3FDH ;检查接受数据是否准备好,未准备好继续查询
IN AL,DX
TEST AL,01H
JZ RECEIVE
TEST AL,1AH ;判接受的数据是否出错,有错则转错误处理
JNZ ERROR
MOV DX,3F8H ;从接受寄存器中读取数据
IN AL,DX
AND AL,7FH ;去掉无效位,得到数据
PUSH AX
MOV BX,0 ;显示接受到的字符
MOV AH,14
INT 10H
POP AX
CMP AL,0DH ;得到的数据不是回车符则返回
JNZ FOREVER
MOV AL,0AH ;是回车符则回车换行
MOV BX,0
MOV AH,14
INT 10H
JMP FOREVER
ERROR: MOV DX,3F8H ;读接受寄存器,清除错误字符
IN AL,DX
MOV AL,'?' ;功能调用,显示?+
MOV BX,0
MOV AH,14
INT 10H
JMP FOREVER ;继续循环
Start endp
Code ends
end start