Hi smart guys out there,
I am using µVision with TIs eval-kit LM3S9B92. I use µVisions C-Compiler.
I learned that it is not possible to read the CPU-Registers with C and I have to use asembler for that.
I have no idea of asembler and actually I don't work with it in future and I hope I never have to again :-) ...but right now I need to know the status of the carrybit.
So all I am asking is for a piece of code that gets me the status of bit 29 in the register 17 :) and how to implement that in my project.
I hope this doesn't sound sassy ;-) - at least it isn't meant that way.
Thank you so much.
...but right now I need to know the status of the carrybit.
That's most probably an incorrect belief.
Note that even if you find a method for reading the carry flag, there's absolutely no guarantee that by the time that method actually accesses it the carry still contains the same state you were looking for. Compiled C code owns that flag --- it'll do with it whatever it wants, up to and including using it for some other purpose in the meantime.
In a nutshell, when you think you need the carry flag (or the content of any general-purpose register) from inside a C program, you're still thinking in assembler. And that will not work.
That is very probably an incorrect belief.
So, instead, why don't you tell us what you're actually trying to achieve here?
www.catb.org/.../smart-questions.html
Point taken - didn't know that C works that way (owning the carry bit). Would it work, if the prior calculation was in assembler, too? 'Cause I thought that the codepart written in assembler will be transcoded to machinecode in a coherent way...won't it?
I wanted to avoid the method Per suggested, because I was just curious if it is possible to avoid it. That was my single goal: Curiosity :-) . Stupid, I guess.
Now I will just do it the standard way without using assembler.
Thanks a lot for your help!
The ARM compiler is "smart" enough that it merges the assembler instructions with the instructions generated from the C code. Then it performs a number of optimization steps.
So inlined assembler need not survive unmodified to the finaly binary.
If you want to implement a large-number library while using the carry flag, then you should implement the evaluations fully in assembler.
Note that a comparison "if (a >= b)" is very fast on the ARM processor, and the optimizer will recognize that it's the same variables in the comparison as in the actual subtraction. So no extra memory accesses. Just a comparison. And the optimizer might even note that the comparison and the subtraction are basically the same thing, and the code is still interested in a subtraction.
When programming in C - do stay with C. Do not try to fool the optimizer by taking short cuts. When you are not happy with C, because of special needs: write full functions in assembler.
That's the whole point of any high-level language (HLL) - you delegate responsibility for the low-level detail to the compiler.
Indeed!
See: http://www.keil.com/forum/17856/
Thanks a lot guys, I will stay with C :-]