[汇编]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@plt> 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@plt> 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

你可能感兴趣的:([汇编]gcc生成汇编.s文件 $ gcc -Og -S sum.c /$ gcc -Og -S -masm=intel sum.c 与 反汇编 objdump)