匯編
匯編
希望大家喜歡,點(diǎn)贊哦
在編譯過程中,編譯器會(huì)完成大部分工作。其中匯編代碼非常接近于機(jī)器代碼,是理解計(jì)算機(jī)如何人執(zhí)行程序的關(guān)鍵一步。
那么怎么產(chǎn)生匯編代碼呢???書中講了以下兩種方法:
首先,假設(shè)我們寫了一個(gè)C語言代碼文件 code.c ,包含的定義如下:
int accum = 0;
int sum(int x,int y)
{
int t = x + y;
accum += t;
return t;
}
一、在命令行上使用"-S"選項(xiàng),得到匯編代碼:
gcc -O1 -S code.c
此時(shí)會(huì)產(chǎn)生一個(gè)匯編文件code.s
,但是不進(jìn)一步工作。code.s文件內(nèi)容如下:
.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
具體意思見后文。。。
二、利用目標(biāo)代碼文件和反匯編器(disassember)
首先我們產(chǎn)生目標(biāo)代碼文件code.o
gcc -O1 -c code.c
這個(gè)目標(biāo)代碼文件可用以下命令用反匯編器查看。
objdump -d code.o
執(zhí)行后產(chǎn)生以下
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
對(duì)比發(fā)現(xiàn),反匯編器省略了指令結(jié)尾的'l',這些后綴是大小指示符,在大多數(shù)情況下可以忽略。
希望大家喜歡,點(diǎn)贊哦