我想了解以下函數的反彙編代碼。C函數的反彙編
void func(char *string) {
printf("the string is %s\n",string);
}
反彙編代碼如下。
1) 0x080483e4 <+0>: push %ebp
2) 0x080483e5 <+1>: mov %esp,%ebp
3) 0x080483e7 <+3>: sub $0x18,%esp
4) 0x080483ea <+6>: mov $0x80484f0,%eax
5) 0x080483ef <+11>: mov 0x8(%ebp),%edx
6) 0x080483f2 <+14>: mov %edx,0x4(%esp)
7) 0x080483f6 <+18>: mov %eax,(%esp)
8) 0x080483f9 <+21>: call 0x8048300 <[email protected]>
有人能告訴我第4-7行是什麼意思(不是字面解釋)。還有爲什麼24字節分配在第3行的堆棧上?
您是否熟悉堆疊的工作原理,例如當使用'push' /'pop'時? – DCoder
我想我知道 – user146297
然後這些線是相當簡單的 - 而不是'push'ing一個值壓入堆棧,GCC手動移動堆棧指針和感動,值到堆棧的新的頂部。看看[本文]的「參數」部分(http://codearcana.com/posts/2013/05/21/a-brief-introduction-to-x86-calling-conventions.html),它在一些更多的細節。至於「爲什麼24字節的堆棧」,這是編譯器的內部決定,它可能與*堆棧對齊*,*堆棧金絲雀*或只是一個隨機決定有關。 – DCoder