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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

c语言gcc汇编文件,[汇编]gcc生成汇编.s文件 $ gcc -Og -S sum.c /$ gcc -Og -S -masm=intel sum.c 与 反汇编 objdump...

發布時間:2024/7/5 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言gcc汇编文件,[汇编]gcc生成汇编.s文件 $ gcc -Og -S sum.c /$ gcc -Og -S -masm=intel sum.c 与 反汇编 objdump... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

- C語言源碼文件:sum.c

- gcc 生成的匯編語言文件 sum.s

x86-64 AT&T 語法格式

x86-64 Intel格式

- 反匯編 objdump

3.1 輸出 AT&T格式 objdump -d sum

3.2 輸出 Intel格式 objdump -M intel -d sum

C語言源碼文件:sum.c

加法:c = a + b

#include

int main(int argc,char *argv[])

{

int a = 1;

int b = 2;

int c = 0;

c = a+b;

printf("%d",c);

return 0;

}

gcc 生成的匯編語言文件 sum.s

x86-64 處理器 AT&T 格式

在命令行$ 輸入 gcc -Og -S sum.c

大寫的字母O、大寫的字母S

.file "sum.c"

.section .rodata.str1.1,"aMS",@progbits,1

.LC0:

.string "%d"

.text

.globl main

.type main, @function

main:

.LFB24:

.cfi_startproc

subq $8, %rsp

.cfi_def_cfa_offset 16

movl $3, %edx

movl $.LC0, %esi

movl $1, %edi

movl $0, %eax

call __printf_chk

movl $0, %eax

addq $8, %rsp

.cfi_def_cfa_offset 8

ret

.cfi_endproc

.LFE24:

.size main, .-main

.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4"

.section .note.GNU-stack,"",@progbits

x86-64 處理器 Intel格式

在命令行$ 輸入 gcc -Og -S -masm=intel sum.c

大寫的字母O、大寫的字母S

.file "sum.c"

.intel_syntax noprefix

.section .rodata.str1.1,"aMS",@progbits,1

.LC0:

.string "%d"

.text

.globl main

.type main, @function

main:

.LFB24:

.cfi_startproc

sub rsp, 8

.cfi_def_cfa_offset 16

mov edx, 3

mov esi, OFFSET FLAT:.LC0

mov edi, 1

mov eax, 0

call __printf_chk

mov eax, 0

add rsp, 8

.cfi_def_cfa_offset 8

ret

.cfi_endproc

.LFE24:

.size main, .-main

.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4"

.section .note.GNU-stack,"",@progbits

反匯編 objdump

1、 生成可執行文件 sum

anno@anno-m:~/Desktop$ gcc -Og -o sum sum.c

2、查看當前文件結構

anno@anno-m:~/Desktop$ ls

sum sum.c sum.s

3.1 輸出 AT&T格式 objdump -d sum

執行反匯編,sum 是第1步生成的可執行文件,也就是程序文件

直接顯示在屏幕上

anno@anno-m:~/Desktop$ objdump -d sum

輸出到指定文件,ATT.me 是自己取得名字,隨便寫

anno@anno-m:~/Desktop$ objdump -d sum > ATT.me

AT&T格式: main函數部分

000000000040055d :

40055d: 48 83 ec 08 sub $0x8,%rsp

400561: ba 03 00 00 00 mov $0x3,%edx

400566: be 14 06 40 00 mov $0x400614,%esi

40056b: bf 01 00 00 00 mov $0x1,%edi

400570: b8 00 00 00 00 mov $0x0,%eax

400575: e8 e6 fe ff ff callq 400460 <__printf_chk>

40057a: b8 00 00 00 00 mov $0x0,%eax

40057f: 48 83 c4 08 add $0x8,%rsp

400583: c3 retq

400584: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)

40058b: 00 00 00

40058e: 66 90 xchg %ax,%ax

3.2 輸出 Intel格式 objdump -M intel -d sum

執行反匯編,sum 是第1步生成的可執行文件,也就是程序文件

直接顯示在屏幕上

anno@anno-m:~/Desktop$ objdump -M intel -d sum

輸出到指定文件,Intel.me 是自己取得名字,隨便寫

anno@anno-m:~/Desktop$ objdump -M intel -d sum > Intel.me

Intel 格式:main函數部分(啊~是熟悉的味道!)

000000000040055d :

40055d: 48 83 ec 08 sub rsp,0x8

400561: ba 03 00 00 00 mov edx,0x3

400566: be 14 06 40 00 mov esi,0x400614

40056b: bf 01 00 00 00 mov edi,0x1

400570: b8 00 00 00 00 mov eax,0x0

400575: e8 e6 fe ff ff call 400460 <__printf_chk>

40057a: b8 00 00 00 00 mov eax,0x0

40057f: 48 83 c4 08 add rsp,0x8

400583: c3 ret

400584: 66 2e 0f 1f 84 00 00 nop WORD PTR cs:[rax+rax*1+0x0]

40058b: 00 00 00

40058e: 66 90 xchg ax,ax

4、小小的觀察

機器碼當然都是一樣的,都是x86-64處理器指令集;

只是匯編代碼格式不同(即匯編代碼的語法不同);

說白了,就是給人看的匯編代碼有所不同,但是給機器跑的機器碼一模一樣;

5、 再次看文件結構

anno@anno-m:~/Desktop$ ls

ATT.me Intel.me sum sum.c sum.s

截圖參考

[生成匯編文件.s X86-64 AT&T格式]gcc -Og -S sum.c

[生成匯編文件.s X86-64 Intel格式]gcc -Og -S -masm=intel sum.c

引用參考

How can objdump emit intel syntax

How can I tell objdump to emit assembly in Intel Syntax rather than the default AT&T syntax?

Q:怎樣告訴objdump,"我想要(反匯編出來)Intel格式 的匯編代碼,我不要默認的 AT&T格式 的”?

A:objdump -M intel -d program_name

總結

以上是生活随笔為你收集整理的c语言gcc汇编文件,[汇编]gcc生成汇编.s文件 $ gcc -Og -S sum.c /$ gcc -Og -S -masm=intel sum.c 与 反汇编 objdump...的全部內容,希望文章能夠幫你解決所遇到的問題。

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