Claro, si está utilizando Atmel Studio, la forma más sencilla de hacerlo es compilar su proyecto usando -Os
y luego ver el contenido del archivo *.lss
dentro del directorio debug
. Este archivo contiene el código C junto con el código de ensamblaje compilado:
CCP = CCP_IOREG_gc;
3226: 88 ed ldi r24, 0xD8 ; 216
3228: 84 bf out 0x34, r24 ; 52
OSC.CTRL = OSC_RC32MEN_bm;
322a: 82 e0 ldi r24, 0x02 ; 2
322c: 80 93 50 00 sts 0x0050, r24
while(!(OSC.STATUS & OSC_RC32MRDY_bm));
3230: 80 91 51 00 lds r24, 0x0051
3234: 81 ff sbrs r24, 1
3236: fc cf rjmp .-8 ; 0x3230 <main+0x2c>
CCP = CCP_IOREG_gc;
3238: 88 ed ldi r24, 0xD8 ; 216
323a: 84 bf out 0x34, r24 ; 52
CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
323c: 91 e0 ldi r25, 0x01 ; 1
323e: 90 93 40 00 sts 0x0040, r25
Usando la información de este archivo, puede modificar su código C a esto:
__asm__ __volatile__("ldi r24, 0xD8");
__asm__ __volatile__("out 0x34, r24"); // CCP = CCP_IOREG_gc;
__asm__ __volatile__("ldi r24, 0x02");
__asm__ __volatile__("sts 0x0050, r24"); // OSC.CTRL = OSC_RC32MEN_bm;
__asm__ __volatile__("lds r24, 0x0051");
__asm__ __volatile__("sbrs r24, 1");
__asm__ __volatile__("rjmp .-8"); // while(!(OSC.STATUS & OSC_RC32MRDY_bm));
__asm__ __volatile__("ldi r24, 0xD8");
__asm__ __volatile__("out 0x34, r24"); // CCP = CCP_IOREG_gc;
__asm__ __volatile__("ldi r25, 0x01");
__asm__ __volatile__("sts 0x0040, r25"); // CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
Este ensamblaje en línea se probó trabajando contra un ATXMEGA32A4U
sin optimizaciones habilitadas. Alternativamente, podría agregar un archivo de ensamblaje a su proyecto y crear una función en el ensamblador, pero esto no requiere conocimientos de ensamblaje para implementar.
Si está interesado en el conjunto de instrucciones avr, puede encontrar más información aquí .