匯編中斷知識之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