1. 程式人生 > >程式的彙編,連結過程:

程式的彙編,連結過程:

code.c原始碼:


#include <stdio.h>

int accum = 0;

int sum(int x, int y)
{ 
    int t = x+y;
    accum += t;
    return t;
}
int main()
{ 
    int ret = sum(1, 4);
    printf("ret = %d\n", ret);
    return 0;
}

這裡寫圖片描述

彙編檔案包含各種宣告,包括以下幾行:
這裡寫圖片描述

這裡寫圖片描述

每個程式碼對應一句彙編指令。
這裡寫圖片描述

使用‘-c’命令產生目的碼檔案code.o,因為是二進位制檔案,所以無法檢視。
不過,要檢視目的碼的內容,可以使用反彙編器(disassembler).
在linux系統中,帶‘-d’命令列標誌的程式objdump可以充當這個角色.

這裡寫圖片描述

注意:
(1) IA指令長度從1到15個位元組不等。常用的指令以及運算元較少的指令所需位元組數少,那些不常用的或者運算元較多的指令所需位元組數較多。
(2) 設計指令格式的方式是,從某個給定位置開始,可以將位元組唯一的解碼成機器指令。
(3) 反彙編是基於機器程式碼中的檔案中的位元組序列來確定彙編程式碼。它不需訪問程式的原始碼或者彙編程式碼。
(4) 反彙編使用的指令命名規則與gcc生成的彙編程式碼使用的有細微差別。

用以下程式碼生成可執行檔案,然後反彙編prog檔案:
這裡寫圖片描述

反彙編會抽取出各種程式碼序列,包括以下:

這裡寫圖片描述

可以看出,這段程式碼與反彙編產生的程式碼幾乎一樣。
主要的區別在於:
(1) 左邊列出的地址不同—聯結器將程式碼的地址一刀一段不同的地址範圍裡。
(2) 聯結器確定了儲存全域性變數accum的地址,在code.o反彙編程式碼第五行,accum地址還為0,在prog得反彙編程式碼中,地址設為0x8049684。

格式註解:

simple.c原始碼:
int simple(int *xp, int y)
{
int t = *xp+y;
*xp = t;
return t;
}
當帶選項‘-S’和‘-O1’執行gcc時,會產生如下檔案simple.s:

這裡寫圖片描述

所有以‘.‘開有的行都是指導彙編器和連結器的命令。每一行的左邊都提供引用,右邊是註釋簡單的描述指令的效果以及它與原始C語言的程式碼中計算操作的關係。

相關推薦

程式彙編連結過程

code.c原始碼: #include <stdio.h> int accum = 0; int sum(int x, int y) { int t = x+y; accum += t; return t; } in

程式編譯連結過程

一、概述 C語言的編譯連結過程要把我們編寫的一個c程式(原始碼)轉換成可以在硬體上執行的程式(可執行程式碼),需要進行編譯和連結。編譯就是把文字形式原始碼翻譯為機器語言形式的目標檔案的過程。連結是把目標檔案、作業系統的啟動程式碼和用到的庫檔案進行組織形成最終生成可載入、

程式的生成過程預處理編譯彙編連結

當我們使用VS或者其他編譯器對我們所寫的程式進行執行時,在下面會出現,編譯、連結等等顯示,那麼到底什麼是編譯,連結?我們所寫的程式碼到底是怎樣變成可執行程式的?接下來就為大家解釋,程式是如何產生的。 示例一個大家都見過的程式列印:hello world!(檔名

c語言編譯過程詳解預處理編譯彙編連結(乾貨滿滿)

鍥子 我們在各自的電腦上寫下程式碼,得明白我們程式碼究竟是如何產生的,不想了解1,0什麼的,但這幾個環節必須掌握吧。 我們的程式碼會經過這4個環節,從而形成最終檔案,c語言作為編譯語言,用來向計算機發出指令。讓程式設計師能夠準確地定義計算機所需要使用的資料,並精確地定義在

深入理解預編譯編譯彙編連結過程——之編譯和使用(連結)庫——物件和靜態庫

當你完成了程式碼開發,想把這個程式碼給別人用,但是又不希望別人看到原始碼,就要給別人一個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。 或者過程相反,你從別人那裡拿到一個庫和標頭檔案來使用。 那麼如何編譯生成一個庫給他人,如何使用從他人那裡拿到的庫呢? 範例1:我們想把Li

Visual Studio 引用 COM程式導致錯誤 無法嵌入互操作型別“XXXX”

問題描述:           在專案中引入Windows Script Host Object Model的COM程式集(IWshRuntimeLibrary.dll)後,在使用相關的Class時  提示錯誤:無法嵌入互操作型別“IWshRuntimeLibrary.IW

make,makefile和程式的編譯連結過程

一,Linux下程式執行過程 1,在一個目錄下新建三個檔案:main.c hello.c hello.h分別編寫他們如下圖: 2,想要讓這個程式執行起來,就必須對上面的三個檔案分別進行編譯連結執行,如下圖: 通過上面這個過程。我們可

程式的編譯連結過程

原文連結: https://www.cnblogs.com/kekec/p/3238741.html還是從HelloWorld開始說吧...#include <stdio.h> int main(int argc, char* argv[]) { pri

C/C++程式的編譯連結過程

在以前學習C語言的時候,想必大家寫的第一個程式碼都是“hello world”吧。在以前我們除錯一個程式碼的時候是在vc++6.0或者是在vs上面除錯的,這種就是整合開發環境,它為我們簡化了一個程式碼的

C程式的編譯連結過程

程式由原始檔編譯得到可執行檔案看起來好像是很簡單的過程,windows的IDE環境下,點一下bulid就可以生成可執行檔案,在Linux環境下,gcc編譯器也提供了很多選項可以很方便的從原始檔生成可執行檔案。事實上程式的編譯和連結是一個非常複雜的過程,IDE幫我

GCC 顯示程式詳細編譯-連結過程

   很多時候,我們對於程式的編譯和連結過程很少關注。特別是使用強大的IDE之後,更多人只是會使用IDE進行程式設計。這樣,一旦出現編譯或者連結問題,有時候會很難找到編譯或者連結問題。理解編譯和連結的過程,對於編寫程式以及除錯問題都有很大的幫助。    事實上,gcc提供了

左手程式設計師右手作家你必須會的Jupyter Notebook

Python·Jupyter Notebook各種使用方法記錄·持續更新 一、 Jupyter NoteBook的安裝 1.1 新版本Anaconda自帶Jupyter 目前,最新版本的Anaconda是自帶Jupyter NoteBook的,不需要再單獨安裝 

程式的編譯裝載與連結過程

程式編譯四個過程: 預處理(Prepressing):原始碼和相關的標頭檔案被預編譯器cpp預編譯為一個 .i 檔案(#define ,#include,#if,刪除註釋行) 編譯(Compilation):將預處理之後的檔案進行一系列詞法分析,語法分析,語義

彙編基礎練習題7編寫輸入子程式功能是從鍵盤輸入數字字元利用程式得到對應的數值並在主程式中驗證。

彙編基礎練習題7: 編寫輸入子程式,功能是從鍵盤輸入數字字元,利用程式得到對應的數值,並在主程式中驗證。 編譯工具:Masm for Windows 整合實驗環境2012.5 (附帶一個工具下載地址https://download.csdn.net/download/qq_36931

彙編基礎練習題6從鍵盤輸入數字字元利用程式得到對應的數值在利用2中的輸出子程式將得到的數值輸出。

彙編基礎練習題6: 從鍵盤輸入數字字元,利用程式得到對應的數值,在利用練習題2中的輸出子程式,將得到的數值輸出。 編譯工具:Masm for Windows 整合實驗環境2012.5 (附帶一個工具下載地址https://download.csdn.net/download/qq_3

編譯過程預編譯、編譯、彙編連結

原文地址:http://blog.csdn.net/u014120684/article/details/46352167 預編譯的副檔名是ii  gcc -E hello.c -o hello.i  預編譯過程主要處理原始碼檔案當中的以#開頭的預編譯指令,比如#in

編譯的整個過程預編譯、編譯、彙編連結

編譯分為四個步驟: 每個步驟將檔案編譯成別的格式,如下: 步驟 未編譯 預編譯 編譯 彙編 連結 檔案 fun.h、fun.cpp、test.cpp

《linux核心分析》作業一彙編一個C語言程式並分析彙編程式碼執行過程

楊新峰原創作品轉載請註明出處  《Linux核心分析》 MOOC課程http://mooc.study.163.com/course/USTC-1000029000  實驗環境:實驗樓網站64位linux虛擬機器 原始碼如下: int g(int x){ re

boost靜態連結庫和c++/clr不相容問題未能載入檔案或程式不是有效的Win32應用程式

專案上遇到的問題:c++編寫的類使用託管c++包裝成dll提供給c#專案使用。c++需要使用boost,clr,專案目標平臺都是win32/x86。開發環境win10 x64系統,vs2013,.Net Framework 4.0,boost 1.55。 【問

補9.12號rupxp敏捷過程

一個 設計模型 驗證 容易 什麽 軟件開發 開發 實踐 風險 RUP:RUP中文名叫統一軟件開發過程,是一個面向對象且基於網絡的程序開發方法論。通俗地講,RUP好像一個在線的指導者,它可以為所有方面和層次的程序開發提供指導方針、模板以及事例支持。RUP和類似的產品把面向過程