汇编中断知识之INT 1CH

最近在编写汇编程序遇到一个使用INT 1CH的程序,INT 1CH是实现定时或周期性的工作,难道INT 1CH就像INT 21H一样直接调用它里面的功能号吗?下面就通过一个程序简单的看看传说中的INT 1CH的.这个程序是实现屏幕背景颜色1秒钟变换一次的实验.
1.INT 1CH中断
INT 1CH其实是调用INT 21H中的25号功能:置中断向量AL=中断号,DS:DX=入口,同时INT21H中的35号功能:取中断向量,AL=中断号,ES:BX=中断程序入口
.
2.该程序中的INT1CH
该程序中是调用子程序设置背景颜色,子程序中使用STI打开中断,CLI关中断,IRET中断返回
.
INT 1CH系统中断是每秒发生18.2次,即调用每秒它18次,所以Count初值赋值为1,先DEC减1,为0执行一次背景色输出,即运行程序就输出背景色.然后Count赋值为18,Count减1,当它为0时变换背景颜色.(1秒
)然后继续Count赋值为18,继续执行中断周期调用.
3.设置背景颜色
调用BIOS INT 10H的06号功能设置屏幕初始化或上卷:属性如下,故背景只有RGB(取0或1)共组合成8种颜色.故Color初值为1FH,每次加8刚好变换成另一种颜色.
详细的代码及注释如下:

DATAS SEGMENT  
    Color	DB	1FH        ;定义的背景颜色表
    Count   DW  1          ;Count计数1秒是变换背景 
DATAS ENDS
 
STACKS SEGMENT STACK 'S'
    ;堆栈段代码
    DW 80 DUP(0)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN	PROC    FAR
    MOV AX,DATAS
    MOV DS,AX            ;将数据段DATAS存入DS中
;------------------------------------------------------------------  
	MOV DX,SEG INT_1CH   ;SEG标号段地址
	MOV DS,DX
	LEA DX,INT_1CH       ;调用子函数INT_1CH 取偏移地址	
	
	;AH=25H功能:置中断向量AL=中断号 DS:DX=入口
	MOV AH,25H                
	MOV AL,1CH           ;设置新的1CH中断向量
	INT 21H
	
	;退出程序并返回操作系统
	MOV AH,4CH
    INT 21H
MAIN	ENDP	
;------------------------------------------------------------------
;子程序:显示背景 FAR(主程序和子程序不在同一代码段)
INT_1CH		PROC	FAR
    PUSH AX		 ;保存寄存器
    PUSH BX
    PUSH CX
    PUSH DX
    PUSH DS
    
    STI                  ;开中断
    MOV AX,DATAS
    MOV DS,AX            ;将数据段DATAS存入DS中
    
    ;------------------------------------------
    ;- INT 1CH系统中断每秒发生18.2次          -
    ;- Count计数至18为1秒变换背景颜色         -
    ;- Count初值为1,先减1执行一次显示蓝色背景 -
    ;- 执行时赋值为18,每次减1,减至0更换背景色 -
    ;------------------------------------------
    
    DEC Count            ;Count初值为1,先减1
    JNZ Exit             ;JNZ(结果不为0跳转) 否则Count=0执行背景色输出         
;------------------------------------------------------------------	
	;调用BIOS10H的06号中断设置屏幕初始化或上卷
	
	;--------------------------------
	;- AL=上卷行数 AL=0全屏幕为空白 -
	;- BH=卷入行属性                -
	;- CH=左上角行号 CL=左上角列号  -
	;- DH=右下角行号 DL=右下角列号  -
	;--------------------------------	

	;----------------------------------
	;- BL的颜色属性为IRGB|IRGB        -
	;- 高4位是背景色 低4位是前景色    -
	;- I=高亮 R=红 G=绿 B=蓝 共8色    -
	;----------------------------------
	
	MOV	AH,6      	 ;清全屏
	MOV	AL,0
	MOV	BH,Color         ;起始设置为蓝底白字 1FH=0001(蓝色)|1111B 详解见上表
	MOV	CX,0
	MOV	DX,184FH         ;(全屏)表示18行4F列
	INT	10H
	
	ADD Color,8	         ;0001|1111+8=27H=0010(绿色)|0111 同理加8	
	MOV Count,18             ;计数至18(1秒)重新开始,赋值为18减至0执行变色
;------------------------------------------------------------------   
Exit: 
	CLI                    ;关中断
	POP	DS
	POP	DX
	POP	CX
	POP	BX
    POP	AX		      ;恢复寄存器  
    IRET	              ;中断返回
INT_1CH  ENDP
;------------------------------------------------------------------         
CODES ENDS
END MAIN

它的运行结果是8中背景颜色不断的变换:

        

这仅仅是作者自己的一些想法和程序,有错误或不足的地方希望大家原谅.同时希望能让大家更加清楚的认识到汇编中的:INT ICH、周期性中断变换、背景颜色的设置等知识.同时该代码参考了自己老师的课件知识.
BY:Eastmount原创于2013-5-8

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eastmount

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值