導航:首頁 > 編程語言 > 匯編完整中斷程序

匯編完整中斷程序

發布時間: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晶元來實現高級中斷的,這個就不是一般需要學的了。

閱讀全文

與匯編完整中斷程序相關的資料

熱點內容
數據計算屬於什麼統計學 瀏覽:921
07word怎麼去掉標記 瀏覽:979
qq緩存的數據是什麼 瀏覽:348
LED主Kv文件多少兆 瀏覽:856
蘋果edge怎麼刪除下載文件 瀏覽:471
sas邏輯回歸代碼 瀏覽:572
用於keil下的stc器件資料庫 瀏覽:400
新聞網站後台如何操作前台 瀏覽:539
在剪映app中怎麼查看視頻尺寸 瀏覽:9
linux文件成分包括 瀏覽:886
文件轉換免費的軟體 瀏覽:644
linuxwpsxlsx 瀏覽:482
小米手機怎麼上移動網路連接失敗怎麼辦 瀏覽:598
win10系統打開java 瀏覽:479
全日制編程什麼意思 瀏覽:447
筆記本創建區域網怎麼傳文件 瀏覽:871
怎樣查看id密碼 瀏覽:647
贛州極客晨星少兒編程怎麼樣 瀏覽:690
覺醒年代哪個app可以免費觀看 瀏覽:830
如何關閉win10觸摸屏幕 瀏覽:761

友情鏈接