研究實驗二 使用暫存器
實驗內容
研究在c語言中暫存器使用的一些問題,以及對main函式的一些初步理解。
實驗環境
win7 、dosbox、tc2.0
實驗步驟
1. 編寫程式ur1.c,編譯、連線,生成ur1.exe。
2. 用debug載入ur1.exe,用u命令檢視ur1.c編譯後的機器碼和彙編**。
如果直接用u檢視會發現如下情況:
這與我們預期的是不一樣的,因為程式是從main函式開始執行的,所以得先知道main函式在**段中的偏移位址。
3. 用下面的程式列印出main函式在**段中的偏移位址。
可以看到main函式的偏移位址是1fa
4. 根據步驟3得到的偏移位址,用u命令檢視ur1.exe中的機器**和彙編**。
可以看到076a:01fd開始,所對應的就是編譯、連線之後ur1.exe檔案對應的機器**和彙編**。
這裡提出的問題是:彙編**開始處的「push bp mov bp,sp」和結尾處的」pop bp」怎麼理解。
這是因為
main
函式也相當於彙編中的乙個子程式,要在呼叫子程式時將棧頂位置儲存,以便於程式能正確返回,但是棧頂指標
sp不能當作偏移位址移動,所以要將
sp賦給bp。
5. 因為main函式後面有ret指令,以及對於上面問題的回答,要進一步驗證我們的設想,編寫程式ur2.c。
檢視它的**
可以看到,在呼叫f()函式時,即呼叫子程式時與1fa處一樣,和main函式返回一樣,所以可以得到main函式在彙編中確實是被當作子程式來處理的。
總結
編寫c語言程式,檢視對暫存器的使用,在實驗過程中發現對main函式的一些問題,通過觀察彙編**及編寫另外的含有子程式的**,得出main函式在彙編中是作為子程式被呼叫的,通過debug引導程式,u命令檢視機器**和彙編**,更直接的看到了程式對暫存器的使用。
crh暫存器 實驗 使用暫存器點亮LED
埠配置高暫存器後面的英文就是暫存器名稱可參考參考手冊,然後x可以為a e也就是適用gpuoa gpioe埠這樣的乙個暫存器。位址偏移,就是本暫存器相對這個外設基位址的偏移 暫存器位表 表示0 31位名稱及許可權,表上方的數字位編號,中間位位名稱,下方位讀寫許可權,w表示寫,r表示讀 位功能,如表所描...
idr暫存器 實驗 使用暫存器點亮LED
埠配置高暫存器後面的英文就是暫存器名稱可參考參考手冊,然後x可以為a e也就是適用gpuoa gpioe埠這樣的乙個暫存器。位址偏移,就是本暫存器相對這個外設基位址的偏移 暫存器位表 表示0 31位名稱及許可權,表上方的數字位編號,中間位位名稱,下方位讀寫許可權,w表示寫,r表示讀 位功能,如表所描...
暫存器(通用暫存器)
因為學習使用的是王爽的 組合語言 第3版 因此也只能提到8086cpo的暫存器。對於其他而言,原理都是相通的。對於8086暫存器,有14個暫存器,主要是 ax bx cx dx si di sp bp ip cs ss ds es psw。一 通用暫存器 8086的通用暫存器有ax bx cx dx...