1. 匯編語言的中斷服務的中斷服務程序是什麼
嗯,我猜你問的是PC的,不是單片機
一、匯編語言的中斷分以下幾種:
1.BIOS中斷,這是固化到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晶元來實現高級中斷的,這個就不是一般需要學的了。
2. 用單片機匯編語言編寫中斷程序
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方波