1. 程式人生 > >實驗4:實現內環自檢功能

實驗4:實現內環自檢功能

題目:通過內環自檢的方式,將以下電文,顯示在螢幕上,輸出十行結束。

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

實驗結果: