题目:通过内环自检的方式,将以下电文,显示在屏幕上,输出十行结束。
Hello Masm!
程序清单:
;FILENAME:931_1.asm
.586
DATA SEGMENT USE16
BUF DB 'Hello Masm!'
LENS EQU $-BUF
ERROR DB 'COM1 BAD!',0DH,0AH,'$'
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
CALL I8250 ;主串口初始化
MOV CH,10 ;10行送CH
AGAIN:
MOV CL,LENS ;电文长度送CL
MOV BX,OFFSET BUF
TSCAN:
MOV DX,3FDH
IN AL,DX
TEST AL,20H ;发送保持寄存器空?
JZ TSCAN ;否
MOV AL,[BX] ;取字符
SEND:
MOV DX,3F8H
OUT DX,AL ;送主串口数据寄存器
MOV SI,0
RSCAN:
MOV DX,3FDH
IN AL,DX
TEST AL,01H ;一帧数据收完否 ?
JNZ REVEICE ;收完转
DEC SI
JNZ RSCAN ;延时
JMP DISPERR ;超时,转出错处理
REVEICE:
MOV DX,3F8H
IN AL,DX ;读数据寄存器
AND AL,7FH
DISP:
MOV AH,2
MOV DL,AL
INT 21H ;屏幕显示
INC BX
DEC CL ;计数
JNZ TSCAN
DEC CH ;行计数
MOV AH,2
MOV DL,0DH
MOV DL,0AH ;换行
INT 21H ;屏幕显示
JNZ AGAIN
JMP RETURN
DISPERR:
MOV AH,9
MOV DX,OFFSET ERROR
INT 21H ;显示出错信息
RETURN:
MOV AH,4CH
INT 21H ;返回 DOS
;----------------------------
I8250 PROC ;主串口初始化子程序
MOV DX,3FBH
MOV AL,80H
OUT DX,AL ;寻址位置1
MOV DX,3F9H
MOV AL,00H
OUT DX,AL ;写除数高8位
MOV DX,3F8H
MOV AL,60H
OUT DX,AL ;写除数低8位
MOV DX,3FBH
MOV AL,03H
OUT DX,AL ;无校验传送,8位数据
MOV DX,3F9H
MOV AL,10H
OUT DX,AL ;禁止8250内部中断
MOV DX,3FCH
MOV AL,10H
OUT DX,AL ;8250收发方式,禁止中断
RET
I8250 ENDP
CODE ENDS
END BEG
实验结果:
版权声明:本文为博主原创文章,未经博主允许不得转载。