組合語言綜合研究 使用暫存器

2021-05-22 05:49:09 字數 2060 閱讀 1242

1

、使用暫存器程式設計

main

函式是c

語言編寫程式的入口函式,但是

main

中的第一條語句並不是程式中被執行的第一條指令,還有很多其它語句。為了研究我們的程式編譯後的語句,首先要找

main

函式的位置,可以通過下邊的程式獲得

main

函式的偏移位址

main()

函式中printf

語句表示以

16進製制列印

main

函式的指標

可以看到

main

函式的偏移位址為

01fah

2

、嘗試使用暫存器程式設計

tc2.0

編譯環境中支援

8086cpu

中的暫存器名,可以編寫下面的程式測試

main()

編譯連線後用

debug

跟蹤程式,反編譯偏移位址為

01fa

的程式段,如圖

分析:編譯器對於賦值和加法的處理方式如下:

_ax = 1;

=>mov ax,0001

_ax = _bx + _cx=>mov ax,bx

add ax,cx

進入函式後的

push bp,mov bp,sp

和後邊的

pop bp

可以認為是

c函式中可能用到

bp暫存器而做的對

bp暫存器儲存現場操作

3

、編譯器對函式的處理

剛才的測試中,發現在

pop bp

後有乙個

ret指令,因為

main

函式是乙個由作業系統呼叫的特殊的函式,可以猜想編譯器對於函式的處理是寫成子程式形式,編寫程式驗證

void f(void);

main()

void f()

編譯連線後用

debug

跟蹤,反編譯位址為

01fa

的程式段,如圖

分析:可以看到在賦值完成後有一條呼叫子程式的指令

call 020b

之後是pop bp

和ret

,是main

函式結束的標誌

再看偏移位址為

020b

的程式段,可以分析出編譯器對於將函式

void f()

編譯成了如下的子程式

push bp

mov bp,sp

mov ax,bx

add ax,cx

pop bp

ret顯然,剛才的猜想成立,而且容易發現,對於每個函式,編譯器都會加入儲存

bp暫存器的指令

4

、函式中對引數和返回值的處理

分析剛才列印

main

函式位址的程式

main() 用

debug

反彙編到

01fa

處,如圖

可以看到在對

01fa

(main

函式的位址)和

0194h

入棧後執行了

call 0ac0

指令,可以猜想

0ac0

即是printf

函式所在的位置。呼叫的方法是對所有引數入棧後呼叫。

可以編寫一下程式驗證是否是依次入棧。

int f(int,int);

main()

int f(int a,int b)

編譯連線後反彙編,如圖

可以看出,編譯器對於引數的處理是從右往左依次入棧,函式的返回值儲存於ax中

組合語言 使用暫存器

本書已經講到對於我們為什麼要使用變數 因為我們在程式設計時要儲存資料。我們也已經學了,在組合語言中,我們將資料儲存在暫存器和記憶體空間中。1 首先在c minic 目錄下的tc.exe編寫乙個ur1.c程式 編譯 鏈結成ur1.exe 2 用debug載入ur1.exe,用u命令檢視ur1.c編譯後...

組合語言 暫存器

乙個典型的cpu由運算器 控制器 暫存器等器件組成,這些器件靠內部匯流排相連。通用暫存器 ax bx cx dx 段位址暫存器 cs ds es ss 專用暫存器 bp sp si di 指令指標暫存器 ip 標誌暫存器 psw ah al ax accumulator 累加暫存器 bh bl bx...

組合語言 暫存器

乙個cpu由暫存器,運算器,控制器組成,暫存器負責儲存資料。通用暫存器 ax,bx,cx,dx。8086cpu的暫存器都是16位的,能存放兩個位元組。乙個暫存器又能分為兩個部分,乙個高位位元組如ah,還有乙個地位位元組如al。這兩個部分可以單獨看成乙個八位暫存器來用。當暫存器當整體來看時,它可以進行...