⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ok8.asm

📁 汇编终结....此程序讲述了在软件开发的底层,如何通过汇编来开发高效的驱动程序
💻 ASM
字号:
.MODEL SMALL
.DATA
	KEY		DB   0
	COUNT	  	DB   0
	NUM	  	DB   0			;名次
	MMM	  	DB   0			;记录数
	HJJ		DW   BUF1
	FLAG      	DB   0
	NNN             DB   0
	KEY_TABLE DW 06FEH,06FDH,06FBH,06F7H,06EFH,06DFH,06BFH,067FH
		  DW 05FEH,05FDH,05FBH,05F7H,05EFH,05DFH,05BFH,057FH
		  DW 03EFH,03DFH,03BFH,037FH
	KEYTB     DB 'CDEFBA98'
		  DB '45673210'
		  DB 'RPMG'   				  
	BUFFER	  DB  	10,10,0,0,10,0			;LED	
	SCREE	  DB  	3FH,06H,5BH,4FH,66H,6DH
		  DB	7DH,07H,7FH,6FH,40H

	BUF1		DB	1,10,0,0,10,0
	BUF2		DB	2,10,0,0,10,0
	BUF3		DB	3,10,0,0,10,0
	BUF4		DB	4,10,0,0,10,0
	BUF5		DB	5,10,0,0,10,0
	BUF6		DB	6,10,0,0,10,0
	BUF7		DB	7,10,0,0,10,0
	BUF8		DB	8,10,0,0,10,0
	MESS      	DB  	'已记录',0DH,0AH,'$'
	

.CODE
.STARTUP
	MOV AX,@DATA	
	MOV ES,AX

	MOV AL,00110110B	;8253初始化
	OUT 43H,AL
	MOV AX,11930
	OUT 40H,AL
	MOV AL,AH
	OUT 40H,AL

	MOV AL,08H		;保存原来的8号中断矢量
	MOV AH,35H
	INT 21H
	PUSH ES
	PUSH BX
	PUSH DS
	MOV DX,OFFSET INTP
	MOV AX,SEG INTP
	MOV DS,AX
	MOV AL,08H		;设置新的中断矢量
	MOV AH,25H
	INT 21H
 	POP DS 
	IN AL,21H
	AND AL,11111110B	;关IRO
	OUT 21H,AL
	STI
 START:	
 	CALL START1
KEYTEST:CMP AL,'G'  		;判所按是何键
	JZ G_KEY
	CMP AL,'M'
	JZ M_KEY
	CMP AL,'A'
	JZ A_KEY
	CMP AL,'P'
	JZ P_KEY
	CMP AL,'R'	
	JZ R_KEY
	CMP AL,'S'
	JZ S_KEY
        JMP START
	
.EXIT 0

INTP:	
	PUSH DS 		
	PUSH AX     	           			
	PUSH BX
	PUSH CX
	PUSH DX
	PUSH DI
	PUSH SI
	PUSH ES
	MOV  AX,@DATA
	MOV  DS,AX
	MOV  ES,AX
       	TEST FLAG,01H		;测试D0位
	JZ  DISP		
        INC COUNT
	CMP COUNT,10
	JNZ DISP 		
	MOV COUNT, 0
	INC BUFFER+5
	CMP BUFFER+5,10
	JNZ DISP
	MOV BUFFER+5,0
	INC BUFFER+3
	CMP BUFFER+3,10
	JNZ DISP
	MOV BUFFER+3,0
	INC BUFFER+2
	CMP BUFFER+2,6
	JNZ DISP
	MOV BUFFER+2,0
	 
DISP:	
	LEA  BX,SCREE
	LEA  SI,BUFFER
	MOV  AH,1
AGAIN:  
	MOV  AL,[SI]
	XLAT
	MOV DX,211H
	OUT DX,AL
	MOV AL,AH
	DEC DX
	OUT DX,AL
	MOV CX,60000
	LOOP $
 	INC SI
	ROL AH,1
	CMP AH,40H		;01000000
	JNZ AGAIN
	MOV AL,20H
	OUT 20H,AL
	POP ES					;现场恢复
	POP SI
	POP DI
	POP DX
	POP CX
	POP BX
	POP AX
	POP DS 
	IRET


START1: 
	MOV DX,@DATA
	MOV ES,DX
AB1:	MOV DX,21BH        
	MOV AL,10000010B	;设置PA口输出  PB 口输入
	OUT DX,AL
	MOV AL,0
	MOV DX,218H
	OUT DX,AL
        MOV DX,219H
	IN AL,DX
	AND AL,07H
	CMP AL,07H
	JZ AB1
	MOV CX,6000H
	LOOP $
	PUSH AX
	PUSH AX
	MOV DX,21BH
	MOV AL,10010000B	;设置PA口输入  PB 口输出
	OUT DX, AL
	POP AX
	MOV DX,219H
	OUT DX, AL
	MOV DX,218H
	IN AL,DX
	POP BX
	MOV AH,BL
	LEA DI,KEY_TABLE
	MOV CX,24
	CLD
	REPNZ SCASW
	JNZ AB1
	MOV AX,23
	SUB AX,CX
	LEA BX,KEYTB
	XLAT
	PUSH AX		
	MOV DL,AL
	MOV AH,2
	INT 21H
	MOV DX,21BH		
	MOV AL,10000010B
	OUT DX,AL
	MOV AL,0
	MOV DX,218H
	OUT DX,AL
   AB2: MOV DX,219H
	IN AL,DX
	AND AL,07H
	CMP AL,07H
	JNZ AB2
	MOV CX,60000
	LOOP $
	POP AX	
	RET

G_KEY:			;小键盘有G键按下比赛开始
      	MOV  BUFFER,10          
        MOV  BUFFER+2,0       
        MOV  BUFFER+3,0        
        MOV  BUFFER+5,0 
	MOV  COUNT,0
	MOV  NUM,0              
        OR   FLAG,00000101B    
        JMP  START  

A_KEY:  		      ;小键盘有A键按下比赛结束
        AND FLAG,11111010B    ;清比赛和可存储标志位
	MOV BUFFER,10
	MOV BUFFER+2,0
	MOV BUFFER+3,0
	MOV BUFFER+5,0
	MOV HJJ,SI
       	JMP START

R_KEY:			;小键盘有R键按下就返回DOS
	CLI		
	POP DX
	POP DS
	MOV AH,25H
	MOV AL,08H
	INT 21H
	.EXIT 0

M_KEY:  		;小键盘有M键按下保存成绩
	TEST FLAG,04H
        JZ START
        MOV SI,HJJ
        MOV AL,BUFFER+2 
        MOV [SI+2],AL
 	MOV AL,BUFFER+3 
        MOV [SI+3],AL
        MOV AL,BUFFER+5
        MOV [SI+5],AL
        ADD HJJ,6
        MOV  AL,FLAG
	OR   AL, 02H
	MOV  FLAG,AL 
        INC NUM
        CMP NUM,8
        JNZ START
        MOV  AL,FLAG
	AND  AL,0FBH
	MOV  FLAG,AL
        LEA SI,BUF1
        MOV HJJ,SI
        JMP A_KEY

P_KEY:  			;小键盘有p键按下显示成绩
	TEST FLAG,00000010B     
        JZ   START
        MOV SI,HJJ
        MOV AL,[SI]
	MOV BUFFER,AL
	
	ADD AL,30H	;转换成ASCII码		
	MOV DL,AL
	
	MOV AH,2	;2号调用显示
	INT 21H
	
	MOV  DX,'-'	;显示 -
	MOV AH,2
	INT 21H

        MOV AL,[SI+2]
	MOV BUFFER+2,AL
	
	ADD AL,30H
	MOV DL,AL
	MOV AH,2
	INT 21H

 	MOV AL,[SI+3]
        MOV BUFFER+3,AL
	
	ADD AL,30H
	MOV DL,AL
	MOV AH,2
	INT 21H

	MOV  DX,'-'
	MOV AH,2
	INT 21H

        MOV AL,[SI+5]
        MOV BUFFER+5,AL
	
	ADD AL,30H
	MOV DL,AL
	MOV AH,2
	INT 21H

        ADD HJJ,6
        ADD MMM,1
	
        CMP MMM,8
        JNZ START
        MOV NUM,0
        AND FLAG,11111101B
	JMP A_KEY

S_KEY:	MOV DX,203H		;8251初始化
	MOV AL,10110110B
	OUT DX, AL
	MOV DX,250
	MOV AX,1000
	MUL DX
	MOV BX,1200*16
	DIV BX
	MOV DX,202H
	OUT DX,AL
	MOV AL,AH
	OUT DX,AL
  INT: 	XOR AX,AX
	MOV CX,3	;往8251的控制端口209H送3个00
	MOV DX,209H
  OUT1: CALL DELAY
	LOOP OUT1
	MOV AL,40H	;往控制端口送40H,软件复位
	CALL DELAY	
	MOV AL,4EH	;波特率因子为16,8位数据 1位停止位
	CALL DELAY	
	MOV AL,15H	;向控制端口写控制字
	CALL DELAY	;使发送器和接受器启动
	MOV CX,8
	LEA SI,BUF1
	MOV HJJ,SI	;?
	JMP JJ
  NEXT:	ADD HJJ,6
  JJ:   MOV DX, 209H
	IN AL, DX
	AND AL, 01H
	JZ  JJ

	MOV SI, HJJ	;将BUF1的首地址给SI
	MOV AL, [SI]	;显示LED第一位
	ADD AL, 30H
	CALL MOVE
	
	MOV DX,'-'	;显示 -
	CALL MOVE
	
	MOV AL,[SI+2]	;显示LED第3位
	ADD AL,30H
	CALL MOVE
	
	MOV AL,[SI+3]	;显示LED第4位
	ADD AL, 30H
	CALL MOVE
	
	MOV DX,'-'
	CALL MOVE

	MOV AL,[SI+5]	;显示LED第6位
	ADD AL, 30H
	CALL MOVE
	
	LOOP NEXT	;显示下一个
	JNZ START

  MOVE: MOV DX, 208H
	OUT DX, AL
	CALL DELAY
	INC DX
   HH:	IN  AL, DX
	TEST AL, 02H
	JZ HH
	DEC DX
	IN AL, DX
	MOV AH,2
	MOV DL, AL
	INT 21H
	RET
  DELAY:OUT DX,AL	;用与将AL中的内容输出到DX指出的端口
	PUSH CX
        MOV CX,2000
	LOOP $
	POP CX
	RET
	
	


	

END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -