Совет относительно того, для чего этот ассемблер делает MOVs?

Это C++:

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;
}

Производить этот x86:

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

Я не понимаю, почему три movs необходимы, когда значение m уже содержится в реестре eax, после imul?

Это потому что eax должен быть использован для return 1 линия и eax поэтому специальный регистр?

Кроме того, что конкретно относится к dword ptr [ebp-4]? Это 1 или 2?

1 ответ

Решение

[ebp-4] - это место, где локальная копия m в my_func хранится в стеке. [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 и общий ресурс находятся в одном и том же месте: -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
Другие вопросы по тегам