王爽《組合語言》學習筆記(第十三章 第十四章)

2021-10-18 22:48:15 字數 3691 閱讀 4932

《組合語言》學習筆記(第一章、第二章)

《組合語言》學習筆記(第三章、第四章)

《組合語言》學習筆記(第五章、第六章)

《組合語言》學習筆記(第七章、第八章)

《組合語言》學習筆記(第九章、第十章)

《組合語言》學習筆記(第十一章、第十二章)

《組合語言》學習筆記(第十三章、第十四章)

《組合語言》學習筆記(第十五章、第十六章)

第14章、埠

int指令的格式為:int n,n為中斷型別碼,它的功能是引發中斷過程。

cpu執行int n指令,相當於引發乙個n號中斷的中斷過程

在程式中使用int指令呼叫任何乙個中斷的中斷處理程式。我們可以將中斷處理程式簡稱為中斷例程。

在系統板的rom中存放著一套程式,稱為bios(基本輸入輸出系統)

bios中主要包含以下幾部分內容

程式設計師在程式設計的時候,可以用int 指令直接呼叫bios和dos系統提供的中斷例程,來完成某些工作。

和硬體裝置相關的dos中斷例程中,一般都呼叫了bios的中斷例程。

前面的課程中,我們都是自己編寫中斷例程,將它們放到安裝程式中,然後執行安裝程式,將它們安裝到指定的記憶體區中。此後,別的應用程式才可以呼叫。

bios和dos提供的中斷例程是如何安裝到記憶體中的呢?

1、開機後,cpu一加電,初始化(cs)= 0ffffh,(ip)= 0,自動從ffff:0單元開始執行程式。ffff:0處有一條轉跳指令,cpu執行該指令後,轉去執行bios中的硬體系統檢測和初始化程式。

2、初始化程式將建立bios所支援的中斷向量,即將bios提供的中斷例程的入口位址登記在中斷向量表中。

注意,對於bios所提供的中斷例程,只需將入口位址登記在中斷向量表中即可,因為它們是固化到rom中的程式,一直在記憶體中存在。

3、硬體系統檢測和初始化完成後,呼叫int 19h進行作業系統的引導。從此將計算機交由作業系統控制。

4、dos啟動後,除完成其他工作外,還將它所提供的中斷例程裝入記憶體,並建立相應的中斷向量。

一般來說,乙個供程式設計師呼叫的中斷例程中往往包括多個子程式,中斷例程內部用傳遞進來的引數來決定執行哪乙個子程式。

bios和dos提供的中斷例程,都用ah來傳遞內部子程式的編號。

int 21h中斷例程是dos提供的中斷例程,4ch號功能,即程式返回功能

mov ah, 4ch ;呼叫第21h號中斷例程的4ch號子程式,功能為程式返回,可以提供返回值作為引數

mov al, 0 ;返回值

int 21h

在pc機系統中,和cpu通過匯流排相連的晶元除各種儲存器外,還有以下3種晶元。

cpu主機板上有介面卡的插槽,插槽上有介面卡,介面卡上有介面晶元,介面晶元上有暫存器。

在這些晶元中,都有一組可以由cpu讀寫的暫存器。這些暫存器,它們在物理上可能處於不同的晶元中,

但是它們在以下兩點上相同。

從cpu的角度,將這些暫存器都當作埠,對它們進行統一編址,從而建立了乙個統一的埠位址空間

每乙個埠在位址空間中都有乙個位址。在訪問埠的時候,cpu通過埠位址來定位埠。因為埠所在的晶元和cpu通過匯流排相連,

cpu可以直接讀寫以下3個地方的資料。

埠位址和記憶體位址一樣,通過位址匯流排來傳送。在pc系統中,cpu最多可以定位64kb個不同的埠。則埠位址的範圍為0-65535

埠的讀寫指令只有兩條:inout,分別用於從埠讀取資料和往埠寫入資料。

在in和out指令中,只能使用ax或al來存放從埠中讀入的資料或要傳送到埠中的資料。訪問8位埠時用al,訪問16位埠時用ax。

cpu執行記憶體訪問指令和埠訪問指令的時候,匯流排上的資訊:

;對0~255以內的埠進行讀寫時:

in al, 20h ;從20h埠讀入乙個位元組

out 20h, al ;往20h埠寫入乙個位元組

;對256~65535的埠進行讀寫時,埠號放在dx中:

mov dx, 3f8h ;將埠號3f8h送入dx

in al, dx ;從3f8h埠讀入乙個位元組

out dx, al ;向3f8h埠寫入乙個位元組

pc機中,有乙個cmos ram晶元,一般簡稱為cmos。此晶元的特徵如下

shl和shr是邏輯移位指令

shl是邏輯左移指令,它的功能為:

將乙個暫存器或記憶體單元中的資料向左移位;

將最後移出的一位寫入cf中;

最低位用0補充。

shr是邏輯右移指令,它的功能為:

將乙個暫存器或記憶體單元中的資料向右移位;

將最後移出的一位寫入cf中;

最高位用0補充。

如果移動位數大於1時,必須將移動位數放在cl中

mov al, 01001000b 

shl al, 1 ;將a1中的資料左移一位執行後(al)=10010000b,cf=0。

mov al, 01010001b

mov cl, 3 ;如果移動位數大於1時,必須將移動位數放在cl中

shl al, c1

mov al, 10000001b

shr al, 1 ;將al中的資料右移一位執行後(al)=01000000b,cf=1。

將x邏輯左移一位,相當於執行x=x*2。

將x邏輯右移一位,相當於執行x=x/298

7654

3210

年月日時

分秒這些資料以bcd碼的方式存放。

bcd碼是以4位二進位制數表示十進位制數碼的編碼方法 4 == 0100b

乙個位元組可表示兩個bcd碼。則cmos ram儲存時間資訊的單元中,儲存了用兩個bcd碼表示的兩位十進位制數,高4位的bcd碼表示十位,低4位的bcd碼表示個位。比如,00010100b表示14。

;程式設計,在螢幕中間顯示當前的月份。

assume cs:code

code segment

start: mov al,8 ;從cmos ram的8號單元讀出當前月份的bcd碼。

out 70h,al

in al, 71h ;從資料埠71h中取得指定單元中的資料:

mov ah, al ;al中為從cmos ram的8號單元中讀出的資料

mov cl, 4

shr ah, cl ;ah中為月份的十位數碼值,左移四位空出四位

and al, 00001111b ;al中為月份的個位數碼值

add ah, 30h ;bcd碼值+30h=十進位制數對應的ascii

add al, 30h

mov bx, 0b800h

mov es, bx

mov byte ptr es:[160*12+40*2], ah ;顯示月份的十位數碼

mov byte ptr es:[160*12+40*2+2], al ;接著顯示月份的個位數碼

mov ax,4c00h

int 21h

code ends

end start

王爽組合語言第十三章檢測點答案

檢測點13.1 1 128 注 因為loop實現的是段內短轉移,目的位址必須在離本指令 128 127範圍內 利用七号中斷實現jmp near ptr s指令 assume cs code data segment db conversation 0 data ends code segment s...

組合語言學習筆記3(王爽)

乙個字 兩個位元組,即乙個字需要兩個記憶體單元儲存。高位址放高位位元組,低位址放低位位元組。8086cpu為16位結構,有16位資料線,一次性可傳輸16位資料,也就是說對記憶體一次性操作兩記憶體單元即為乙個字。ds暫存器通常用來存放cpu要訪問資料的段位址,eg 0 表示記憶體單元的偏移位址。mov...

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

中斷資訊可以來自cpu的內部和外部,當cpu的內部有需要處理的事情發生的時候,將產生馬上需要處理的中斷資訊,引發中斷過程。這一章,我們要講解另一種重要的內中斷,由int指令引發的中斷 int指令的格式為int n 指令,相當於引發乙個n號中斷的中斷過程,執 況如下 取中斷型別碼n 標誌暫存器入棧,i...