2014-03-12 52 views
1

這個C++:關於這個彙編程序在做什麼MOV的建議?

int my_func(int y, int t){ 
    int m = 0; 
    m= y*t; 
    return m; 
} 

int main(){ 
    int h = my_func(1,2); 
    return 1; 
} 

生產這種86:

int main(){ 
push  ebp 
mov   ebp,esp 
sub   esp,8 
    int m = my_func(1,2); 
mov   dword ptr [ebp-4],0 
mov   eax,1 
imul  eax,eax,2 
mov   dword ptr [ebp-4],eax  ;Why? 
mov   ecx,dword ptr [ebp-4]  ;Why? 
mov   dword ptr [m],ecx   ;Why? 
    return 1; 
mov   eax,1 
} 
mov   esp,ebp 
pop   ebp 
ret 

m價值已經包含在寄存器eax我不明白爲什麼需要三個mov秒,imul後?

難道是因爲eax必須用於return 1行而eax因此是一個特殊的註冊?

另外,dword ptr [ebp-4]究竟是指什麼?是1還是2?

+3

您是否編譯過任何級別的優化? – Leeor

+0

@Leeor否,因爲如果我這樣做,我不會有一個imul指令,我只是將值2返回,而不是....(並且我希望函數被內聯) – user997112

+2

冗餘加載的原因是因爲您選擇構建未優化的代碼。 –

回答

0

[ebp-4]是my_func的m的本地副本存儲在堆棧中的地方。 [m]是m的主要本地副本存儲位置。這裏缺少的是m的主副本的定義。我本來預計它也會是ebp的偏移量。使用VS2005,我編譯了這個例子,使用volatile來防止優化多元化。

__inline int myfun(int a, int b) 
{ 
int m; 
    m = a*b; 
    return (m); 
} 

int main (void) 
{ 
volatile int a, b, m; 
    a = 1; 
    b = 2; 
    m = myfun(a, b); 
    return(0); 
} 

並得到了這個彙編代碼。請注意,m和a共享相同的內存位置:-4 [ebp + 8]:

_b$ = -8            ; size = 4 
_m$ = -4            ; size = 4 
_a$ = -4            ; size = 4 
_main PROC 
     sub  esp, 8 
     mov  DWORD PTR _a$[esp+8], 1 
     mov  DWORD PTR _b$[esp+8], 2 
     mov  ecx, DWORD PTR _b$[esp+8] 
     mov  eax, DWORD PTR _a$[esp+8] 
     imul eax, ecx 
     mov  DWORD PTR _m$[esp+8], eax 
     xor  eax, eax 
     add  esp, 8 
     ret  0