匯編中斷知識之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
最後更新:2017-04-03 18:51:47