裝配新手。我有以下功能有人可以解釋彙編代碼嗎?
int foo(char *argv[])
{
char buf[256];
bar(argv[1], buf);
}
其中在組裝 -
0x08048473 <foo+0>:push %ebp
0x08048474 <foo+1>:mov %esp,%ebp
0x08048476 <foo+3>:sub $0x118,%esp
0x0804847c <foo+9>:mov 0x8(%ebp),%eax
0x0804847f <foo+12>:add $0x4,%eax
0x08048482 <foo+15>:mov (%eax),%edx
0x08048484 <foo+17>:lea -0x100(%ebp),%eax
0x0804848a <foo+23>:mov %eax,0x4(%esp)
0x0804848e <foo+27>:mov %edx,(%esp)
0x08048491 <foo+30>:call 0x8048454 <bar>
0x08048496 <foo+35>:leave
0x08048497 <foo+36>:ret
有人能解釋這個給我好嗎?爲什麼在那裏有一個子280? 256字節確實在堆棧上分配。其餘的我無法解釋。
謝謝。這很清楚。那麼前兩行是函數返回值的存儲位置呢?不是函數參數之後和被調用函數的局部變量之前存儲的返回值嗎? – user220201 2011-04-20 14:14:52
返回值通常在傳統寄存器中交換(x86處理器上的%eax)。這裏你沒有'return',所以彙編代碼對'%eax'沒有任何作用:調用者會發現'foo()'「返回」'%eax'包含的值。 – 2011-04-20 14:23:25
抱歉意味着詢問bar()返回的點 - bar返回時foo()繼續執行的點。存儲在哪裏? – user220201 2011-04-20 14:25:35