📄 pc.asm
字号:
Stack Segment para stack 'stack'
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 ;通讯线控制寄存器第七位置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 ;设置moden控制信号
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
WAIT1: MOV AH,1 ;;检测键盘缓冲区,无字符则循环等待
INT 16H
JZ WAIT1
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 ENDS
CODE ENDS
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -