汇编中断知识之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

时间: 2024-10-01 23:31:34

汇编中断知识之INT 1CH的相关文章

汇编基础知识之输入输出

最近在学习汇编程序,但输入输出是我遇到的第一个难题,这里就简单讲诉一些汇编的基本输出输出字符串.字符.输出数字等知识,仅供大家学习.这只是一些基础知识,汇编高手亦可以温习一些基础的输入输出知识. 一.输出字符串 下面是调用9号功能输出字符串"Hello World"的代码. DATAS SEGMENT ;输出的字符串 13回车 10换行 $结束标志(\0) Input DB 13,10,'Hello Word!',13,10,'$' DATAS ENDS CODES SEGMENT A

汇编排序知识之冒泡排序

这里简单介绍汇编中是如何进行冒泡排序的,首先先回顾C语言中的冒泡排序知识及算法,再讲解汇编实现的过程,更好的巩固和联系了编程的思想. 一. C语言--冒泡排序 冒泡排序的基本概念: 依次比较相邻的两个数,将小数放在前面,大数放在后面.每完成一遍查找都会找到一个最大数,直至排序结束.   由上表可见每轮排序都能确定一个最大数,直至排序结束,它相对应的C语言代码如下:其中j参数设置为N-i-1简化了排序的复杂度,也可以是N-1. 二.汇编--冒泡排序 相对应的汇编冒泡排序如下图所示: DATAS S

VC内嵌汇编基础知识

http://www.cppblog.com/xingkongyun/archive/2008/12/21/70003.html 为了加速游戏,一提起汇编语言,大家也许会感到很神秘.其实如果你学起来就会发现,它并非想象中那样难.特别是内嵌汇编,由于它和C++紧密结合, 使你不必考虑很多烦琐的细节(例如输入输出函数的写法),学习起来比较容易.使用内嵌汇编,特别是使用MMX指令,可以大大提高各种游戏中常见特效的速 度,对于编出一个漂亮的游戏非常重要.学好汇编语言还有一个特别有趣的用处:可以观察和看懂

内联汇编基础知识

几天看了孙原等几位仁兄关于汇编语言的几篇文章,颇感兴趣.于是查了查98版的MSDN中,其中也有几篇关于内联汇编的基础,索引字是asm.讲得不算太难,于是试着将其内容写下来了,特此贴来. 一.内联汇编简述 Visual C++ 6.0编译器下,内联汇编可以使用所有的Intel486处理器指令集.而且可以对目标处理器建立起伪指令来实现附加指令功能.内联汇编可以使用MASM编译器所允许的表达式,其中的一些表达式可以通过操作符和操作数的组合,对单精值进行运算. 虽然内联汇编可以访问C\C++中的数据变量

汇编-8259A中断控制器的应用,帮我看一下代码有问题吗,还有硬件应该怎么连线

问题描述 8259A中断控制器的应用,帮我看一下代码有问题吗,还有硬件应该怎么连线 实验内容 用8259A的输出作为中断请求信号使8259A产生中断,进入中断后显示一个字符串.中断请求通过8259的IRQ3端输入,中断源要求是8253定时器输出的脉冲,并把8253的OUT0和总线槽IRQ3连接好. 编写程序,要求每次主机响应外部中断IRQ3时,显示字符串"THIS IS A 8259A INTERRUPT!"(或其它串),中断十次后,程序退出. data segment io8253a

汇编源码系列之exec

这个都是过去DOS时代的汇编源码,虽然已经过去了,但是对于学习汇编还是有帮助的,汇编语言只是程序员一门基础语言,大多人掌握即可,不一定要深入研究....... ; EXECSUB - execute program from compiled BASIC - requires DOS 2.00; This version allows one BASIC program to call another;; CALL EXECSUB(PROG$,PARM$,FCB1$,FCB2$,RETCD%);

解析四则表达式的编译过程及生成汇编代码

1.前序这是编译原理的实验,自认为是上大学以来做过的最难的一个实验. 实验用到的基础知识:C语言.数据结构.汇编(只需简单的了解). 开发工具:VC 2.问题描述编译整数四则运算表达式,将整数四则运算表达式翻译为汇编语言代码. 消除左递归后的文法: E→TE' E'→+TE' |ε T→FT' T'→*FT' |ε F→(E) | i 消除左递归后的翻译模式: E ::= T {E'.i:=T.nptr} E' {E.nptr:=E'.s} E'::= + T {E'1.i:=mknode('+

解析四则表达式的编译过程及生成汇编代码_C 语言

1.前序这是编译原理的实验,自认为是上大学以来做过的最难的一个实验.实验用到的基础知识:C语言.数据结构.汇编(只需简单的了解).开发工具:VC 2.问题描述编译整数四则运算表达式,将整数四则运算表达式翻译为汇编语言代码.消除左递归后的文法:E→TE'E'→+TE' |εT→FT'T'→*FT' |εF→(E) | i消除左递归后的翻译模式:E ::=     T    {E'.i:=T.nptr}E'    {E.nptr:=E'.s}E'::=      + T  {E'1.i:=mknod

中断子系统4_i8259a中断控制器

// 8259A 中的寄存器: // ICW: Initialization Command Word,初始化命令寄存器 // OCW: Operation Command Word,操作命令字,用于控制 8259A // IRR: Interrupt Request Register,中断请求寄存器,共 8bit,对应 IR0~IR7 八个中断管脚.当某个管脚的中断请求到来后, // 若该管脚没有被屏蔽,IRR 中对应的 bit 被置1.表示 PIC 已经收到设备的中断请求,但还未提交给 CP