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

📄 backup.asm

📁 汇编终结....此程序讲述了在软件开发的底层,如何通过汇编来开发高效的驱动程序
💻 ASM
字号:
DSEG SEGMENT 
COUNT   DW   18
KEY     DB   ?    ;记录用户按下的键
FLAG    DB   0    ;标识位
MEMORY  DB   50 DUP(0)  ;用来记成绩
NUM     DB   0    ;已记录的成绩个数
VAL     DB   0    ;用来在显示成绩时,计数用户按'M'键的次数
N       DB   0   ;用来在发送数据时计数

SEGTAB  DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H
BUFFER  DB 10,10,0,0,10,0      ;--00-0
KEYTAB 	DW 06FEH,06FDH,06FBH,06F7H,06EFH,06DFH,06BFH,067FH
	DW 05FEH,05FDH,05FBH,05F7H,05EFH,05DFH,05BFH,057FH
	DW 03EFH,03DFH,03BFH,037FH
KEYASC 	DB'CDEFBA98'
	DB'45673210'
	DB'RPMG'
MENU    DB '*******MENU*******',0DH,0AH
        DB '    G.START       ',0DH,0AH
        DB '    M.SAVE        ',0DH,0AH
        DB '    P.SHOW        ',0DH,0AH
        DB '    A.CLEAR       ',0DH,0AH
        DB '    R.EXIT        ',0DH,0AH
        DB 'CHOOSE:           ',0DH,0AH
        DB '$'
DSEG ENDS
STACK1 SEGMENT PARA STACK
       DB 200 DUP(0)
STACK1 ENDS
CSEG SEGMENT
MAIN PROC FAR  
     ASSUME CS:CSEG,DS:DSEG,ES:DSEG,SS:STACK1   
START:  MOV AX,DSEG
        MOV DS,AX
        MOV ES,AX
        
        ;8253初始化
        ;---------
        mov al,36h
        out 43h,al	
        mov ax,1193
        out 40h,al
        mov al,ah
        out 40h,al
        ;---------                  

        MOV AL,08H
        MOV AH,35H
        INT 21H
        PUSH ES
        PUSH BX
        PUSH DS	
        MOV DX,OFFSET RING
        MOV AX,SEG RING
        MOV DS,AX
        MOV AL,08H
        MOV AH,25H
        INT 21H
        POP DS
        IN  AL,21H
        AND  AL,11111110B      ;关IR0中断请求
        OUT 21H,AL
        STI
        ;判断按键部分{{
        CALL MENUSHOW                
CD:     
        CALL KEYFIND           ;接收用户按键    
        CMP  KEY,'G'
        JNZ  PM                ;转去判断'M'
        TEST FLAG,01H
        JNZ  CD 
        MOV  NUM,0             ;记录个数清零
        MOV  VAL,0
        MOV  BUFFER[0],10      ;第一位置'-'符        
        MOV  BUFFER[2],0       ;其它位清零
        MOV  BUFFER[3],0        
        MOV  BUFFER[5],0               
        OR   FLAG,00000101B    ;设置比赛开始标识D0
        JMP  CD   
     PM:                       ;判断是否'M',是则记录一个成绩
        CMP KEY,'M'
        JNZ PP                 ;转去判断'P'
        ;TO DO:在此添加一个记录到MEMORY
        TEST FLAG,00000100B    ;判断是否可以保存成绩
        JZ   CD                ;当前不可保存转到cd 
        CMP  NUM,8             ;判断是否有8个记录了
        JZ   STOP              ;已有8个记录则清比赛和可存储标志,且num置0
        CALL SAVE              ;调用保存函数
        OR   FLAG,02H          ;置有记录标志
        JMP CD 
     PP:                        ;判断是否'p'键,是则显示成绩
        CMP  KEY,'P'
        JNZ  PE                 ;不是'P'键转去判断'E'
        TEST FLAG,00000010B     ;测试是否有记录保存在存储区中
        JZ   CD                 ;如果没有则继续等待用户按键
        CALL SHOW               ;调用显示函数
        JMP CD
     PE:                        ;发送数据到显示器
        CMP  KEY,'E'
        JNZ  PA
        TEST FLAG,00000010B
        JZ   CD
        CALL SEND
        JMP  CD
     PA:                        ;结束比赛
        CMP KEY,'A'
        JNZ PR
        ;TO DO:比赛结束
  STOP: AND FLAG,11111010B      ;清比赛和可存储标志位
        ;MOV NUM,0               ;请记录个数为0
        ;MOV VAL,0
        MOV BUFFER[0],10        ;第一位置'-'符
        MOV BUFFER[2],0         ;显示缓冲清零
        MOV BUFFER[3],0
        MOV BUFFER[5],0
        JMP CD
     PR:                         ;返回DOS
        CMP KEY,'R'
        JNZ CD       
        ;}}end.
        CLI
        POP DX
        POP DS
        MOV AL,08H
        MOV AH,25H
        INT 21H
        MOV AH,4CH
        INT 21H 
MAIN ENDP

INIT8251  PROC    ;8251初始化
   PUSH DX
   PUSH CX
   PUSH BX
   PUSH AX

   MOV CX,3
   MOV AL,0
   MOV DX, 219H
Y: OUT DX,AL
   CALL DELAY
   LOOP Y
   MOV  AL,40H
   OUT  DX,AL
   CALL DELAY
   MOV  AL,4EH
   OUT  DX,AL
   CALL DELAY
   MOV  AL,27H
   OUT DX,AL
   CALL DELAY

   POP AX
   POP BX
   POP CX
   POP DX
   RET
DELAY: 
       PUSH  CX
       MOV  CX,20
GG:    LOOP  GG
       POP  Cx
       RET
INIT8251  ENDP

INIT8253   PROC 
      PUSH DX
      PUSH CX
      PUSH BX
      PUSH AX

      MOV DX,0
      MOV AX,250
      MOV BX,1000
      MUL BX
      MOV BX,1200*16
      DIV BX
      MOV BX,AX
      MOV DX,203H
      MOV AL,036H
      OUT DX,AL
      MOV DX,200H
      MOV AX,BX
      OUT DX,AL
      MOV AL,AH
      OUT DX,AL
     
      POP AX
      POP BX
      POP CX
      POP DX
      RET
INIT8253   ENDP

SEND PROC 
      PUSH DS
      PUSH ES
      PUSH DX
      PUSH CX
      PUSH BX
      PUSH AX
      PUSH DI
      PUSH SI
      MOV  AX,DSEG
      MOV  DS,AX
      MOV  ES,AX
      CALL INIT8253
      CALL INIT8251 
;-----------------
          ; MOV CL,1
       MOV  SI,OFFSET MEMORY
M0:    MOV  AL,[SI]
       OR   AL,30H
       INC  SI
       INC  N
       
       MOV  BL,AL
       MOV  DX,219H
M1:    IN   AL,DX
       TEST AL,01H
       JZ   M1
       MOV DX,218H
       MOV AL,BL
       OUT DX,AL
       call delay
       
       
         
LOOP3:   MOV DX,219H
        IN  AL,DX
        TEST AL,02H
        JZ  LOOP3
        MOV DX,218H
	IN  AL,DX
	MOV DL,AL
	MOV AH,02H
	INT 21H
        
        MOV  AL,NUM
        MOV  BL,6
        MUL  BL
       PUSH AX 
        MOV  AL,N
        MOV  AH,0 
        MOV  BL,6
        DIV BL
        CMP AH,0
        JNZ LL 
     
         ;INC  CL
         ;cmp CL,7
         ;JNZ   LL
         
         mov dl,0dh
         mov ah,2
         int 21h
         mov dl,0ah
         mov ah,2
         int 21h 
        
        ; MOV CL,1
  LL:   POP AX
         CMP  N,AL
	 JB M0
        
;-----------------    
      POP SI
      POP DI
      POP AX
      POP BX
      POP CX
      POP DX
      POP ES
      POP DS
SEND ENDP

MENUSHOW PROC
   PUSH AX
   MOV  DX,OFFSET MENU
   MOV  AH,9
   INT 21H
   POP  AX
   RET
MENUSHOW ENDP

SAVE PROC   ;保存8个记录的函数
        PUSH DS
        PUSH ES
        PUSH DX
        PUSH CX
        PUSH BX
        PUSH AX
        PUSH DI
        PUSH SI
        MOV AX,DSEG
        MOV DS,AX
        MOV ES,AX
        
        CMP BUFFER+2,6    ;判断记录是否大于一分钟,大于不保存成绩
        JZ  EXIT
        MOV CX,5
        CLD
        MOV AL,NUM
        MOV BL,6
        MUL BL            ;计算下一个记录存放的首地址偏移量(相对于MEMORY)   
        INC NUM           ;记录个数加1             
        MOV SI,OFFSET BUFFER
        MOV DI,OFFSET MEMORY
        ADD DI,AX
        MOV  AL,NUM        ;保存名次
        MOV  [DI],AL
LOOP1:  
        INC  SI
        INC  DI
        MOV  AX,[SI]       ;循环将buffer中的内容送至保存区中
        MOV  [DI],AX        
        LOOP LOOP1                

        ;debug{{
        mov bx,[di-5]
        or  bl,30h
        mov dl,bl
        mov ah,2
        int 21h        
        mov dl,'-'
        mov ah,2
        int 21h
        mov bx,[di-3]
        or  bl,30h
        mov dl,bl
        mov ah,2
        int 21h
        mov bx,[di-2]
        or  bl,30h
        mov dl,bl
        mov ah,2
        int 21h 
        mov dl,'-'
        mov ah,2
        int 21h
        mov bx,[di-0]
        or  bl,30h
        mov dl,bl
        mov ah,2
        int 21h 
        mov dl,0dh
        mov ah,2
        int 21h
        mov dl,0ah
        mov ah,2
        int 21h
        ;}}end.
EXIT:
        POP SI
        POP DI
        POP AX
        POP BX
        POP CX
        POP DX
        POP ES
        POP DS 
        RET
SAVE ENDP

SHOW PROC        ;显示成绩函数
     PUSH DS
     PUSH ES
     PUSH DX
     PUSH CX
     PUSH BX
     PUSH AX
     PUSH DI
     PUSH SI
     MOV  AX,DSEG
     MOV  DS,AX
     MOV  ES,AX
;-----------------------          
     MOV  AL,NUM
     CMP  VAL,AL         ;比较显示记录是否超出保存的范围
     JNZ  Z
     MOV  VAL,0
Z:   MOV  CX,6
     MOV  AL,VAL
     MOV  BL,6
     MUL  BL
     MOV  DI,OFFSET BUFFER
     MOV  SI,OFFSET MEMORY
     ADD  SI,AX
Z1:  MOV  AX,[SI]
     MOV  [DI],AX
     INC  SI
     INC  DI
     LOOP Z1     
     INC  VAL                  ;准备显示下一记录
;-----------------------
     POP SI
     POP DI
     POP AX
     POP BX
     POP CX
     POP DX
     POP ES
     POP DS 
     RET 
SHOW ENDP
 
KEYFIND PROC 
   PUSH DS
   PUSH ES
   PUSH DX
   PUSH CX
   PUSH BX
   PUSH AX
   PUSH DI
   PUSH SI

   MOV AX,DSEG
   MOV DS,AX
   MOV ES,AX

A1:   mov dx,20bh
      mov al,10000010b
      
wait1:out dx,al
     mov al,0
     mov dx,208h
     out dx,al
     mov dx,209h
     in  al,dx     
     and al,07h
     cmp al,07h     
     jz wait1
     push ax
     push ax

     mov cx,6000h
LOOP2:loop LOOP2

     mov dx,20bh
     mov al,10010000b
     out dx,al
     pop ax
     mov dx,209h
     out dx,al
     mov dx,208h
     in  al,dx
    
     pop bx
     mov ah,bl
     lea di,keytab
     cld
     mov cx,20
     repnz scasw
     jnz A1
     mov ax,19
     sub ax,cx
     lea bx,KEYASC
     xlat

     MOV        BL,AL
     ;PUSH	AX
     ;MOV	Dx,ax
     MOV        KEY,AL    ;保存用户按键
     ;MOV        DL,KEY
     ;MOV	AH,02H    ;在命令提示符中显示用户按键,测试用
     ;INT	21H
        
     MOV	AL,82H
     MOV 	DX,20bH
     OUT 	DX,AL
A2:  MOV	AL,0
     MOV	DX,208H
     OUT	DX,AL
     MOV	DX,209H
     IN	        AL,DX
     AND	AL,07H
     CMP	AL,07H
     JNZ	A2
     ;PUSH	AX
     MOV	CX,6000H
L1:  LOOP	L1
     ;JMP	A1     

     POP SI
     POP DI
     POP AX
     POP BX
     POP CX
     POP DX
     POP ES
     POP DS
     RET
KEYFIND ENDP

RING PROC 
    PUSH DS
    PUSH ES
    PUSH AX
    PUSH BX
    PUSH CX
    PUSH DX
    PUSH DI
    PUSH SI
    MOV AX,DSEG
    MOV DS,AX
    MOV ES,AX
                   
    TEST FLAG,01H
    JZ   AB1

    STI                                         
    DEC COUNT
    JNZ AB1                              
		     
    MOV COUNT,18
    ;毫秒{{
    INC BUFFER+5
    CMP BUFFER+5,10
    JNZ AB1
    MOV BUFFER+5,0
    ;}}end

    ;秒个位{{
    INC BUFFER+3
    CMP BUFFER+3,10
    JNZ AB1
    MOV BUFFER+3,0
    ;}}end

    ;秒十位{{
    INC BUFFER+2
    CMP BUFFER+2,6
    JNZ AB1
    MOV BUFFER+2,0
    ;}}end			
AB1: LEA SI,BUFFER
     LEA BX,SEGTAB
     MOV CL,01H
ab2: MOV AL,[SI]
     XLAT
    MOV DX,211H
    OUT DX,AL
    MOV AL,CL
    DEC DX
    OUT DX,AL
    PUSH CX
    MOV CX,9000h
AB: LOOP AB
    POP CX
    INC SI
    SHL CL,1
    CMP CL,40H
    JNZ AB2 
    mov al,0
    out dx,al
			 
    mov al,20h
    out 20h,al
    CLI
NEXT:		     
    POP SI
    POP DI
    POP DX
    POP CX
    POP BX
    POP AX
    POP ES
    POP DS
    IRET
RING ENDP
CSEG ENDS 
     END MAIN

⌨️ 快捷键说明

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