目录
- 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