2008-11-16 09:22 PM
assembler code to set registers
2011-05-17 03:52 AM
Hello,
I try to set register in assembler. I want store the value 0x00000114 in the register address 0x40021014. I tried the following code, mov r3, 0x40021014 mov r4, 0x00000114 str r4, [r3] bit it doesn t work. I ve got a compiling error on the mov instruction. If somebody can help. Thanks in advance.2011-05-17 03:52 AM
Hello,
you haven't mentioned which compiling error, or even which compiler you are using. I'd reccommend that you examine some assembler produced by your c compiler (if you have one) and use that as a guide. GCC seems to like to use decimal constants prefixed with an #. Your assembler may not recognise 0x notation.2011-05-17 03:52 AM
Thanks Paul,
I m using Green Hills compiler. I did copy some examples from their application. I'm now doing mov r3, #(1073877012) //0x40021014 mov r4, #(276) //0x00000114 str r4, [r3] The instruction mov r4 is fine, but for the instruction mov r3, I ve got an ''out of range'' error. Regarding the mov r4 instruction, I'm not sure the compiler knows it is a 32 bit value to store.2011-05-17 03:52 AM
I think 0x40021014 is too many bits for an immediate value.
You could try storing it nearby, and loading it into the register, or splitting it up, and adding it in. i.e. mov r3, 0x00001014 add r3, 0x00020000 add r3, 0x40000000 (may need slightly different steps) I think someone else will have a better answer than mine.2011-05-17 03:52 AM
Change code to...
ldr r3, =0x40021014 mov r4, 0x00000114 str r4, [r3] Or better... baseRCC equ 0x40021000 RCC_AHBENR equ 0x014 ; (and other equ's as well) ldr r3, =baseRCC movs r4, 0x00000114 str r4, RCC_AHBENR[r3] the equal sign tells teh assembler to create a literal ldr finishes the job using a PC relative addressing I think Cortex has a pair of 32-bit instructions that can load a full 32-bit value in a register. Somebody look and respond to this thread2011-05-17 03:52 AM
If you can use the Thumb-2 instructions (such as on the ARM Cortex processors), there are additional ways to do this including the following with inline constants:
movw r3, 0x1014 movt r3, 0x4002 movs r4, 0x0114 str r4, [r3] This sets the least significant 16 bits of r3, then the most significant 16 bits. ... and this trick should work in the case that you only need to store a halfword: movs r3, 0x0114 movt r3, 0x4002 strh r3, [r3, 0x1014 - 0x0114] The ARM Cortex also provides bit banding that could be used to set or clear individual bits without disturbing anything else.2011-05-17 03:52 AM
Thanks everybody for your help.
It is working now. fastmapper I did try movw r3, 0x1014 movt r3, 0x4002 movs r4, 0x0114 str r4, [r3] but for the instruction ''movs r4, 0x0114'' I ve got a compiling error out of range. I put this instruction at mov r4, 0x00000114 and it is working. But everything working fine now. Thanks again.