📄 4.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; PC机RS-232串口自发自收 ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DATA SEGMENT
;COM1 EQU 3F8H-3FFH ;PC机上自带的两个串口地址
;COM2 EQU 2F8H-2FFH
IO8250TR EQU 3F8H ;发送端数据寄存器地址
IO8250RR EQU 3F8H ;接受端数据寄存器地址
IO8250DIVL EQU 3F8H ;除数寄存器低字节地址
IO8250DIVH EQU 3F9H ;除数寄存器高字节地址
IO8250IER EQU 3F9H ;中断允许寄存器地址
IO8250IIR EQU 3FAH ;中断识别寄存器地址
IO8250LCR EQU 3FBH ;线路控制寄存器地址
IO8250MCR EQU 3FCH ;MODEM控制寄存器地址
IO8250LSR EQU 3FDH ;线路状态寄存器地址
IO8250MSR EQU 3FEH ;MODEM状态寄存器地址
ERR DB 'ERROR!$' ;提示错误信息
DATA ENDS
STACK1 SEGMENT STACK
DB 100 DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START: MOV AX,DATA
MOV DS,AX
MOV AL,10000000B ;8250初始化,设DLAB=1
MOV DX,IO8250LCR
OUT DX,AL
MOV AX,30H ;波特率2400 kb/s
MOV DX,IO8250DIVL
OUT DX,AL ;写入除数低字节
MOV AL,AH
MOV DX,IO8250DIVH
OUT DX,AL ;写入除数高字节
MOV AL,00001011B ;8位数据,1位停止,奇校验
MOV DX,IO8250LCR
OUT DX,AL ;写入线路控制寄存器
MOV AL,00000011B ;自检关闭,请求发送
MOV DX,3FCH
OUT DX,AL ;写入MODEM控制寄存器
MOV AL,0
MOV DX,IO8250IER
OUT DX,AL ;禁止中断
MOV DX,IO8250LSR
IN AL,DX ;空读一次
WAIT_FOR:MOV DX,IO8250LSR ;读线路状态寄存器
IN AL,DX
TEST AL,00011110B ;出错否
JNZ ERROR
TEST AL,00000001B ;接收数据就绪否
JNZ RECEIVE ;转接收
TEST AL,01000000B ;发送移位寄存器空否
JZ WAIT_FOR ;不空的话返回等待
MOV AH,1
INT 21H ;读键盘
MOV DX,IO8250TR ;发送
OUT DX,AL
JMP WAIT_FOR ;返回等待
RECEIVE:MOV DX,IO8250RR ;读接收数据
IN AL,DX
AND AL,01111111B
CMP AL,03H ;是Ctrl-C?
JNZ CHAR
MOV AX,4C00H ;返回DOS
INT 21H
CHAR: MOV DL,AL
MOV AH,2 ;显示接受字符
INT 21H
JMP WAIT_FOR ;返回等待
ERROR:MOV DX,OFFSET ERR ;显示‘error’
MOV AH,09H
INT 21H
JMP WAIT_FOR
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -