We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Somebody ever used named register variables successfully and can tell me what i am doing wrong?
example code:
#pragma O0 // optimization off #pragma thumb // thumb mode __global_reg(8) int myR8; void DAbt_Handler(void) __irq { register unsigned int programCounter __asm ("lr"); unsigned int value = programCounter - (unsigned int)0x04; register int myR7 __asm("r7"); myR7 = 0x07; myR7++; myR8 = 0x08; myR8++; printf("R2 : %x",programCounter); printf("R7: %x",myR7); printf("R8 : %x",myR8); printf("** Data Abort @%X **\n",value); while(1); }
So in theory myR7 should be translated to Register R7, myR8 (global register definition) should be R8 etc. but if i look into lst file the compiler makes something different of it:
;;;17 void DAbt_Handler(void) __irq 00000c e2446004 SUB r6,r4,#4 ;;;18 { ;;;19 ;;;20 register unsigned int programCounter __asm ("lr"); ;;;21 unsigned int value = programCounter - (unsigned int)0x04; ;;;22 register int myR7 __asm("r7"); ;;;23 ;;;24 myR7 = 0x07; 000010 e3a05007 MOV r5,#7 ;;;25 myR7++; 000014 e2855001 ADD r5,r5,#1 ;;;26 myR8 = 0x08; 000018 e3a0b008 MOV r11,#8 ;;;27 myR8++; 00001c e28bb001 ADD r11,r11,#1 ;;;28 ;;;29 ;;;30 printf("LR : %x",programCounter); 000020 e1a01004 MOV r1,r4 000024 e28f007c ADR r0,|L1.168| 000028 ebfffffe BL __2printf ;;;31 printf("R7: %x",myR7); 00002c e1a01005 MOV r1,r5 000030 e28f0078 ADR r0,|L1.176| 000034 ebfffffe BL __2printf ;;;32 printf("R8 : %x",myR8); 000038 e1a0100b MOV r1,r11 00003c e28f0074 ADR r0,|L1.184| 000040 ebfffffe BL __2printf
Any hints are welcome.