Tengo una duda muy básica aquí. Tengo dos códigos C muy simples y sus códigos de montaje:En ensamblador, ¿por qué el uso de registros difiere entre suma y resta?
programa 1:
main()
{
int temp1, temp2, temp3;
char temp5, temp6, temp7, temp8, temp9;
temp1 = 5;
temp1 = 9 - temp1;
}
Asamblea:
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
Programa 2:
main()
{
int temp1, temp2, temp3;
char temp5, temp6, temp7, temp8, temp9;
temp1 = 5;
temp1 = 9 + temp1;
}
Asamblea:
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
Por qué en el caso de la resta, es necesario utilizar el registro eax y no en el caso de la suma. ¿No puede ser como:
0x080483c1 <+13>: sub DWORD PTR [ebp-0xc],0x9
en lugar de -
0x080483c1 <+13>: mov eax,0x9
0x080483c6 <+18>: sub eax,DWORD PTR [ebp-0xc]
no. En el código C, resta una variable de 9. En su conjunto debe restar un registro de 9, que es el del código de ensamblaje y no sub DWORD PTR [ebp-0xc], 0x9 . En el código de ensamblado, eax se resta con 5. En su premisa, resta 5 con 9. –
¿compiló con las optimizaciones activadas? – ninjalj
@ninjalj: Obviamente no lo hizo. Porque de lo contrario todo habría sido optimizado para un solo 'ret'. – celtschk