x86組合語言(2) 認識8086處理器

2021-10-22 16:14:22 字數 2372 閱讀 3880

結構如圖:由8個通用暫存器組成,每個暫存器之間都可以傳送資料,其中ax,bx,cx,dh都可以分成高8位和低8位的暫存器

每個暫存器都是16位。

ax、bx、cx、dh可以分為高位元組、低位元組;16位處理器中1個字16位,2個位元組

我們改變其中乙個暫存器的值,不影響另乙個,如改變了ah的值,al的值不變,但ax的值改變

16位暫存器中的內容被寫入8位記憶體中,可以分成兩個8位傳送進去。如圖,高位元組被寫入記憶體的高位址單元,低位元組被寫入記憶體的低位址單元,我們稱為低端位元組序。

ah等8位暫存器也可傳送到記憶體中,只需要一半的位址線(傳送出也一樣)

記憶體中的程式分為**段和資料段,**段儲存要執行的指令,指令中會有執行過程所需資料的位址,執行時通過再次訪問程式的資料段,再進行相應的操作

如下圖,第一條指令通過訪問0c00處的乙個字(053c)傳送到ax暫存器,第二條指令訪問0c02的乙個字(0f8b),再與暫存器ax的內容相加,最後存入0c02中。

詳細的分段:

1、**段/唯讀段:二進位制指令、字串字面值,具有const屬性且被初始化過的全域性、靜態變數。

2、資料段:被初始化過的全域性變數和靜態變數。

3、bss段:未被初始化過的全域性變數和靜態變數,程序一旦載入成功,就會把這段記憶體清理為零。

4、堆:動態的分配、管理,需要程式設計師手動操作。有低位址向高位址拓展

5、棧:非靜態的區域性變數,包括函式的引數、返回值。由高位址向低位址拓展

從高位址向低位址使用,和堆記憶體之間存在一段空隙.

堆區和棧區中間存在一塊間隙,一方面是為堆和棧增長預留空間,另一方面存放共享庫、共享記憶體。

但是記憶體中存入指令的位址是不確定的,所以資料段位址的定位會不準確。如下圖,指令偏移到了1000,根據位址取資料段的值也不再準確,比如根據指令會訪問到0c00位址的內容。出現這種情況的原因是我們使用了實體地址,這是絕對位址。

如圖,我們可以看到,1c00距離資料段起始位址的偏移量為0,1c02距離段起始位址的偏移量為2

因此,資料段的每個數都有兩個位址,乙個是實體地址,乙個是相對段起始位置的偏移量,稱為偏移位址。這樣**段的位址就可以改為偏移位址了。每乙個段的起始位址稱為段位址

如圖,intel 8086處理器有16根資料線,用來傳送資料,有20根位址線,用來訪問記憶體中的位址,20根位址線可以訪問的記憶體為2的20次方即1mb。

如圖,cs用來儲存**段要執行指令的位址,ds用來儲存資料段的起始位址。

而這些暫存器都是16位的,容納不了20位的位址。這該如何解決?

8086處理器選擇以0結尾的位址作為段位址,這樣通過右移4位(十六進製制數33ce0變成了33ce),這樣就可以存入暫存器中。

但cs暫存器儲存的是要執行的指令的位址,如30ce3,後面的3是不能丟掉的,這又要怎麼解決呢?

程式開始執行

將**段的段位址右移四位,儲存到cs暫存器

將資料段的段位址右移四位,儲存到ds暫存器

把第一條指令的偏移量0000儲存到ip暫存器

取出cs暫存器中的資料,左移4位,加上ip暫存器的資料,結果輸入到20位位址線,記憶體根據位址線的位址取訪問**段的指令

根據**段指令中資料段的偏移位址,取出ds暫存器的資料左移四位並相加,得到實體地址,根據這個實體地址取訪問資料段的資料,並執行操作碼相應的操作

繼續執行指令,指定遇到終止的指令。

習題

x86組合語言學習筆記2

乙個簡單的組合語言程式 data sum dword 0 code main proc mov eax,5 add eax,6 mov sum,eax invoke exitprocess,0 main endp 加法指令 add 減法指令 sub 加一指令 inc 減一指令 dec 取補指令 ne...

X86組合語言學習手記 2

高位址 eip start函式的返回位址 ebp start函式的ebp main函式的ebp指標 即sfp框架指標 i ebp 4 j ebp 8 k ebp 0xc 低位址 圖 2 1 3.小結這次通過幾個試驗程式,進一步了解了區域性變數在棧中的分配和釋放以及位置,並再次回顧了上篇文章中涉及到的...

組合語言 基於X86 學習筆記

1.機器語言 machine language 是一種數字語言,專門設計成唄計算機處理器 cpu 理解。所有x86處理器都理解的共同機器語言。2.組合語言 assembly language 包含助記符書寫的語言。3.組合語言與機器語言是一一對應 one to one 的關係。4.彙編器 assem...