中斷資訊可以來自cpu的內部和外部,當cpu的內部有需要處理的事情發生的時候,將產生馬上需要處理的中斷資訊,引發中斷過程。
這一章,我們要講解另一種重要的內中斷,由int指令引發的中斷
int指令的格式為int n 指令,相當於引發乙個n號中斷的中斷過程,執**況如下:
取中斷型別碼n;
標誌暫存器入棧,if=0,tf=0;
cs,ip入棧;
修改ip,cs,跳轉到中斷程式處理入口。
注意,我們前面所說的中斷都是被動觸發的,當滿足某種錯誤的條件,就會觸發相關錯誤指令,而int指令是主動觸發的,這種區別一定要清楚。
int 指令在程式中的任何地方都可以被載入觸發。
程式設計
要求:求一word型資料的平方
引數:(ax)=要計算的資料。
返回值:dx,ax中存放結果的高16位和低16位。
舉例應用: 2*3456^2
assmue cs:code
code segment
start: mov ax,3456
add ax,ax
adc dx,dx
mov ax,4cooh
int 21
code ends
endstart
分析一下,我們要做以下3部分工作。
編寫實現求平方功能的程式。
安裝程式,將其安裝在0號記憶體出
設定中斷向量表,將程式的入口位址儲存在7ch表向中,使其成為入口。
assume cs:code
code segment
start:
mov ax,cs
mov ds,ax
mov si,offset sqr
mov ax,0
mov es,ax
mov di,200g
mov cx,offset sqrend-offset sqr
cldrep movsb
mov ax,0
mov es,0
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ax,4c00h
mov int 21h
sqr:
mul ax
iret
sqrend:
nopcode ends
end start
注意,在執行程式結束後,應該呼叫iret:
pop ip
pop cs
pop f
功能是調出位址和標誌暫存器的值。
程式2
assume cs:code
data segment
db'conversation',0
data ends
code segment
start: mov ax,data
mov ds,ax
mov si,0
int 7ch
mov ax,4cooh
int 21h
code ends
endstart
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset capital
mov ax,0
mov es,ax
mov di,200h
mov cx,offset capitalend- offset capital
cldrep movsb
mov ax,0
mov es,ax
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
mov ax,4c00h
int 21h
capital: push cx
push si
change: mov cl,[si]
mov ch,0
jcxz ok
andbyte ptr [si],11011111b
inc si
jmp short change
ok: pop si
pop cx
iret
captialend: nop
code ends
endstart
mov ax,cs
mov ds,ax
s結尾段位址,i結尾偏移位址
**段暫存器 ds(data segment):
堆疊段暫存器 es(extra segment);
si(source index):源變址暫存器
di(destination index):目的變址暫存器
這個對偏移位址有效,這種操作是你需要明確的。通過使用int程式,可以停止當前,然後執行相關程式來修改原來的命令。
我們呼叫中斷程式中,我們的cs:ip放入棧,而之後用iret來將取出棧中。
我們知道cs:ip來棧中的相對位置。
這節就是講了這點內容,然後就是一些相關例子**,看明白即可。
程式設計在螢幕中間顯示80個『!』
assume cs:code
code segment
start: mov,ax,0b800h
mov es,ax
mov di,160*12
mov bx,offset s-offset se
mov cx,80
s: mov byte ptr es:[di],'!'
add di,2
int 7ch
se: nop
mov ax,4c00h
int 21h
code ends
end start
可以看出,這裡關於 7ch 的中斷程式類似loop s
指令。
下面就是關於7ch的中斷程式:
lp: push bp
mov dp,sp
dec cx
jcxz lpret
add [bp+2],bx
lpret:
pop bp
iret
這裡的dp暫存器是乙個浮動的棧游標,空,bp,ip,cs
,而[bp+2],這個明顯指向ip位址。
而bx在進入該程式前是se到s的相對位址,負數,然後加上就能往前移動。
如果cx==0,那麼直接跳到退出的環節,而不是來修改棧中的ip位址,這樣,程式就能很自然的進行下面的語句了。
在系統版的rom中存放著一套程式,被稱為bios(基本輸入輸出系統),bios中主要包含以下幾部分內容。
硬體系統的檢測和初始化程式。
外部中斷和內部中斷歷程。
用於對外部硬體裝置進行i/o操作的中斷歷程。
其他和硬體相關的中斷歷程。
作業系統dos也提供了中斷歷程,從作業系統的角度來看,dos的中斷歷程就是操作性向程式猿提供的程式設計資源,可以供程式猿自由的發揮。
bios和dos所提供的中斷歷程中包含了許多子程式,這些子程式實現了程式猿在程式設計的時候經常需要用到的工程。可以用int指令直接呼叫bios和dos提供的中斷歷程,來完成某些工作。
前面我們編寫的安裝程式,我們可以放在記憶體中,別的程式在執行時都可以呼叫。
而bios和dos提供的中斷例程是如何安裝到記憶體中的呢?
1. 開機後,cpu一加點,初始化(cs)=0ffffh,(ip)=0,自動從0ffffh:0單元開始執行程式。
0ffff:0處有一條跳轉指令,cpu執行該指令後,轉去執行bios中的硬體系統檢測和初始化程式。
2. 初始化程式將建立bios所支援的中斷向量,即將bios提供的中斷例程的入口位址登記在中斷向量表中。注意,對於bios所提供的中斷例程,只需要將入口登記在中斷向量表中即可,因為它們是固化到rom中的程式,一直在記憶體中存在,所以,不用我們自己編寫和安裝,這個道理要明確的。
3. 作業系統檢測和初始化完成後,呼叫int 19h進行作業系統的引導。從此將計算機交由作業系統控制。
4. dos啟動後,除完成其他工作外,還要將所提供的中斷例程裝入記憶體,並建立相應的中斷向量,這些是作業系統的,軟體層間而非固化在rom的硬體層面上。
int 10h 中斷程式是bios提供的中斷歷程,其中包含了多個和螢幕輸出相關的子程式。
一般來說,乙個供程式猿呼叫的中斷例程中往往包含多個子程式,中斷例程內部用傳遞進來的引數來決定執行哪乙個程式。bios和dos提供的中斷例程,都用ah來傳遞內部子程式的變化
下面看一下int 10h中斷歷程的設定游標位置功能。
mov ah,2
;置游標
mov bh,0
;第0頁
mov dh,5
;dh中放行號
mov dl,12
;dl中放列號
int 10h
ah=2,表示呼叫10h中的2號子程式,功能為重制游標的位置。
顯示緩衝區分8頁,每頁4kb,顯示器可以顯示任意一頁的內容。一般情況下,顯示第0頁的內容。
在看看int 10h中段例程的在游標位置顯示字元的功能
mov ah,9
;在游標處顯示字元
mov al,'a'
;字元mov bl,7
;顏色屬性
mov bh,0
;第0頁
mov cx,3
;字元重複個數
int 10h
兩個程式結合可以在螢幕中間顯示字元,先把游標放到中間,之後顯示字元,就是這樣,很簡單。 王爽組合語言第十三章檢測點答案
檢測點13.1 1 128 注 因為loop實現的是段內短轉移,目的位址必須在離本指令 128 127範圍內 利用七号中斷實現jmp near ptr s指令 assume cs code data segment db conversation 0 data ends code segment s...
組合語言學習筆記(十三)int指令
int指令 引發中斷過程 int n n為中斷型別碼。編寫 用程式呼叫的中斷例程 對int iret和棧的深入理解 bios中斷例程應用 int 10h中斷是bios提供的中斷例程,其中包含了多個和螢幕輸出相關的子程式 mov ah,2 游標 mov al,a 字元 mov bh,0 第0頁 mov...
C語言 第十三章
1.與檔案進行通訊 檔案是什麼?檔案通常是在磁碟或固態硬碟上的一段已命名的儲存區。c把檔案看作一系列的連續的位元組,每個位元組都能被單獨讀取。2.標準i o fopen 函式 fclose 函式 getc 函式 從標準輸入中獲取乙個字元 char ch file fp fp fopen yls.tx...