在汇编程序中,为什么寄存器的使用在加法和减法之间有所不同?

pku*_*mar 7 c x86 assembly

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

  • 你的意思是可交换的:联想意味着*(A + B)+ C == A +(B + C)* (4认同)
  • 我确实做过Cristoph,自我上一次数学课以来已经过了二十年,而且在此之间有两次啤酒. (4认同)