Suponha que tenhamos o seguinte código C para um avr-8bit:
int v1=1;
int v2=2;
v2=v2+v1;
Eu esperava o seguinte desmontar
ldi r18, 1;
ldi r19, 2;
add r19, r18;
mas depois eu corri:
avr-gcc -mmcu=atmega2560 Test.c -o Test.elf
e
avr-objdump -S Test.elf > Test.lss
Eu tenho o seguinte desmontar
ldi r24, 0x01 ; 1
ldi r25, 0x00 ; 0
std Y+2, r25 ; 0x02
std Y+1, r24 ; 0x01
ldi r24, 0x02 ; 2
ldi r25, 0x00 ; 0
std Y+4, r25 ; 0x04
std Y+3, r24 ; 0x03
ldd r18, Y+3 ; 0x03
ldd r19, Y+4 ; 0x04
ldd r24, Y+1 ; 0x01
ldd r25, Y+2 ; 0x02
add r24, r18
adc r25, r19
std Y+4, r25 ; 0x04
std Y+3, r24 ; 0x03
existe alguém que possa me ajudar a entender o resultado do desmontador?
Edit: Usando char a montagem se torna:
ldi r24, 0x01
std Y+1, r24
ldi r24, 0x02
std Y+2, r24
ldd r25, Y+2
ldd r24, Y+1
add r24, r25
std Y+2, r24
Quando há instrução std?
-O3
pode produzir código quebrado? [carece de fontes?] (e não, C código que chama Undefined Comportamento e, em seguida, rompe com alguma configuração de otimização não conta)Como encontrei algum código de exemplo, farei meu comentário como resposta - outros já explicaram o problema.
Muitos códigos incorporados com os quais trabalho definem tipos extras específicos para seu tamanho, como "uint8, uint16, uint32" para as entradas não assinadas, por exemplo. Dessa forma, você sempre sabe exatamente com que tipo de variável está lidando. Especialmente em pequenas embarcações, assinadas, flutuantes, "int" de tamanho / assinatura indefinidos, tudo custará na melhor das hipóteses os ciclos de CPU e causará, na pior das hipóteses, erros graves.
Aqui estão nossos #defines atuais:
fonte
Seu código C usa variáveis inteiras de 16 bits (int). O compilador não consegue ler sua mente, portanto, compila exatamente o que está no arquivo de origem. Portanto, se você deseja variáveis de 8 bits, deve usar o tipo respectivo.
Como resultado, você ainda poderá armazenar os valores na memória (embora mais simples). Eu não sou tão bom em C, mas IMHO, existem algumas opções para atribuir a variável a algum registro, se você quiser que algumas variáveis estejam nos registros em vez da RAM. Algo como:
Observe que nem todos os registros estão disponíveis para esses truques.
Então, a conclusão? Escreva seus programas em assembly. Eles sempre serão menores, mais rápidos e fáceis para leitura / suporte.
fonte