Почему в ассемблере используются регистры при сложении и вычитании по-разному?

У меня здесь очень серьезные сомнения. У меня есть два очень простых кода C и их ассемблерные коды:

программа 1:

main()

{

    int temp1, temp2, temp3;
    char temp5, temp6, temp7, temp8, temp9;
    temp1 = 5;
    temp1 = 9 - temp1;
}

Ассемблер:

   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  

Программа 2:

main()    
{    
    int temp1, temp2, temp3;
    char temp5, temp6, temp7, temp8, temp9;
    temp1 = 5;
    temp1 = 9 + temp1;    
}

Ассемблер:

   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

Почему в случае вычитания необходимо использовать регистр eax и не в случае сложения. Разве это не может быть так:

0x080483c1 <+13>:   sub    DWORD PTR [ebp-0xc],0x9

вместо -

0x080483c1 <+13>:   mov    eax,0x9

0x080483c6 <+18>:   sub    eax,DWORD PTR [ebp-0xc]
7
задан starblue 13 November 2011 в 17:18
поделиться