嗯,我猜你问的是PC的,不是单片机
一、汇编语言的中断分以下几种:
1BIOS中断,这是固化到BIOS程序中的,每次开机BIOS会自动加载到指定内存
2186下的DOS中断,在DOS系统被加载后,系统会延用BIOS的中断向量,并向里面添加一些新的向量,这些功能便是DOS系统自带的中断服务程序
3286及以上的系统中断,PC会进入保护模式,在OS被加载后,中断由IDT控制,这一机制类似于中断向量表,只不过中断向量换成了选择子。这样的中断机制对不同型号的CPU有略微的差别,这里不细说了,我自己也没全弄明白。
二、中断实现的方式(8086下的普通中断)
听说过“优先级编码器”没?——如果同时有两个信号被接收,会指定某一个信号的优先级高,先执行它。中断就是类似的处理方法。
当CPU获取到某一高 *** 作优先级的信号时(比如时钟,每固定时间就会触发一次;比如键盘响应,用户希望通过Ctrl+C来退出任何正在执行的DOS程序),CPU会将当前正在执行的程序挂起来,转而去处理该信号(类似于Call,但略有不同,你看的书应该会讲到)。
处理中断时,系统会将其解释为一个标号,比如int 9h、int 21h等等。这个标号是一个序号,在内存某处存放着连续的一个表格,这个标号便是表格中的“行号”,只不过,每一行是两列,包括了该中断的处理程序的段基址和偏移量。中断向量表是从0000:0000开始的,每4字节为一个表项。中断标号x4就是对应的中断向量表项所存的地址,高地址是基地址,低地址是偏移。
这么说不知道你懂不懂。。。
反正总结一下你的问题吧,中断服务程序是加载到内存中的,它在加载前可能是存在BIOS芯片上,也可能是存在硬盘里的;中断向量表里只能写上中断处理程序的入口地址,要知道每个表项只有4字节;具体的中断服务程序,我不信你学汇编的书上不讲,我大概讲一下:CPU的INTR引脚获得了中断信号,得到了标号,比方说是5号,中断向量表项为0000:000A,读取这个内存,得到中断程序入口地址比方说是AAAA:BBBB,那么它会将当前的CS/IP、Flags寄存器入栈,然后转到AAAA:BBBB处去执行一直到iret指令返回原任务(或许该中断结束了这个任务,就不会返回了)。
至于保护模式的中断,相信你暂时还没遇到。到后面还有 *** 控8259A芯片来实现高级中断的,这个就不是一般需要学的了。
CALL DELAY
MOV AL,00000000B ;PC2置0,(LCD E端置0)
OUT DX, AL
CALL DELAY
RET
CMD_SETUP ENDP
DATA_SETUP PROC
MOV DX,IO_ADDRESS ;指向8255控制端口
ADD DX,2
MOV AL,00000001B ;PC1置0,PC0=1 (LCD I端=1)
OUT DX, AL
NOP
1以查询方式工作,每计满100个脉冲,则取反P10口线状态。
ORG 0000HMOV TMOD, #06H
MOV TH0, #156
MOV TL0, #156
SETB TR0
LP: JNB TF0, LP
CPL P10
SJMP LP
END
2以中断方式工作,每计满200个脉冲,则取反P10口线状态。
ORG 0000HSJMP START
ORG 000BH
CPL P10
RETI
START:
MOV TMOD, #06H
MOV TH0, #56
MOV TL0, #56
SETB TR0
MOV IE, #82H
SJMP $
END
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW((65536-50000)
SETB TR0
SETB ET0
SETB EA
MOV R0,#0
MOV R2,#0
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW((65536-50000)
SETB TR0
INC R0
CJNE R0,#20,T0E
INC R2
CJNE R2,#10,T001
MOV R2,#0
T001:
MOV A,R2
MOV DPTR,#TABLE
MOV A,@A+DPTR
MOV P0,A
T0E:
RETI
TABLE: ; 共阴极数码管显示代码表
DB 3FH,06H,5BH,4FH,66H ;01234
DB 6DH,7DH,07H,7FH,6fh ;56789
END
#include<reg51h>
#define uchar unsigned char
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f};
uchar num,dat;
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
num++;
if(num>=20)
{
num=0;
dat++;
dat%=10;
P0=table[dat];
}
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
num=0;
dat=0;
while(1);
}
以上就是关于汇编语言的中断服务的中断服务程序是什么全部的内容,包括:汇编语言的中断服务的中断服务程序是什么、用汇编语言写程序0到50000计数、用汇编语言写一个单片机定时器/计数器的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)