This line:
thresBits = _crol_(thresBits, 2);
generates this SRC:
MOV R7,thresBits?1282 MOV R0,#02H MOV A,R7 INC R0 SJMP ?C0198 ?C0197: RL A ?C0198: DJNZ R0,?C0197 MOV thresBits?1282,A
I have added a "#pragma asm" to manually change the assembly to this:
#pragma asm MOV A, thresBits RL A ;rotate once RL A ;rotate the 2nd time MOV thresBits, A #pragma endasm
but I get "error A45: UNDEFINED SYMBOL". How do I access the local C thresBits variable in my inline assembly code?
Why do something simple, when something advanced can be done?
Write a SED or AWK script that scans through the map file, or assembler list files and extracts the little magic digits and then patch the source file with the correct variable name and rebuild again :)
Thanks for your answers guys. I did consider pushing that snippet into a function, but if I did that, I think the code would take about as long as the library code.
I've ended up reverting to the library code, as it's a bit more of a hassle to debug using the SRC file.
My request wasn't so much of a necessity as a inquiry into what was possible with Keil and inline assembly, and also how to go about it.
That line of code is part of a loop in a much larger time-critical function, but I've optimised other parts such that the difference between compiler generated code and my assembly didn't really matter for that particular line.
If made a function, it would be almost as large as the existing function, but it would be faster since it is hard-coded for a two-step rotate and doesn't need the loop.
What is your problem - the size or the speed of the existing function?
That line of code is part of a loop in a much larger time-critical function why not write the entire loop in assembler - that will do it. My projects are 80 - 100 percent C depending on the amount of time critical stuff.
Erik
Regarding the function, my thought was the overhead added by a function call would negate the speed increase from using assembly since it's such a small routine.
I did consider rewriting the loop in assembly. I felt my time was better spent elsewhere in the program, as my task list is still fairly long. My assembly isn't that hot either.