彙編和機器碼是一對一一的關係,每個彙編指令都有唯一的一條機器碼與之對應,所以彙編約等於機器碼。
源**------>編譯(彙編)----------->鏈結(鏈結庫檔案)
源**經過編譯後翻譯成一 一對應的的彙編**(並不是每句源**都會翻譯成彙編**,編譯器會自動進行優化廢**不會翻譯)會生成乙個.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...