我在这里有一个非常基本的疑问.我有两个非常简单的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涉及创建临时变量.