《組合語言》筆記

2021-10-04 12:10:08 字數 4812 閱讀 8147

學習完王爽的《組合語言》確實有一種豁然開朗的感覺,書中很多實踐例題,感覺是他帶著我們一步一步做實驗,非常容易理解,是不可多得的好書!

本書組合語言的環境是8086cpu為**處理器的pc機,原因是它常用而且結構簡潔。

最核心的部件有三個:cpu、記憶體、i/o裝置。cpu負責運算加工資料,這些資料處理好後存入記憶體,i/o裝置通過埠可以顯示儲存器中的內容,也可以向cpu傳輸資料,實現人機互動。

記憶體8086的記憶體有1mb,需要20位的位址才能訪問(220≈

10

62^≈10^6

220≈10

6),而每個位址儲存了8bit的資料。位址相當於每家每戶的門牌號,裡面住著不同的人家,最多住8個人。現在我們熟知的記憶體有4g、8g,而且**還便宜,可見半導體的發展是多麼迅猛!

段位址和偏移位址

123c8=123c(十六進製制)×16(十進位制)+8=1230×16+c8

這裡的段位址可以是123c,偏移位址為8,也可以是1230和c8,可見同乙個位址表示方法不唯一。這種表示其實也很好理解,比如有人向你問路,復旦大學怎麼走,你可以直接說東經121°,北緯31°(實體地址),但是更常有的是沿著江灣體育場地鐵站(段位址)向西走三百公尺(偏移位址)。

記憶體分配

那麼記憶體的空間是如何分配的呢?

位址0~7fffh的32kb空間為主隨機儲存器ram位址;

位址8000h~9fffh的8kb空間為視訊記憶體位址;

位址a000h~ffffh的24k為各個rom的位址空間;

視訊記憶體位址好理解,如果把資料寫在視訊記憶體位址上,通過顯示器埠的轉換,資料會呈現在顯示屏上。

rom(read only memory)翻譯是唯讀儲存器,在計算機允許時,這部分的資料只能讀取,不能寫入。它是由非揮發性mos管構成,要通過加壓產生電子隧穿效應才能實現其寫入,很多開發板,如微控制器、fpga等在編好程式後,都需要**「燒寫」**,就是將啟動程式寫入rom中,這樣在開機時,計算機從第一條指令開始逐條讀取並執行。

24kb的rom空間包含系統啟動程式,顯示卡啟動程式,網絡卡啟動程式。

這裡的網絡卡和顯示卡屬於i/o裝置,它需要埠才能與cpu連線,因為cpu允許速度太快,8086是每秒8m次左右,而人鍵盤輸入最快撐死每秒10下。埠相當於助教,等待學生(顯示卡)完成作業後通知教授(cpu),在等待的過程中,教授可以做其他事情,而不用教授親自不停詢問學生是否作業,大大提高效率。

開機後,cpu自動進入ffff:0(段位址ffff,偏移位址0,實體地址ffff0)單元執行,此處由一條跳轉指令,cpu執行該指令後,轉去執行bios中的硬體系統檢測和初始化程式

初始化後,呼叫int 19h進入作業系統的引導,如果設定為軟盤啟動,則int 19h 主要完成以下工作:

(1)控制0號軟碟機,讀取軟盤0道0面1扇區的內容到0:7c00;

(2)將cs:ip指向0:7c00,開始執行程式。

如果沒有軟盤,則讀取c盤:

(1)讀取c盤的0道0面1扇區的內容到0:7c00;

(2)將cs:ip指向0:7c00,開始執行程式。

中斷向量表

這裡的cs暫存器儲存了指令的段位址,ip表示指令的偏移位址。int表示中斷指令(interruption),如果計算機允許是碰到int指令,它會先「保護現場」:儲存cs,ip和當前進製等狀態值,然後跳轉進入某個位址,該位址又儲存了下個指令要執行的cs、ip值。int 19h表示跳轉到00:19h×4=64h的位址,00:64h和00:65h共儲存了16位(分別8位)的待跳轉ip值,00:66h和00:67h儲存了待跳轉的cs值。中斷實際上就是高許可權的跳轉指令。

8086cpu的記憶體0000:0000到0000:03ff的1024個單元存放著256個中斷入口對應的跳轉位址,比如0000:0000處放置int 0時跳轉的資料:68 10 a7 00,執行後cs=00a7,ip=1068,繼續執行指令。可以看出每個中斷需要4個8bit的儲存單元,256個中斷入口就需要1024個單元。這些單元儲存的指令跳轉位址就是中斷向量表

記憶體中有一段安全空間:00:200~0:2ff,它裡面沒有系統或其他程式或**,使用者可以寫入自己的程式,此處為basic保留,提供basic解釋程式使用,沒有中斷入口。

二、cpu

暫存器相當於草稿紙

a、暫存器定址總結:[bx][bp][si][di]

正確定址指令:

mov ax,[bx]

mov ax,[bp] (預設段位址為ss)

mov ax,[si]

mov ax,[di]

mov ax,[bx+si] (預設段位址為ds)

mov ax,[bx+di] (預設段位址為ds)

mov ax,[bp+si] (預設段位址為ss)

mov ax,[bp+di] (預設段位址為ss)

mov ax,[bx+si+idata] (預設段位址為ds)

mov ax,[bx+di+idata] (預設段位址為ds)

mov ax,[bp+si+idata] (預設段位址為ss)

mov ax,[bp+di+idata] (預設段位址為ss)

錯誤定址指令:

mov ax,[ax] (累加器不可)

mov ax,[cx]

mov ax,[dx]

mov ax,[ds] (段暫存器不可)

mov ax,[bx+bp] (這種組合不可)

mov ax,[si +di ] (這種組合不可)

b、跳轉總結

jmp short s ;偏移量範圍-128~127

jmp near ptr s; 偏移量範圍-32768~32767

jmp far ptr s;不是偏移量,而是s指令的段位址+偏移位址

jmp word ptr ds:[0];跳轉位址的ip儲存在ds:[0][1]

jmp dword ptr ds:[0];跳轉位址的ip儲存在ds:[0][1],cs儲存在ds:[2][3]

loop s≡

\equiv

≡ (cx–), if ((cx)≠0) jmp short s

ret ≡

\equiv

≡ pop ip

retf≡

\equiv

≡ pop ip, pop cs

call s ≡

\equiv

≡ push ip, jmp near ptr s

call far ptr s ≡

\equiv

≡ push cs, push ip,jmp far ptr s

call word ptr ds:[0]≡

\equiv

≡push ip, jmp word ptr ds:[0]

call dword ptr ds:[0]≡

\equiv

≡push cs,push ip, jmp dword ptr ds:[0]

int 9≡

\equiv

≡ pushf,push cs,push ip;tf=0,if=0,(ip)=(9×4),(cs)=(9×4+2)

iret ≡

\equiv

≡ pop ip,pop cs,popf

c、常用中斷程式

1、int 0 為除法溢位時的中斷入口

2、int 7ch 可供使用者自行設計

3、int 10h bios設定游標中斷:

mov bh,0  ;第0頁(總共4頁,0~3,一般用第0頁)

mov dh,5 ;第5行(總共有25行,0~24)

mov dl,12 ;第12列(總共有80列,0~79)

mov ah,2 ;第10h號中斷2號子程式

int 10h

游標位置顯示字元:

mov bh,0   ;第0頁

mov bl,7 ;字元顏色屬性

mov cx,3 ;字元重複個數

mov al,'a' ;顯示字元

mov ah,9 ;第10h號中斷9號子程式

int 10h

`補充:顏色屬性格式

bit位置76

5432

10含義blrg

birg

b解釋閃爍背景

高亮前景

4、int 21h

mov al,0     ;返回值

mov ah,4ch ;呼叫第21h中斷4ch號子程式

int 21h

ds:dx      ;要先顯示字串的起始位址,用"$"作為結束符

mov ah,9h ;呼叫第21h中斷9h號子程式

int 21h

d、標誌暫存器

標識of

dfif

tfsf

zfaf

pfcf

flag暫存器中位置

111098

7642

0debug中1顯示

ovdnei無

ngzr

acpe

cy0顯示

nvupdi無

plnz

napo

nc英文

over flow

direction

interrupt

trace

sign

zero

auxiliary carry

parity

carry flag

中文是否溢位

方向標誌

是否允許中斷

是否單步追蹤

符號正負

是否為零

輔助進製

是否為偶

是否進製

組合語言筆記

1 暫存器操作 cs暫存器不能用mov指令賦值,需要用jmp等調轉指令。但還可以將cs暫存器的值mov到暫存器或者記憶體 ds暫存器可以用mov賦值,通常是這樣操作 mov bx 位址 mov ds bx。可以將ds中的值mov到暫存器或者記憶體。2 實模式和保護模式 實模式 實模式下訪問記憶體是通...

組合語言筆記

原作者是哪位大佬已經不可考,寫的挺好的 一波,侵刪 8086有14個暫存器 控制暫存器 ip flag 段暫存器 8086中 中的 只能是bx bp si di。此時bp預設ss段,di預設es段,bx si預設ds。16位 flags 32位 eflags 標誌位控制標誌位 系統標誌位 影響標誌暫...

組合語言筆記

彙編指令 機器碼的助記符 偽指令 由編譯器執行,計算機並不認識 其他符號 乙個cpu的位址線寬度位10,那麼可以殉職1024個記憶體單元,這1024個可尋到的記憶體單元就構成這個cpu的記憶體位址空間。從讀寫分為 隨機讀寫 ram 和唯讀儲存器 rom 從功能上和連線上分類 乙個典型得cpu由運算器...