汇编语⾔中断程序实例——定时⼩程序;计算机在系统加电期间,把系统定时器初始化为每55ms发出⼀次中断请求。CPU在相应定时中断请求后转⼊08H号中断处理程序。
;BIOS提供的08H号中断处理程序中有⼀条中断指令“INT 1CH”。所以每秒要调⽤1000/55≈18.2次1CH号中断处理程序。
;⽽BIOS的1CH号中断处理程序实际上并没有执⾏任何⼯作,只有⼀条中断返回指令(IRET)
;这样安排的⽬的就是为应⽤程序留下⼀个软接⼝,应⽤程序只要提供新的1CH号中断处理程序,就能实现某些周期性的⼯作。
;本实验就是利⽤这个软接⼝实现“实时时钟显⽰”
CODE  SEGMENT
ASSUME  CS:CODE
YYY    DW  0
MON    DB  0
DDD    DB  0
OLD1C  DD  0
COUNT  DW  0
HHH    DB  0
MMM    DB  0
SSS    DB  0
NOZERO DB  0
TIMECOUNT  DW  0
TIMEFLY  DW  0
TIMEAGO  DB  0
TIMENOW  DB  0
SHOWTIME DW  0
START  PROC  FAR
CALL  INPUTDEC    ;输⼊定时时长,保存在BX中
MOV  TIMEFLY,BX
PUSH  CS
POP  DS      ;把CS的值赋给DS
;设置新的中断向量
MOV  AX,351CH    ;读取1C号中断向量
INT  21H    ;ES:BX是读取出的中断向量
MOV  CS:WORD  PTR OLD1C,BX
MOV  CS:WORD  PTR OLD1C+2,ES                ;保存原1C号中断向量
MOV  DX,OFFSET  INT1C
MOV  AX,251CH    ;设置中断向量,DS:DX=中断向量,AL=中断类型号
INT  21H    ;此后每55秒就进⼊⼀次新的1CH号中断处理程序
CLOCKGO:
CMP  SHOWTIME,5    ;显⽰时间到了吗?
JC  CLOCKGO    ;没到,循环;否则执⾏结束
;结束程序之前,应把1C号中断向量还原回去
LDS  DX,CS:OLD1C
MOV  AX,251CH
INT  21H
;结束程序,返回操作系统
MOV  AH,4CH
INT  21H
START  ENDP
INT1C  PROC  FAR
CMP    COUNT,0    ;中断次数为0,经过⼤约⼀秒
JZ    NEXT
DEC    COUNT
IRET
IRET
NEXT:
MOV    COUNT,17    ;置中断次数初值
STI
PUSH  DS
PUSH  ES
PUSH  AX
PUSH  BX
PUSH  CX
PUSH  DX
汇编语言结束指令
PUSH  SI
PUSH  DI
MOV    AH,2CH
INT    21H      ;读系统时间
MOV    HHH,CH    ;⼩时
MOV    MMM,CL    ;分钟
MOV    SSS,DH    ;秒
CMP    TIMEAGO,DH    ;是不是新的⼀秒?    JNE    GOON      ;是,执⾏GOON,否则返回    POP    DI
POP    SI
POP    DX
POP    CX
POP    BX
POP    AX
POP    ES
POP    DS
IRET
GOON:
MOV    TIMEAGO,DH    ;新的⼀秒
INC    TIMECOUNT    ;计时器加⼀
MOV  AH,2AH
INT  21H      ;读系统⽇期
MOV  YYY,CX      ;年
MOV  MON,DH      ;⽉
MOV  DDD,DL      ;⽇
CALL  CLS      ;清屏
MOV    BH,0
MOV    DX,0105H
MOV    AH,2
INT    10H      ;设置光标位置(1,5)
MOV    BX,YYY    ;输出年
CALL  OUTPUTDEC
CALL  OUTPOINT    ;点
MOV    BL,MON    ;输出⽉
MOV    BH,0
CALL  OUTPUTDEC
CALL  OUTPOINT    ;点
MOV    BL,DDD    ;输出⽇
MOV    BH,0
CALL  OUTPUTDEC
CALL  WHITESPACE    ;空格
MOV    BL,HHH    ;时
MOV    BH,0
CALL  OUTPUTDEC
CALL  OUTMAOHAO    ;冒号
CALL  OUTMAOHAO    ;冒号
MOV    BL,MMM    ;秒
MOV    BH,0
CALL  OUTPUTDEC
CALL  OUTMAOHAO    ;冒号
MOV    BL,SSS    ;秒
MOV    BH,0
CALL  OUTPUTDEC
MOV  BX,TIMEFLY
CMP  BX,TIMECOUNT    ;⽐较定时是否已到
JNC  RETURN      ;没到,返回;否则继续执⾏显⽰⽅块
SHOWWORD:
INC  SHOWTIME
MOV  BH,0
MOV  DX,0140H
MOV  AH,2
INT  10H      ;设置光标位置(1,65)
MOV  AL,09
MOV  CX,1
MOV  BL,0CCH
MOV  AH,9
INT  10H      ;显⽰⼀红⾊⽅块
RETURN:
POP    DI
POP    SI
POP    DX
POP    CX
POP    BX
POP    AX
POP    ES
POP    DS
IRET
INT1C  ENDP
;清屏
CLS    PROC
MOV    AX,0600H
MOV    CX,0
MOV    DX,184FH
MOV    BH,7
INT    10H
RET
CLS    ENDP
;⼗进制数输⼊(0—65535)
;输⼊数据存储在BX中,以回车符结束
INPUTDEC PROC
PUSH CX
MOV BX,0
P1:
MOV AH,1
INT 21H
CMP AL,0DH  ;与回车符⽐较,判断是否结束
JE DECEXIT
SUB AL,30H  ;ASCII码减去30,得本次所输数值
MOV AH,0  ;AH清0
XCHG AX,BX  ;交换AX,BX
XCHG AX,BX  ;交换AX,BX
MOV CX,10
MUL CX  ;AX(原BX中数,以前输的数)10
XCHG AX,BX  ;交换AX,BX
ADD BX,AX  ;将本次输的数加进BX中
JMP P1
DECEXIT:
POP CX
RET
INPUTDEC ENDP
;⼗进制输出(0-65535)
;数据保存在BX中
OUTPUTDEC PROC
PUSH CX
MOV NOZERO,0
MOV CX,10000
CALL PROCESS
MOV CX,1000
CALL PROCESS
MOV CX,100
CALL PROCESS
MOV CX,10
CALL PROCESS
MOV CX,1
CALL PROCESS
CMP NOZERO,0
JNE OUTPUTEXIT
MOV DL,30H
MOV AH,2
INT 21H
OUTPUTEXIT:
POP CX
RET
OUTPUTDEC ENDP
PROCESS PROC
MOV AX,BX
MOV DX,0
DIV CX
MOV BX,DX
MOV DL,AL
CMP DL,0
JNE OUTPUT  ;该位不是0,输出
CMP NOZERO,0  ;该位是0,判断是否为⾸位 JNE OUTPUT  ;不是⾸位,输出
JMP PROCEXIT  ;是⾸位,退出OUTPUT:
MOV NOZERO,1
ADD DL,30H
MOV AH,2
INT 21H
PROCEXIT:
RET
PROCESS ENDP
;输出点号
OUTPOINT PROC
MOV DL,'.'
MOV AH,2
INT 21H
RET
OUTPOINT ENDP
;输出冒号
OUTMAOHAO PROC
OUTMAOHAO PROC  MOV DL,':'
MOV AH,2
INT 21H
RET
OUTMAOHAO ENDP
;输出空格WHITESPACE PROC  MOV DL,20H
MOV AH,2
INT 21H
RET
WHITESPACE ENDP
CODE  ENDS
END  START

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。