Skip to main content
stm322
Associate III
November 17, 2008
Question

assembler code to set registers

  • November 17, 2008
  • 7 replies
  • 1675 views
Posted on November 17, 2008 at 06:22

assembler code to set registers

    This topic has been closed for replies.

    7 replies

    stm322
    stm322Author
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 12:52

    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.

    stm322
    stm322Author
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 12:52

    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.

    paulsmitton9
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 12:52

    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.

    fastmapper
    Visitor II
    May 17, 2011
    Posted on May 17, 2011 at 12:52

    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.

    picguy
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 12:52

    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 thread

    paulsmitton9
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 12:52

    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.

    stm322
    stm322Author
    Associate III
    May 17, 2011
    Posted on May 17, 2011 at 12:52

    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.