This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

rewriting _crol_ as inline assembly

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?

Parents Reply Children
  • 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?

  • 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.