Supongamos que tenemos el siguiente código C para un avr-8bit:
int v1=1;
int v2=2;
v2=v2+v1;
Esperaba el siguiente desmontaje
ldi r18, 1;
ldi r19, 2;
add r19, r18;
pero después corrí:
avr-gcc -mmcu=atmega2560 Test.c -o Test.elf
y
avr-objdump -S Test.elf > Test.lss
Tengo el siguiente desmontaje
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
¿Hay alguien que pueda ayudarme a comprender el resultado del desensamblador?
Editar: Usando char, el ensamblaje se convierte en:
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
¿Cuándo hay instrucción estándar?
-O3
puede producir código roto? [cita requerida] (y no, el código C que invoca Comportamiento indefinido y luego rompe con alguna configuración de optimización no cuenta)Cuando encontré algún código de ejemplo, responderé a mi comentario; otros ya han explicado el problema.
Una gran cantidad de código incrustado con el que trabajo define tipos adicionales que son específicos de su tamaño, como "uint8, uint16, uint32" para las entradas sin firmar, por ejemplo. De esa manera, siempre sabes exactamente con qué tipo de variable estás tratando. Especialmente en pequeño incrustado, firmado, flotante, "int" de tamaño / firma indefinido le costará ciclos de CPU en el mejor de los casos y causará errores graves en el peor.
Aquí están nuestros #defines actuales:
fuente
Su código C utiliza variables enteras de 16 bits (int). El compilador no puede leer su mente, por lo que compila exactamente lo que está en el archivo fuente. Entonces, si desea variables de 8 bits, debe usar el tipo respectivo.
Como resultado, aún podrá almacenar los valores en la memoria (aunque más simple). No soy tan bueno en C, pero en mi humilde opinión, hay algunas opciones para asignar la variable a algún registro, si desea que algunas variables estén en los registros en lugar de RAM. Algo como:
Tenga en cuenta que no todos los registros están disponibles para tales trucos.
Entonces, la conclusión? Escribe tus programas en asamblea. Siempre serán más pequeños, más rápidos y fáciles de leer / soportar.
fuente