gpt4 book ai didi

assembly - 为什么我有PUSH ecx?

转载 作者:行者123 更新时间:2023-12-03 09:32:38 25 4
gpt4 key购买 nike

有人可以告诉我下面两个push ecx指令的目的是什么?我不明白他们应该做什么?

我意识到push epb正在保存栈基指针,然后mov epb, esp将栈指针分配给先前的栈基指针。

int main(){
01301190 push ebp
01301191 mov ebp,esp
01301193 push ecx ;here??
01301194 mov dword ptr [h],0CCCCCCCCh
int h = my_func(1,3);



int my_func(int a, int b){
01301160 push ebp
01301161 mov ebp,esp
01301163 push ecx ;here??
01301164 mov dword ptr [m],0CCCCCCCCh
int m = 0;
0130116B mov dword ptr [m],0
m = a*b;
01301172 mov eax,dword ptr [a]
01301175 imul eax,dword ptr [b]
01301179 mov dword ptr [m],eax
return m;
0130117C mov eax,dword ptr [m]
}
0130117F mov esp,ebp
}
01301181 pop ebp
01301182 ret

最佳答案

push ecx在堆栈上为本地变量(mh)分配4个字节。 ecx的实际内容无关紧要-分配的插槽立即被0CCCCCCCCh覆盖(此魔术值由Visual C++在调试版本中用于标记未初始化的变量)。

Visual C++通常使用push ecxpop ecx替代sub esp, 4add esp, 4。为什么?有以下几个原因:
push ecxpop ecx是单字节指令,而addsub分别是三个字节。差别可能不大,但是所有函数中所有保存的字节可能加起来很大。
ecx被认为是被函数调用损坏的,因此在函数调用之后将其与pop ecx一起丢弃是安全的。因此,您经常会看到类似以下的代码:

  push arg1    ; push an argument
call __func1 ; call the function
pop ecx ; restore the stack

对于 push,没有真正的理由专门使用 ecx -任何基本寄存器都可以。我想它只是出于对称性而选择的,或者不要与真正保存诸如 esiedi的非 volatile 寄存器相混淆。

关于assembly - 为什么我有PUSH ecx?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22341081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com