导航:首页 > 编程语言 > 汇编完整中断程序

汇编完整中断程序

发布时间:2023-09-18 04:29:34

⑴ 汇编中断程序

我告诉你思路,例子就不举了,很简单:
1、定义一个dword变量xxx用以存储原来的中断向量(所谓中断向量即中断发生时执行的子程序入口地址)
2、编写自己的中断处理过程(yyy proc far),该处理过程内应保存所有可能修改的寄存器,并在返回前恢复原状;一般情况下,如果还需要执行原有中断处理过程,那么调用jmp far xxx链接到原来的中断过程;如果不需要执行原有过程,那么直接以iret返回即可
3、在主程序开始时,先调用int 35h,获取指定中断号的中断向量,将返回的中断向量存储在xxx变量中
4、调用int 25h,将指定的中断号的中断向量指向自己的过程yyy
5、当前程序在退出前,应再次调用int 25h,将被修改掉的中断号的中断向量恢复为xxx变量的值

⑵ MCS-51单片机中断c语言或汇编编写完整程序

ORG0000H
LJMPMAIN
ORG0003H
LJMPEXT0
ORG0030H
MAIN:
SETBEX0
SETBIT0
SETBEA
CLRP1.0
SJMP$
EXT0:
SETBP1.0
JNBP3.2,$
CLRP1.0
RETI
END

⑶ 用单片机汇编语言编写中断程序

ORG 0000H
LJMP START
ORG 000BH
LJMP Timer0Interrupt

START:
MOV SP,#60H
LCALL InitTimer0

LOOP:
;add your code here!
LJMP LOOP

InitTimer0:
MOV TMOD,#01H
MOV TH0,#0FCH
MOV TL0,#18H
SETB EA
SETB ET0
SETB TR0
RET

Timer0Interrupt:
PUSH DPH
PUSH DPL
PUSH ACC
MOV TH0,#0FCH
MOV TL0,#18H
CPL P1.0
POP ACC
POP DPL
POP DPH
RETI

END

这是定时器0的一个1ms中断一次的程序 在P1.0端口输出1KHz方波

⑷ 汇编中断程序

000BH 0030H是这两个中断的入口地址,也就是发生中断后将要跳到这里来.
T0INT,T1INT都是中断子程序的名字,也相当于地址,我们要跳到那个地方去执行中断子程序!!!!
在程序中,一般只有中断才会用到保护和恢复现场,我到现在还没有看见其它情况用它们的!!!
你的第3个问题就要看你用什么IC了,有的IC自带的有那些功能,你就不需要了,但是51是需要的.至于子程序那就不用中断首地址了,因为你掉用的子程序是固定的,不象中断,不知道发生在什么地方,不好把中断子程序放置,才要定义中断入口!!!!

⑸ 用汇编程序用定时器和中断,编写程序

主程序:
push ds ;保存数据段
mov ax,0000
mov ds,ax ;数据段清零
mov ax,offset irq7 ;取中断程序入口地址
add ax,2000 ;加装时IP=2000地址
mov si,003c ;填8259中断7中断矢量
mov w[si],ax ;填偏移量矢量
mov ax,0000 ;段地址CS=0000H
mov si,003e
mov w[si],ax ;填段地址矢量
pop ds ;弹栈
in al,21 ;读8259中断屏蔽字
and al,7f ;开8259中断7
out 21,al
mov al,b4 ;8253的计数器2为方式2,采用二进制计数,先低后高写入计数值 10110100
out 43,al ;写入方式控制字
mov ax,2e9c 0010 1110 1001 1100B 11932D
out 42,al ;写入低字节计数值 1001 1100
mov al,ah
out 42,al ;写入高字节计数值 0010 1110
mov al,81 ;8255的A口为方式0输出,B口为方式0输出,C口下部输入 1000 0001
out 63,al ;写方式控制字
call first ;调用first子程序,赋计数初值
begi:hlt 延时等待
sti ;开中断
mov ah,01
int 16 ;检测是否按了键盘
jz begi
mov ah,00 ;读键值
int 16
cmp al,0d ;是否按了回车
jnz A1
mov si,4000
not [si+04] ;偏移地址为4004的内存单元内容取反
jmp begi
A1:cmp al,1b ;是否按了ESC键
jnz A2
call first ;重新赋初值,相当于清零
A2:jmp begi
中断程序:
irq7:call disp ;调用disp子程序,用来在数码管显示数据
mov si,4000
cmp [si+04],00 ;判断是否按了第2次回车键
je A4
call addn ;调用addn子程序,用来计数
A4:mov al,20
out 20,al
cli ;关中断
iret ;返回
addn程序:
addn:mov si,4000
add [si+03],01 ;百分之一秒加1
cmp [si+03],0a ;判断是否大于10
jz A5
jmp A9
A5:mov [si+03],00
Add [si+02],01 ;十分之一秒加1
cmp [si+02],0a ;判断是否大于10
jz A6
jmp A9
A6:mov [si+02],00
add [si+01],01 ;秒位加1
cmp [si+01],0a ;判断是否大于10
jz A7
jmp A9
A7:mov [si+01],00
add [si],01 ;十秒位加1
cmp [si],06 ;判断是否大于6
jz A8
jmp A9
A8:mov [si],00 ;大于60:00重新开始
A9: ret
赋初值程序:
first:mov si,4000
mov al,00
mov [si],al
mov [si+01],al
mov [si+02],al
mov [si+03],al
mov [si+04],al
ret
显示程序:
disp:push ax ;保存AX
mov si,4000 ;指向数据缓冲区
mov dl,f7 ;1111 0111 指向数码管
mov al,dl ;al=1111 0111
again:out 60,al ;写端口A
mov al,[si]
mov bx,4100 ;指向数码缓冲区 bx=0100 0001 0000 0000
and ax,00ff ; ax=0000 0000 al
add bx,ax ;得到显示代码 bx=0100 0001 al
mov al,[bx]
out 61,al ;写端口B
call dally :调用延时程序dally
inc si
mov al,dl
test al,01
jz out
ror al,1 ;指向下一个数码管
mov dl,al
jmp again
out: pop ax ;弹出AX
ret
dally:push cx ;延时程序
push ax
mov cx,0010
t1 :mov ax,0010
t2 dec ax
jnz t2
loop t1
pop ax
pop cx
ret
数码缓冲区:
0000:4000 3f,06,5b4f,66,6d,7d,07,7f,6f
二、 设计思想
电子秒表要实现的功能:用键盘中断来控制整个程序,按一下回车键启动电子秒表,再按一下暂停,按一下ESC键清零,用七段数码管显示时间。整个程序涉及到8255、8253与8259三个芯片。8253的OUT2,CLK2分别连接8259的IRQ7与PCLK,8253的GATE2连接正5伏电压,采用计数器2每隔0.01秒产生一次中断并且计数,写入以偏移地址4000H开始的4个内存单元,然后利用8255将内存单元的数据输出到七段数码管。由于键盘中断优先于8259的7号中断,所以程序只有在按一下回车键才启动电子秒表,再按一下暂停,按一下ESC键清零,如果超出了60秒,整个程序自动重新开始。
三、 所用芯片工作原理
8255:接口电路在CPU和I/O设备之间起着信号的变换和传输的作用。 任何接口电路与CPU之间的信息传输方式都是并行的,即CPU与接口电路之间以数据字节/字为单位传送信息。接口电路与I/O设备之间的信息传送方式,有并行和串行两种,相应的接口电路称为并行接口和串行接口。
并行接口是在多根数据线上,以数据字节/字与I/O设备交换信息。在输入过程中,输入设备把数据送给接口,并且使状态线“输入准备好”有效。接口把数据存放在“输入缓冲寄存器”中,同时使“输入回答”线有效,作为对外设的响应。外设在收到这个回答信号后,就撤消数据和“输入准备好”信号。数据到达接口中后,接口会在“状态寄存器”中设置输入准备好标志,或者向CPU发一个中断请求。CPU可用查询方式或中断方式从接口中读取数据。接口中的数据被读取后,接口会自动清除状态寄存器中的标志,且撤消对CPU的中断请求。
在输出过程中,每当输出寄存器可以接收数据,接口就会将状态寄存器中“输出准备好”状态置1或向CPU发一个中断请求,CPU可用查询或中断方式向接口输出数据。当CPU输出的数据到达接口后,接口会清除“输出准备好”状态,把数据送往外设,并向外设发一个“数据输出准备好”信号。外设受到驱动后,便接收数据,并向接口电路发一个“输出回答”信号,接口收到该回答信号后,又将状态寄存器中“输出准备好”置位,以便CPU输出下一个数据。
8253:对CLK信号进行“减1计数”。首先CPU把“控制字”,写入“控制寄存器”,把“计数初始值”写入“初值寄存器”,然后, 定时/计数器按控制字要求计数。计数从“计数初始值 开始,每当CLK信号出现一次,计数值减1,当计数值减为0时,从OUT端输出规定的信号(具体形式与工作模式有关)。当CLK信号出现时,计数值是否减1(即是否计数),受到“门控信号”GATE的影响,一般,仅当GATE有效时,才减1.门控信号GATE如何影响计数操作,以及输出端OUT在各种情况下输出的信号形式与定时/计数器的工作模式有关。
8259:1. IR线上提出了中断请求的中断源,即出现请求,IRR中断请求寄存器(共有8位D7~D0)对应于连接在IR0~IR7线上的外设的中断请求,哪一根输入线有请求,哪一根输入线就置1。
2. 若OCW1(IMR中断屏蔽寄存器)未使该中断请求屏蔽(对应位为0时不屏蔽),该请求被送入PR(优先权分析器)比较。否则,不送入PR比较。
3. PR把新进入的请求与ISR(服务中寄存器)中正在被处理的中断进行比较。如果新进入的请求优先级较低,则8259不向CPU提出请求。如果新进入的请求优先级较高,则8259使INT引脚输出高电平,向CPU提出请求。
4. 如果CPU内部的标志寄存器中的IF(中断允许标志)为0,CPU不响应该请求。若IF=1,CPU在执行完当前指令后,从CPU的INTA引脚上向8259发出两个负脉冲。
5.第一个 INTA负脉冲到达8259时,8259完成以下三项工作:
a.使IRR(中断请求寄存器)的锁存功能失效。这样一来,在IR7~IR0上的请求信号就不会被8259接收。直到第二个INTA负脉冲到达8259时,才又使IRR的锁存功能有效。
b.使ISR(服务中寄存器)中的相应位置1。
c.使IRR中的相应位清0。
6.第二个INTA负脉冲到达8259时,8259完成以下工作:
a.将中断类型码(ICW2中的值)送到数据总线上,CPU将其保存在“内部暂存器”中。
b.如果ICW4(它设定级中断联方式之特定完全嵌套方式,将在8259的工作方式中详述ICW4)中设置了中断自动结束方式,则将ISR的相应位清0。

⑹ 汇编语言的中断服务的中断服务程序是什么

嗯,我猜你问的是PC的,不是单片机
一、汇编语言的中断分以下几种:
1.BIOS中断,这是固化到程序中的,每次开机BIOS会自动加载到指定内存
2.186下的DOS中断,在DOS系统被加载后,系统会延用BIOS的中断向量,并向里面添加一些新的向量,这些功能便是DOS系统自带的中断服务程序
3.286及以上的系统中断,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芯片来实现高级中断的,这个就不是一般需要学的了。

阅读全文

与汇编完整中断程序相关的资料

热点内容
一个文件盒省内寄顺丰多少钱 浏览:41
诛仙62坐骑怎么升级到63 浏览:926
linux以日期查看日志记录 浏览:446
工业大数据是什么东西 浏览:881
魅族note3怎么重置网络 浏览:510
c语言程序设计模 浏览:92
儿童怎么做可编程机 浏览:603
数据计算属于什么统计学 浏览:921
07word怎么去掉标记 浏览:979
qq缓存的数据是什么 浏览:348
LED主Kv文件多少兆 浏览:856
苹果edge怎么删除下载文件 浏览:471
sas逻辑回归代码 浏览:572
用于keil下的stc器件数据库 浏览:400
新闻网站后台如何操作前台 浏览:539
在剪映app中怎么查看视频尺寸 浏览:9
linux文件成分包括 浏览:886
文件转换免费的软件 浏览:644
linuxwpsxlsx 浏览:482
小米手机怎么上移动网络连接失败怎么办 浏览:598

友情链接