opa, muito pelo contrario! veja que sao dois compiladores diferentes em tres plataformas diferentes. no caso do sdcc, foi uma jogada de mestre inferir o loop infinito e trocar call por jmp, acho que nao tem como fazer mais otimizado que isso na mao para conectar dois segmentos de codigo distintos. no caso do gcc, a primeira coisa q eu fiz foi compilar codigo sem otimizacao para x86 e 68k, pois o compilador costuma fazer maracutaias para tornar o codigo mais rapido. por exemplo:
- Código: Selecionar todos
int main()
{
int i;
for(i=0;i!=1000000;i++);
return 0;
}
eh compilado com otimizacoes como:
- Código: Selecionar todos
main:
move.w #15,%a0
.L5:
lea (120,%a0),%a0
cmp.w #255,%a0
jbne .L5
move.l %a0,%d0
rts
ou seja, ele inicializa um registro de enderecos com o valor 15 e entao usa uma instrucao magica que 99% dos programadores asm para 68k nao imaginariam usar dessa forma, mas que produz uma soma do registro de endereco com ele mesmo mais uma constante mais rapido que uma soma imediata.
a maracutaia da otimizacao eh nao suprimir totalmente o for, mas reduzir: ele viu que era meio indiferente contar ateh 255 de um em um passo ou de 120 em 120, entao na pratica eh como se vc quisesse resolver um problema, daih o compilador suprimiu os 255 passos para apenas 2 e no final retornou o valor correto.
nesse codigo otimizado usei supressao do stack frame, como no terceiro exemplo q eu tinha citado. isso otimiza o codigo, mas na pratica soh funciona se vc compilar e linkar o codigo inteiro assim, pq ele passa a nao retornar as funcoes via stack, mas via registros.
o lance do stack frame eh convencao no processador, existem instrucoes em asm especificas para isso, entao vc usaria ele mesmo codificando em asm, pq se vc for linkar outro codigo, muito provavelmente ele segue essa convencao... mas eh mais lento! se vc seguir a convencao, deve funcionar com qq outra rotina... se vc otimizar, deve dar pau. e se der pau, vc tem q mudar tudo no braco.
em C a coisa facilita: usar ou nao a convencao requer ativar ou nao parametro -fomit-frame-pointer. se vc nao quer usar, eh soh fazer o rebuid do codigo inteiro sem ele... se for em asm tem q editar o codigo inteiro. e nao eh obvio dizer q nunca vai usar, pq se linkar com algum binario comercial, muito provavelmente vai ter q usar a convencao, daih o cara q usa asm reclama q nao eh compilador q liga e desliga flag e pede as contas

Djalma Toledo Rodrigues escreveu:Marcelo Samsoniuk escreveu:eu testei com dois compiladores aqui, gcc e sdcc ....
para vc que curte asm, o sdcc produziu algo bem compacto, curto e grosso:
- Código: Selecionar todos
_primeira:
ljmp _segunda
_segunda:
ljmp _primeira
_main:
ljmp _primeira
nota que otimizacao interessante e demoniaca: no sdcc nao dah stack overflow!

enquanto o gcc deu uma embelezada atoa:
[code]
_primeira:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call L_segunda$stub
leave
ret
_segunda:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _primeira
leave
ret
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
call _primeira
leave
ret
[code]
Caro Marcelo
Em
AVR -- Divulgação Xmega, demonstrates ser profundo conhecedor de C
Um PHD em BitC , até me convenceu. Imaginei que poderia abrir o Datasheet e Programar em C com a mesma eficiência que em ASM.
Mas, agora diande de tamanha diferença entre Códigos gerados por esses Compiladores me parece que "a vaca foi pro brejo"
Sempre vejo os defensores do C afirmarem que o Código gerado é tão eficiente , e alguns até se excedem e afirmam ser mais eficiênte (Coisa Impossível ), que o Assembly.
Vejo agora que isso é uma falácia, afirmações gratuitas .
Volto para o ASM ?
.