Hi,
Taking the code snippet below,
char* ptr = (char*)0x0000; short size = 0x100; short sum = 0x00; do { sum += *ptr++; } while (size--)
This will cause C51 to allocate "ptr" and "size" in RAM.
MOV R3,#00H MOV R2,#00H MOV R1,#00H MOV DPTR,#pre?1251 MOVX @DPTR,PR0 MOV DPTR,#size?1252 MOV A,#01H MOVX @DPTR,A INC DPTR CLR A MOVX @DPTR,A
and everytime "size" is decremented, or "ptr" is incremented, the values are loaded back into the RAM.
Is there a way to force C51 to not use RAM but use the registers only as "ptr" and "size" will never be used anymore after that. What I mean is, is there a way to force C51 to compile to something like this,
mov dptr, #WORD0(00h) mov r4, #01h ; r4:r5 = size mov r5, #00h mov r6, #00h ; r6:r7 = sum mov r7, #00h loop: movx A, @dptr+#000h addw 006h, A ; r6:r7 += A inc dptr subw 004h, 001h ; r4:r5-- jnc loop ; add code to store r6:r7 into RAM
Any advice would be greatly appreciated. Thanks in advance.
when I learned 'C' back in the 90's was there not a 'C' thing called 'register'?
You probably mean this thing: http://www.keil.com/support/man/docs/c51/c51_le_register.htm
Ignored by the compiler.
"when I learned 'C' back in the 90's was there not a 'C' thing called 'register'?"
It's still there - But it's still only a hint to the compiler.
Erik
You can try and convince the compiler to output code you like. But most likely this would be a waste of your time. Write your program in a high-level language, leave the code generation to the compiler. Yes, you may not like the code it generates, but remember: you are trying to write a working program, not a perfect program. Only begin to optimize after you've established the fact that optimization is needed. This will save you a ton of time.
"Is there a way to force C51 to not use RAM ..."
You might be able to provide hints, but no absolute control.
If you want that level of control, you should consider doing some assembler.
View all questions in Keil forum