《組合語言》第十三章 int指令

2021-08-17 10:58:58 字數 4973 閱讀 1254

中斷資訊可以來自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...