希望大家喜欢,点赞哦
在编译过程中,编译器会完成大部分工作。其中汇编代码非常接近于机器代码,是理解计算机如何人执行程序的关键一步。
那么怎么产生汇编代码呢???书中讲了以下两种方法:
首先,假设我们写了一个C语言代码文件 code.c ,包含的定义如下:
int accum = 0;
int sum(int x,int y)
{
int t = x + y;
accum += t;
return t;
}
一、在命令行上使用"-S"选项,得到汇编代码:
gcc -O1 -S code.c
此时会产生一个汇编文件code.s
,但是不进一步工作。code.s文件内容如下:
.file "code.c"
.text
.globl sum
.type sum, @function
sum:
.LFB0:
.cfi_startproc
leal (%rdi,%rsi), %eax
addl %eax, accum(%rip)
ret
.cfi_endproc
.LFE0:
.size sum, .-sum
.globl accum
.bss
.align 4
.type accum, @object
.size accum, 4
accum:
.zero 4
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4"
.section .note.GNU-stack,"",@progbits
具体意思见后文。。。
二、利用目标代码文件和反汇编器(disassember)
首先我们产生目标代码文件code.o
gcc -O1 -c code.c
这个目标代码文件可用以下命令用反汇编器查看。
objdump -d code.o
执行后产生以下
code.o: 文件格式 elf64-x86-64
Disassembly of section .text:
0000000000000000 <sum>:
0: 8d 04 37 lea (%rdi,%rsi,1),%eax
3: 01 05 00 00 00 00 add %eax,0x0(%rip) # 9 <sum+0x9>
9: c3 retq
对比发现,反汇编器省略了指令结尾的'l',这些后缀是大小指示符,在大多数情况下可以忽略。
希望大家喜欢,点赞哦