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

📄 mm.txt

📁 用8255,8253,8259实现的具有显示时分秒的电子时钟.
💻 TXT
字号:
求高手帮我修改系统时钟汇编语言代码!!!!!  
 CURSOR EQU 45H 
 ATTRIB EQU 2FH 
 CODE SEGMENT 
 ASSUME CS:CODE,DS:CODE 
 START: 
 JMP GO 
 OLDCUR DW ? 
 OLD1C DW 2 DUP(?) 
 NEWINT1C: 
 PUSHF 
 CALL DWORD PTR CS:OLD1C 
 PUSH AX 
 PUSH BX 
 PUSH CX 
 PUSH DX 
 XOR BH,BH 
 MOV AH,3 
 INT 10H 
 MOV CS:OLDCUR,DX 
 MOV AH,2 
 XOR BH,BH 
 MOV DX,CURSOR 
 INT 10H 
 MOV AH,2     ;读取系统时钟 
 INT 1AH 
 PUSH DX 
 PUSH CX 
 POP BX 
 PUSH BX 
 CALL SHOWBYTE 
 CALL SHOWCOLON 
 POP BX 
 XCHG BH,BL 
 CALL SHOWBYTE 
 CALL SHOWCOLON 
 POP BX 
 CALL SHOWBYTE 
 MOV DX,CS:OLDCUR 
 MOV AH,2 
 XOR BH,BH 
 INT 10H 
 POP DX 
 POP CX 
 POP BX 
 POP AX 
 IRET 
 SHOWBYTE PROC NEAR 
 PUSH BX 
 MOV CL,4 
 MOV AL,BH 
 SHR AL,CL 
 ADD AL,30H 
 CALL SHOW 
 CALL CURMOVE 
 POP BX 
 MOV AL,BH 
 AND AL,0FH 
 ADD AL,30H 
 CALL SHOW 
 CALL CURMOVE 
 RET 
 SHOWBYTE ENDP 

 SHOWCOLON PROC NEAR 
 MOV AL,':' 
 CALL SHOW 
 CALL CURMOVE 
 RET 
 SHOWCOLON ENDP 

 CURMOVE PROC NEAR 
 PUSH AX 
 PUSH BX 
 PUSH CX 
 PUSH DX 
 MOV AH,3 
 MOV BH,0 
 INT 10H 
 INC DL 
 MOV AH,2 
 INT 10H 
 POP DX 
 POP CX 
 POP BX 
 POP AX 
 RET 
 CURMOVE ENDP 

 SHOW PROC NEAR 
 PUSH AX 
 PUSH BX 
 PUSH CX 
 MOV AH,09H 
 MOV BX,ATTRIB 
 MOV CX,1 
 INT 10H 
 POP CX 
 POP BX 
 POP AX 
 RET 
 SHOW ENDP 

 GO: 
 PUSH CS 
 POP DS 
 MOV AX,351CH ;取中断向量 
 INT 21H 
 MOV OLD1C,BX      ;保存原中断向量 
 MOV BX,ES 
 MOV OLD1C+2,BX 
 MOV DX,OFFSET NEWINT1C ;置新的中断向量 
 MOV AX,251CH 
 INT 21H 
 MOV DX,OFFSET GO 
 SUB DX,OFFSET START 
 MOV CL,4 
 SHR DX,CL 
 ADD DX,11H 
 MOV AX,3100H       ;结束并驻留 
 INT 21H 
 CODE ENDS 
 END START  
 ................................................
...............................................
COUNT_VAL =18 ;间隔“滴答”数   
  DPAGE   =0 ;显示页号   
  ROW           =23             ;显示时钟的行号   
  COLUMN =80-BUFF_LEN ;显示时钟的开始列号   
  COLOR   =07H ;显示时钟的属性值   
    
  ;代码   
  CSEG SEGMENT   
  ASSUME   CS:CSEG,DS:CSEG   
  ;1CH号中断处理程序使用的变量   
  COUNT DW COUNT_VAL;“滴答”计数   
  HHHH DB   ?,?,':' ;时   
  MMMM DB ?,?,':' ;分   
  SSSS DB ?,? ;秒   
  BUFF_LEN   =   $-OFFSET   HHHH ;BUFF_LEN为显示信息长度   
  CURSOR DW   ?   
  OLD1CH DD   ?   
  OLD53 DW   ?   
  ;1CH号中断处理程序代码   
  NEW1CH: CMP CS:COUNT,0 ;是否已到显示时候?   
  JZ NEXT ;是,转   
  DEC CS:COUNT ;否   
  JMP DWORD   PTR   CS:OLD1CH   
  ;   
  NEXT:   
    
    
  MOV CS:COUNT,COUNT_VAL ;重置间隔数的初值   
    
  STI   
  PUSH DS   
  PUSH ES   
  PUSH AX   
  PUSH BX   
  PUSH CX   
  PUSH DX   
  PUSH SI   
  PUSH DI   
    
  PUSH CS   
  POP DS ;置数据段寄存器   
  PUSH DS   
  POP ES ;置代码段寄存器   
    
    
    
    
  CALL GET_T ;取时间   
  ; MOV BH,DPAGE   
  ; MOV AH,3 ;取原光标位置   
  ; INT 10H   
  ; MOV CURSOR,DX ;保存原光标位置   
    
    
    
    
    
  MOV           CX,BUFF_LEN   
  MOV SI,OFFSET   HHHH   
  MOV AX,0B800H   
  MOV ES,AX   
  MOV DI,1992*2   
  MOV Ah,7   
    
  SHOW: MOV Al,[SI]   
  MOV ES:[DI],AX   
  INC SI   
  INC DI   
  INC DI   
    
  LOOP SHOW   
    
  ; MOV BH,DPAGE ;恢复原光标   
  ; MOV DX,CURSOR   
  ; MOV AH,2   
  ; INT 10H   
    
  ; MOV BP,OFFSET   HHHH   
  ; MOV BH,DPAGE   
  ; MOV DH,ROW   
  ; MOV DL,COLUMN   
  ; MOV BL,COLOR   
  ; MOV           CX,BUFF_LEN   
  ; MOV AL,0   
  ; MOV AH,13H ;显示时钟   
  ; INT 10H   
  POP DI ;恢复现场   
  POP SI   
  POP DX   
  POP CX   
  POP BX   
  POP AX   
  POP ES   
  POP DS   
    
  ; IRET ;中断返回   
  JMP DWORD   PTR   CS:OLD1CH   
  ;   
  ;子程序说明信息略   
  GET_T PROC   
  MOV AH,2 ;取时间信息   
  INT 1AH   
  MOV AL,CH ;把时数转为可显示形式   
  CALL TTASC   
  XCHG AH,AL   
  MOV WORD   PTR   HHHH,AX ;保存   
  MOV AL,CL ;把分数转为可显示形式   
  CALL TTASC   
  XCHG AH,AL   
  MOV WORD   PTR   MMMM,AX ;保存   
  MOV AL,DH ;把秒数转为可显示形式   
  CALL TTASC   
  XCHG AH,AL   
  MOV WORD   PTR   SSSS,AX ;保存   
  RET   
  GET_T ENDP   
  ;   
  ;子程序名:TTASC   
  ;功能:把两位压缩的BCD码转换为对应的ASCII码   
  ;入口参数:AL=压缩BCD码   
  ;出口参数:AH=高位BCD码所对应的ASCII码   
  ;       AL=低位BCD码所对应的ASCII码   
  TTASC   PROC   
  MOV AH,AL   
  AND AL,0FH   
  SHR AH,1   
  SHR AH,1   
  SHR AH,1   
  SHR AH,1   
  ADD AX,3030H   
  RET   
  TTASC ENDP   
  ;===========================   
  ;初始化部分代码和变量   
  ;OLD1CH DD   ? ;原中断向量保存单元   
    
  ;EXIT: LDS DX,OLD1CH ;取保存的原1CH号中断向量   
  ; MOV AX,251CH   
  ; INT 21H ;恢复原1CH号中断向量   
  ; MOV AL,35H   
  ; OUT 43H,AL   
  ; MOV AX,OLD53   
  ; OUT 43H,AL   
  ; MOV AL,AH   
  ; OUT 43H,AL   
  ; MOV AX,4C00H   
  ; INT 21H   
    
  START:   
  MOV AL,0   
  OUT 43H,AL   
  IN AL,40H   
  MOV AH,AL   
  IN AL,40H   
  XCHG AL,AH   
  MOV OLD53,AX   
    
  MOV AL,34H   
  OUT 43H,AL   
  MOV BX,11932   
  MOV AL,BL   
  OUT 40H,AL   
  MOV AL,BH   
  OUT 40H,AL   
    
    
  PUSH CS   
  POP DS   
  MOV AX,351CH ;取1CH号中断向量   
  INT 21H   
  MOV WORD   PTR   OLD1CH,BX;保存   
  MOV WORD   PTR   OLD1CH+2,ES   
  MOV DX,OFFSET   NEW1CH   
  MOV AX,251CH ;置新的1CH号中断向量   
  INT 21H   
  MOV DX,OFFSET   START   
  ADD DX,15   
  MOV CL,4   
  SHR DX,CL   
  ADD DX,10H   
    
    
  MOV AH,31H   
    
    
  ; MOV AH,0BH   
  ; INT 21H   
  ; CMP AL,00H   
  ; JNZ EXIT   
    
    
  ; MOV AH,0 ;假设其他工作是等待按键   
  ; INT 16H   
    
  ; MOV AH,4CH ;结束   
  INT 21H   
  CSEG ENDS   
  END START   

 

⌨️ 快捷键说明

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