汇编入门学习笔记 (十二)—— int指令、port
瘋狂的暑假學習之 ?匯編入門學習筆記 (十二)—— ?int指令、port
參考: 《匯編語言》 王爽 第13、14章
一、int指令
1. int指令引發的中斷
int n指令,相當于引發一個n號中斷。
運行過程相當于:
(1)取中斷類型嗎n。
(2)標志寄存器入棧;設置IF=0,TF=0。
(3)CS,IP入棧
(4)(IP)=(n*4),(CS)=(n*4+2)
樣例1:編寫、安裝中斷7ch。實現求一個word型數據的平方,用ax存放這個數據。
assume cs:codecode segmentstart:mov ax,csmov ds,axmov si,offset sqrmov ax,0mov es,axmov di,200hmov cx,offset sqrend - offset sqrcldrep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21hsqr:mul axiret sqrend:nopcode endsend start
樣例2:編寫、安裝7ch中斷。實現將data段中的字符串轉化為大寫。
assume cs:codecode segmentstart:mov ax,csmov ds,axmov si,offset changemov ax,0mov es,axmov di,200hmov cx,offset changeend - offset changecldrep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21hchange:push cxpush si s: mov ch,0mov cl,ds:[si]jcxz okand cl,11011111bmov ds:[si],clinc sijmp short s ok:pop sipop cxiret changeend:nopcode endsend start
assume cs:codedata segmentdb 'conversation',0 data endscode segmentstart:mov ax,datamov ds,axmov si,0int 7chmov ax,4c00hint 21hcode endsend start
樣例3:使中斷7ch實現loop指令的功能。 assume cs:codecode segmentstart:mov ax,csmov ds,axmov si,offset lpmov ax,0mov es,axmov di,200hmov cx,offset lpend - offset lpcldrep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21hlp:push bpmov bp,spdec cxjcxz lpretadd [bp+2],bx lpret:pop bpiret lpend:nopcode endsend start
assume cs:codecode segmentstart:mov ax,0b800hmov es,axmov di,160*12mov bx,offset s - offset semov cx,80 s: mov byte ptr es:[di],'!'add di,2int 7ch se: nopmov ax,4c00hint 21hcode endsend start
2. BIOS和DOS的中斷例程
BIOS中主要包括:
(1)硬件系統的檢測和初始化程序
(2)外部中斷和內部中斷的中斷例程
(3)用于對硬件設備進行I/O操作的中斷例程
(4)其它和硬件系統相關的中斷例程
BIOS和DOS提供的中斷例程安裝過程
(1)開機。初始化CS=0FFFFH。IP=0,運行FFFF:0程序。FFFF:0程序有一條跳轉指令。運行完后。CPU會去運行BIOS中的硬件系統檢測和初始化程序。
(2)初始化程序將建立BIOS所支持的中斷向量。即將BIOS中提供的中斷例程的入口地址登記在中斷向量表中。注意:BIOS所提供的中斷例程。僅僅須要將入口地址登記在中斷向量表中就可以,由于它們是固化在ROM中的。
(3)硬件系統檢測和初始化完畢后,調用int 19h進行操作系統的引導。從此將計算機交給操作系統控制
(4)DOS啟動后,除了完畢其它工作外,還將他所提供的中斷例程裝入內存中。并建立對應的中斷向量。
一般來說。一個中斷例程包括了多個子程序,用ah來傳遞內部子程序的編號
int 10h中斷
它是BIOS提供的中斷例程,當中包括了多個和屏幕輸出有關的子程序
ah=2 ? 設置光標位置,此時bh存放 第幾頁;dh存放行號;dl存放列號
ah=9 ?在光標位置顯示字符,此時al存放字符;bl存放顏色屬性;bh存放第幾頁。cx存放這個字符反復顯示幾
樣例:
assume cs:codecode segmentstart:mov ah,2mov bh,0mov dh,5mov dl,12int 10hmov ah,9mov al,'a'mov bl,11001010bmov bh,0mov cx,3int 10hmov ax,4c00hint 21hcode endsend startint 21h中斷
它是DOS提供的中斷例程,包括了DOS提供給程序猿在編程時調用的子程序。
前面我們一直用以下的代碼返回
mov ax,4c00h int 21h
本質就是:
mov ah,4ch mov al,0 int 21h
樣例:
assume cs:codedata segmentdb 'Welcome to masm!','$' data endscode segmentstart:mov ah,2mov bh,0mov dh,5mov dl,12int 10hmov ax,datamov ds,axmov dx,0 ;ds:dx指向字符串的首地址 data:0mov ah,9int 21hmov ax,4c00hint 21hcode endsend start
二、port
? ? ?各種芯片(網卡,顯卡等)都有一組能夠由CPU讀寫的寄存器。CPU能夠通過這些寄存器讀取數據,或者操控芯片。
CPU把這些寄存器當做port,對這些寄存器進行統一編址。
每一個port宅地址空間中都有一個地址。
1. in和out指令
訪問port用in和out
假設:
in al,60h ?; 從60hport讀取數據放到al中
注意:僅僅能用ax或者al來存放從port中讀入的數據或要發送到port的數據。
對0~255以內的port進行讀寫時:
in al,20h
out 20h,al
對256~65535的port進行讀寫時,port號放在dx中:
mov dx,3f8h
in al.dx
ou dx,al
2. shl和shr指令
shl:左移指令,最低位補0,將移出的追后以為寫入CF中
假設是移1位就:
shl ?al,1
假設移動大于1位,必須將移動的位數放在cl中
mov cl,3
shl al,cl
shr是右移。其它與shl一樣
3. CMOS RAM芯片
PC中有一個靠電池供電CMOS RAM芯片,它包括一個實時種和一個有128個存儲單元的RAM存儲器。
它有兩個port:
70h:保存要讀取內存單元的地址
71h:讀取內存單元
CMOS RAM中存儲的時間信息
0:秒。2:分。
4:時;7:日。
8:月;9:年;
樣例:在屏幕顯示月份。
assume cs:codecode segmentstart:mov al,8out 70h,alin al,71hmov ah,almov cl,4shr ah,cland al,00001111badd ah,30h ;'0' 的ASCII值add al,30hmov bx,0b800hmov es,bxmov byte ptr es:[160*12+40*2],ahmov byte ptr es:[160*12+40*2+2],almov ax,4c00hint 21hcode endsend start
總結
以上是生活随笔為你收集整理的汇编入门学习笔记 (十二)—— int指令、port的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LogCat用法2
- 下一篇: Spring Boot 定时任务