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

截图参考

42f87e4cb378?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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

42f87e4cb378?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

[生成汇编文件.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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值