日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

程序编码(机器级代码+汇编代码+C代码+反汇编)

發(fā)布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序编码(机器级代码+汇编代码+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.s

3.2)gcc編譯并匯編該代碼

gcc -O1 -c p107.c 產生目標代碼p107.o, 它是二進制格式,所以無法直接查看。

3.3)反匯編器-disassmbler, 根據目標代碼產生類似于匯編代碼的格式

objdump -d p107.o >> p107-dis.s

3.4)生成可執(zhí)行文件 prog

gcc -O1 -o prog p107.o p107-main.c

3.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代码+反汇编)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。