程序编码(机器级代码+汇编代码+C代码+反汇编)
生活随笔
收集整理的這篇文章主要介紹了
程序编码(机器级代码+汇编代码+C代码+反汇编)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【-1】相關聲明
本文總結于csapp; 了解詳情,或有興趣,建議看原版書籍;【0】程序編碼
GCC調用了一系列程序,將源代碼轉化成可執(zhí)行代碼的流程如下:
- (1)C預處理器擴展源代碼,插入所有用#include命令指定的文件,并擴展聲明的宏;
- (2)編譯器產生兩個源代碼的匯編代碼:*.s;
- (3)匯編器將匯編代碼轉化為二進制目標代碼 :*.o ; (目標代碼是機器代碼的一種形式,它包含所有指令的二進制表示,但沒有填入地址的全局值)
- (4)鏈接器將目標代碼與實現庫函數的代碼合并,最終產生可執(zhí)行代碼文件;
【1】機器級代碼
對于機器級編程來說,兩種抽象很重要:
- (1)機器級程序的格式和行為,定義為指令集體系結構;
- (2)機器級程序使用的存儲器地址是虛擬地址;
(Attention:os負責管理虛擬地址空間, 將虛擬地址翻譯成實際處理器存儲器中的物理地址!)
【2】要知道處理器的狀態(tài)是可見的:
- (1)程序計數器:pc,指示將要執(zhí)行的下一條指令在存儲器中的地址;
- (2)整數寄存器文件:包含8個命名的位置;
- (3)條件碼寄存器:保存著算術或者邏輯指令的狀態(tài)信息;
- (4)一組浮點寄存器存放浮點數據;
【3】代碼示例(聯系開頭的程序編碼首文)
3.1)gcc編譯器產生匯編代碼
gcc -O1 -S code.c generates code.s gcc -O1 -S p107.c generates p107.s3.2)gcc編譯并匯編該代碼
gcc -O1 -c p107.c 產生目標代碼p107.o, 它是二進制格式,所以無法直接查看。3.3)反匯編器-disassmbler, 根據目標代碼產生類似于匯編代碼的格式
objdump -d p107.o >> p107-dis.s3.4)生成可執(zhí)行文件 prog
gcc -O1 -o prog p107.o p107-main.c3.5)反匯編prog文件
objdump -d prog >> prog-dis.s int accum = 0; int sum(int x, int y) {int t = x + y;accum += t;return t; }(Attention)
- A0)這段代碼(L121~L128)和 p107-dis.s 的代碼幾乎完全一樣。
- A1)其中一個主要的區(qū)別:是左邊列出的地址不同——鏈接器將代碼的地址移到一段不同的地址范圍中。
- A2)第二個不同之處:在于鏈接器確定了存儲全局變量accum的地址。
- A3)在p107-dis.s的12行,很明顯accum=0, 而在prog的反匯編指令中(L126),accum的地址就設置為0x8049634了。
【4】ATT與intel 匯編代碼格式
ATT是GCC、OBJDUMP和其它一些我們使用的工具的默認匯編格式;
其它一些編程工具, 包括Microsoft工具,以及來自intel的文檔,其匯編代碼是intel格式的;
總結
以上是生活随笔為你收集整理的程序编码(机器级代码+汇编代码+C代码+反汇编)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 万网云服务器 怎么连接(万网云服务器 怎
- 下一篇: 控制语句(if-else+循环+swit