閱讀523 返回首頁    go 阿裏雲 go 技術社區[雲棲]


匯編中斷知識之INT 1CH

最近在編寫匯編程序遇到一個使用INT 1CH的程序,INT 1CH是實現定時或周期性的工作,難道INT 1CH就像INT 21H一樣直接調用它裏麵的功能號嗎下麵就通過一個程序簡單的看看傳說中的INT 1CH.這個程序是實現屏幕背景顏色1秒鍾變換一次的實驗.
1.INT 1CH中斷
INT 1CH其實是調用INT 21H中的25號功能:置中斷向量AL=中斷號,DSDX=入口,同時INT21H中的35號功能:取中斷向量,AL=中斷號,ES:BX=中斷程序入口
.
2.該程序中的INT1CH
該程序中是調用子程序設置背景顏色,子程序中使用STI打開中斷,CLI關中斷,IRET中斷返回
.
INT 1CH係統中斷是每秒發生18.2,即調用每秒它18,所以Count初值賦值為1,DEC1,0執行一次背景色輸出,即運行程序就輸出背景色.然後Count賦值為18,Count1,當它為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

  上一篇:go 關於android反編譯
  下一篇:go javascript中encodeURI和decodeURI方法