命令列執行C檔案示例

2021-10-22 16:26:47 字數 2810 閱讀 9768

先寫乙個c語言**檔案mstore.c內容如下:

#include

long

mult2

(long

,long);

void

multstore

(long x,

long y,

long

*dest)

在命令列使用「-s」選項,就能看到c語言編譯器產生的彙編**:

ps e:\vs code\vs code c\chapter 3

> gcc -s mstore.c

這會使gcc執行編譯器,產生乙個彙編檔案mstore.s,但是不做其他進一步的工作。(通常情況下,它還會繼續呼叫彙編器產生目標**檔案)。

.file	"mstore.c"

.text

.globl multstore

.def multstore;

.scl 2

;.type 32

;.endef

.seh_proc multstore

multstore:

pushq %rbx

.seh_pushreg %rbx

subq $32

,%rsp

.seh_stackalloc 32

.seh_endprologue

movq %r8,

%rbx

call mult2

movl %eax,

(%rbx)

addq $32

,%rsp

popq %rbx

ret.seh_endproc

.ident "gcc: (x86_64-posix-seh-rev0, built by mingw-w64 project) 8.1.0"

.def mult2;

.scl 2

;.type 32

;.endef

如果繼續使用「-c」命令列選項,gcc會編譯並彙編該**:

ps e:\vs code\vs code c\chapter 3

> gcc -c mstore.c

這就會產生目標**檔案mstore.o,它是二進位制格式的,所以無法直接檢視。

要檢視機器**檔案的內容,有一種稱為反編譯器(disassembler)的程式非常有用。這些程式根據機器**產生一種類似於彙編的格式。帶「-d」命令列標誌的程式objdump(object dump)可以充當這個角色:

ps e:\vs code\vs code c\chapter 3

> objdump -d mstore.o

結果如下:

生成實際可執行的**需要對一組目標**檔案執行鏈結器,而這一組目標**檔案中必須含有乙個main函式。假設在檔案main.c中有下面這樣的函式:

#include

void

multstore

(long

,long

,long*)

;int

main()

long

mult2

(long a,

long b)

然後,用如下方法生成可執行檔案prog:

ps e:\vs code\vs code c\chapter 3

> gcc -o prog main.c mstore.c

如:

檔案prog不僅包含了兩個過程的**,還包含了用來啟動和終止程式的**,以及用來與作業系統互動的**。我們也可以反彙編prog檔案:

ps e:\vs code\vs code c\chapter 3

> objdump -d prog.exe

此時可以執行生成的prog檔案:

發現兩個c檔案的程式執行結果符合預期。

在生成的mstore.s檔案中:

所有『.』開頭的行都是指導彙編器和鏈結器工作的偽指令,我們通常可以忽略這些行。若我們去掉這些,帶解釋的彙編**如下:

以下為linux環境下的mstore.s檔案

multstore:

pushq %rbx

subq $32

,%rsp

movq %r8,

%rbx

call mult2

movl %eax,

(%rbx)

addq $32

,%rsp

popq %rbx

ret

yii 命令列執行

1.建立匯入命令類protected commands importcommand.php檔案 class importcommand extends cconsolecommand 2.修改配置檔案protected config console.php 主要是連線資料庫,和main.php配置是...

ubuntu 命令列執行deb檔案

如果ubuntu要安裝新軟體,已有deb安裝包 例如 iptux.deb 但是無法登入到桌面環境。那該怎麼安裝?答案是 使用dpkg命令。dpkg命令常用格式如下 sudo dpkg i iptux.deb 檢視iptux.deb軟體包的詳細資訊,包括軟體名稱 版本以及大小等 其中 i等價於 inf...

命令列 Pytest之命令列執行

基於一套 實現流水線的驗證方案,針對每個流水線傳不同的使用者進行驗證,具體的使用者可以選擇每個集群裡面活躍度比較高使用者來進行測試。正如前面說的,在saas化的模式下,底層服務它是共享的機制,但是每個集群它是不同的,這種不同在於它提供的db層面和計算能力,因此需要被驗證。使用pyhton中的argp...