06 彙編和可執行檔案

2021-07-23 17:36:28 字數 1279 閱讀 7309



彙編和機器碼是一對一一的關係,每個彙編指令都有唯一的一條機器碼與之對應,所以彙編約等於機器碼​。

源**------>編譯(彙編)----------->鏈結(鏈結庫檔案)​

源**經過編譯後翻譯成一 一對應的的彙編**(並不是每句源**都會翻譯成彙編**,編譯器會自動進行優化廢**不會翻譯)會生成乙個.obj檔案但這個檔案並不是可執行的,因為這些彙編**只是對源**的翻譯,對於源**中引用的庫檔案並沒有加進來。所以要經過link鏈結後才會生成真正的可執行檔案。​

1.賦值語句:eg:   ​mov  [被賦值目標]    值

3.計算語句:​eg:  add  eax,ebx :將兩個暫存器中值相加,結果放在eax中。​

debug和release都是一組編譯選項的集合,編譯器只是按照預定的選項行動,並沒有本質區別。

具體的不同表現在:

debug:不做任何優化,包含除錯資訊稱為除錯版本。

release:編譯時對源**進行了優化​​,使得程式在**大小和執行速  度上都是最優的,稱為發布版本。​

將程式載入進記憶體時並不是把程式資料從頭到尾寫入一塊記憶體,而是根據程式內部指令的不同存放在不同的地方,程式存放在記憶體中的位置分為以下幾類:​

2.堆​            :可讀可寫,一般由程式設計師分配釋若程式設計師不釋放,程式結束事可能由系統釋放。

3.**區​     :可讀不可寫,不可以改變裡面的資料

4.常量        :​唯讀不寫

為什麼要將記憶體這樣分塊?​

因為這樣做可以更安全,因為有些程式語言如c/c++是可以對記憶體進行操作的,如果程式設計的時候通過指標將**區的資料改了就會導致程式崩潰。分割槽後將**塊設為可讀不可寫則可以避免這樣的問題。​

棧區在一開始就會開闢出乙個很大的空間,比如windows下預設開闢出1024k的空間,而且棧區是可增長的。如果裡面資料過大就會棧溢位。比如臨時變數。​

顯示stack overflow棧溢位

為什麼有些檔案的大小和占用空間的大小不一樣?​​

如圖所示,的大小為17.9k,而所佔大小為20k,為什麼會這樣呢,因為計算機往記憶體中寫入資料是以簇為單位的而一簇為4k大小

linux 執行可執行檔案

1 首先,需要了解一下a.out這個目標檔案。a.out在linux下是elf executable linkable format 檔案格式,該目標檔案由乙個檔案頭 段 資料段 已初始化 從定位資訊區 符號表及符號名字字串構成,如下左圖所示,經過鏈結後生成執行檔案如下右圖所示,需要說明的是1 bs...

原始檔 目標檔案和可執行檔案

1.原始檔 存放程式 的檔案,即我們編輯 的檔案,稱為源 檔案。c語音源程式檔案的擴充套件名為 c 源 檔案是相對目標檔案和可執行檔案而言的 一般使用高階語言寫出來的。2.目標檔案 源 經過編譯所得到的二進位制 稱為目標檔案。目標檔案的擴充套件名為 obj windows 或 o linux 目標檔...

API函式執行可執行檔案

shellexecute hwnd hwnd,父視窗控制代碼 lpcstr lpoperation,操作型別 lpcstr lpfile,要進行操作的檔案或路徑 lpcstr lpparameters,當lpoperation為 explore 時指定要傳遞的引數,通常設為null lpcstr l...