題目是這樣的:
有一個函數原型爲
void decode1(int *xp,int *yp,int * zp);
函數的編譯成彙編代碼後如下:
1 movl 8(%ebp),%edi
2 movl 12(%ebp),%ebx
3 movl 16(%ebp),%esi
4 movl (%edi),%eax
5 movl (%ebx),%edx
6 movl (%esi),%ecx
7 movl %eax,(%ebx)
8 movl %edx,(%esi)
9 movl %ecx,(%edi)
要求寫出等效的C代碼。
分析過程:(中間僞代碼)
edi = xp
ebx = yp
esi = zp
eax = *xp
edx = *yp
ecx = *zp
最後函數內的代碼推測爲:
*yp = *xp
*zp = *yp
*xp = *zp
用反彙編工具驗證:
首先編寫代碼decode.c:
gcc編譯:gcc -O2 -c decode.c
反彙編:objdump -d decode.o
反彙編代碼如下:
翻譯機器的反彙編代碼爲:
*yp = *xp
*zp = *xp
*xp = *xp
原本的函數代碼:
*yp = *xp
*zp = *yp
*xp = *zp
貌似有點差距,但仔細一看,其實是一模一樣的,看來計算機還是能看透事物的本質啊!!(其實這段函數功能就是三個值都等於*xp啊)