用彙編編寫DOS下的記憶體駐留程式 2

2021-08-30 14:54:21 字數 3195 閱讀 1256

**:

基本原理

2.1 8086/8088

ibm pc**處理單元(central processing unit)是微處理器inter 8088,8088是8086是小的版本.對於編寫程式而言,兩者幾乎完全相同.兩者之間的差別是在於:它們對外的溝通.8086和外界溝通時是經由16位的輸入輸出通道,記憶體訪問也是每次以16位為單位,8088和8086極為相似,但是它和外界溝通時就必須經由16位的通道.

2.1.1 暫存器

8086/8088的結構簡單,其中包含了一組一般用途的16位暫存器.ax,bx,cx,dx,bp,si,di.其中ax,bx,cx,dx還可以分成8位的寄存 器,譬如:ax可分為ah,al;bx可分為bh,bl;cx可分為ch,cl;dx可分為dh,dl.暫存器bp,si,di的用途也沒有特別的限制,但是卻不能分成兩個位元組.另外暫存器sp主要是用來當做堆疊指標.除此之外,還有四個非常重要的段暫存器(segment register):cs,ds,ss,es.指令指標(instru -ction pointer)ip是用來控制目前cpu執行到哪乙個指令.

8086設計時考慮到要和8位的cpu8080相容.8位的計算機是使用兩個位元組(亦即16位)來定址,因此其定址空間可以達64k位元組.16位的cpu在位址設定上選擇了完全不同的方法.cpu以段(segment)為單位,每一段範圍內包括64k位元組,而記憶體中則可以包含許多段.所以,作業系統可以在乙個段內執行.而使用者的程式則可以在另乙個段內執行.在乙個段內,程式包可以把計算機視為只有64k位元組記憶體空間.因此原先8位計算機上執行的程式就可以很容易地移植到16位計算機上.除此之外,記憶體段也可以彼此重疊,因而兩個不同的程式就可以共用某一塊記憶體.段值是以暫存器來設定的,而實際的位址值則是把段值(16位)往左移4位,然後再加上16位的位移(offset),因此構成20位的位址值.所以8086可以直接做20位的位址,也就是可能訪問到一兆位元組的記憶體.在這一兆位元組的記憶體中,ibm pc保留了最前面的320k位元組給系統的rom bios和顯示記憶體,因此使用者最多也就能使用640k位元組.

2.1.2 定址方式

定址方式(addressing mode)是一台計算機上許多複雜操作的關鍵所在.8086提供了以下幾種定址方法:立即定址,記憶體間接定址, 暫存器間接定址等.

立即定址,直接使用數字.

記憶體間接定址,數值存放在資料段中的某個位置.

mov bx,foo

foo dw 5

暫存器間接定址.有兩種暫存器可以使用在這種定址方式下:基址暫存器(base register)和索引暫存器(index register).基址寄存 器分別是bx和bp,索引暫存器則是si和di.在這種定址方式下,暫存器存放了資料段中的位址值.

mov ax,0f000h

mov es,ax

mov si,0fffeh

mov dl,byte ptr es:[si]

上面的程式使用間接定址方式,由暫存器si讀出位於f000:fffe位置的資料.暫存器間接訪問時,最多只能使用瑪個基址暫存器各 乙個索引暫存器.

以上的定址方式可以做不同的結合,因此組合後的結果很多.

2.1.3 標誌

8086有9個一位的標誌(flag),它們可以用指示cpu的各種狀態.以下是9個標誌的簡介:

cf(carry flag):cf為1時就表示算術運算的結果超出正確的長度.

pf(parity flag):pf為1就表示使用偶校驗,pf為0就表示使用奇校驗.

af(auxiliary carry flag):和cf相同,只是它使用在低4位的結果.af通常都使用在20位的位址計算上.

zf(zero flag):zf為1就表示運算結果是0,否則zf就為0.

sf(sign flag):sf為1就表示運算結果的最高位是1,否則sf就為0.

tf(trap flag):tf為1,cpu就單步地執行,在這種模式下每完成乙個指令就發生乙個特殊的中斷.

if(interrupt enable flag):if為1,允許cpu接收外界的中斷,否則if就為0.

df(direction flag):這個標誌使用在迴圈指令,譬如:movs,movsb,movsw,cmps,cmpsb和cmpsw.如果df為1,迴圈執行時就使地  址值往前增加.如果df為0,則使位址往後減少.

of(over flag):of為1,表示乙個考慮正負號的運算超出了正確的位元組的長度.

2.1.4 迴圈

所有的迴圈指令都是以cx作為計數器.乙個迴圈會反覆地執行直到cx等於某一特定值為止.以下的程式就是利用反覆地相加,完成 兩個數的相乘.

mov ax,0

mov cx,4

next: add ax,6

loop next

在上面的程式中,loop指令執行時會把cx減1,並且檢查cx的內容;如果cx等於0,就轉移到下一條指令,否則就跳到next標示的地方 執行.

也可以用下面的程式完成相同的功能:

mov ax,0

mov cx,4

next:

add ax,6

dec cx

cmp cx,0

jne next

2.1.5 記憶體的資料結構

8088是以位元組為訪問資料的基本單位.計算機的儲存結構是8位的位元組,但是cpu本身處理資料則是以16位為單位.在記憶體中,都遵 循乙個原則,即:高高低低的儲存方式.高位元組對應高位址,低位元組對應低位址.

下面是乙個簡單程式,在ax中放入乙個位元組的內容並顯示:

cseg segment

org 100h

assume cs:cseg,ds:cseg

start:

mov bx,cs

mov ds,bx

mov ah,'h'

mov al,'l'

mov test,ax

mov al,[si]   ;first byte of test

call dchar

mov al,[si+1]  ;second byte of test

call dchar

ret;display the character contained in al

dchar  proc

push ax

push bx

mov bh,1

mov ah,0eh

int 10h

pop bx

pop ax

retdchar  endp

test dw ?

cseg ends 

end start

用組合語言編寫程式輸出「Hello World 」

方法如下 步驟一 了解組合語言 結構 data segment 資料段,程式設計者可以把資料都放到這個段裡 資料部分.資料格式是 識別符號 db dw 資料。data ends 資料段結束處。edata segment 附加資料段,程式設計者可以把資料都放到這個段裡 附加資料部分.edata end...

使用組合語言編寫載入器(載入使用者程式)

在計算機加電之後,計算機首先會讀取硬碟的主引導扇區,做一些必要的初始化工作,但是硬碟的乙個扇區只有512位元組,所以我們要實現更多的功能,就要有使用者程式,我們需要把控制許可權交給使用者程式 作業系統暫且也算一種使用者程式吧 在載入使用者程式的過程中,主要分為以下幾個大步驟 使用者程式頭部 sect...

在DOS下編寫並執行C程式

1 開始 執行 cmd 回車,進入dos介面,c documents and settings administrator cd c documents and settings administrat or 桌面 2 先建立乙個c程式,命名為cyuyan.c,如下 c documents and ...