我在这里有一个非常基本的疑问.我有两个非常简单的C代码及其汇编代码:
计划1:
main()
{
int temp1, temp2, temp3;
char temp5, temp6, temp7, temp8, temp9;
temp1 = 5;
temp1 = 9 - temp1;
}
Run Code Online (Sandbox Code Playgroud)
部件:
0x080483b4 <+0>: push ebp
0x080483b5 <+1>: mov ebp,esp
0x080483b7 <+3>: sub esp,0x20
0x080483ba <+6>: mov DWORD PTR [ebp-0xc],0x5
0x080483c1 <+13>: mov eax,0x9
0x080483c6 <+18>: sub eax,DWORD PTR [ebp-0xc]
0x080483c9 <+21>: mov DWORD PTR [ebp-0xc],eax
0x080483cc <+24>: leave
0x080483cd <+25>: ret
Run Code Online (Sandbox Code Playgroud)
计划2:
main()
{
int temp1, temp2, temp3;
char temp5, temp6, temp7, temp8, temp9;
temp1 = 5;
temp1 = 9 + temp1;
}
Run Code Online (Sandbox Code Playgroud)
部件:
0x080483b4 <+0>: push ebp
0x080483b5 <+1>: mov ebp,esp
0x080483b7 <+3>: sub esp,0x20
0x080483ba <+6>: mov DWORD PTR [ebp-0xc],0x5
0x080483c1 <+13>: add DWORD PTR [ebp-0xc],0x9
0x080483c5 <+17>: leave
0x080483c6 <+18>: ret
Run Code Online (Sandbox Code Playgroud)
为什么在减法的情况下,需要使用eax寄存器而不是在添加的情况下.不能是这样的:
0x080483c1 <+13>: sub DWORD PTR [ebp-0xc],0x9
Run Code Online (Sandbox Code Playgroud)
代替 -
0x080483c1 <+13>: mov eax,0x9
0x080483c6 <+18>: sub eax,DWORD PTR [ebp-0xc]
Run Code Online (Sandbox Code Playgroud)
Sma*_*acL 10
我猜是因为加法是可交换的(A + B == B + A),而减法则不是(A - B!= B - A).因此,添加9 + temp1是相同的temp1 + 9,因此更简单的汇编程序.9 - temp1涉及创建临时变量.