Совет относительно того, для чего этот ассемблер делает 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
Я не понимаю, почему три mov
s необходимы, когда значение 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