LDR Instruction

Note: This was originally posted on 5th November 2008 at http://forums.arm.com

Hi all,
        I am new to the thumb-2 instruction set. In one of my sample code
I noticed a instruction
         LDR r0, =0x12345678;
        This instruction actually load the r0 with value (0x12345678).
But I didn't find such an instruction anywhere in the thumb-2 instruction set.
I am wondering anyone is aware of such instruction and from where i can find
more details about the thumb-2 instruction set.
Parents
  • Note: This was originally posted on 5th November 2008 at http://forums.arm.com

    That is a pseudo-instruction, and actually expands to multiple real instructions. If assemble the code then view the disassembly of the result, you'll see something like this:

    0x1000: LDR r0, [pc,#8]
    ...
    0x1008: .DCD 0x12345678


    This is called a "PC relative load". The ".DCD" directive simply allows you to insert arbitrary data into the instruction stream. Of course, you'd never execute that data, so your code will have to branch around it.

    Using assembler, you can also specify exactly where the literal pools should be using another assembler directive. There are various reasons why you might want to do that.

    So, to answer your question, the instruction you show isn't part of the Thumb-2 (or ARM) instruction set, but is expanded into real instructions by the assembler. You'll need to look at the documentation for the specific assembler in order to find out more, but the format you're using works in every assembler I've used.
Reply
  • Note: This was originally posted on 5th November 2008 at http://forums.arm.com

    That is a pseudo-instruction, and actually expands to multiple real instructions. If assemble the code then view the disassembly of the result, you'll see something like this:

    0x1000: LDR r0, [pc,#8]
    ...
    0x1008: .DCD 0x12345678


    This is called a "PC relative load". The ".DCD" directive simply allows you to insert arbitrary data into the instruction stream. Of course, you'd never execute that data, so your code will have to branch around it.

    Using assembler, you can also specify exactly where the literal pools should be using another assembler directive. There are various reasons why you might want to do that.

    So, to answer your question, the instruction you show isn't part of the Thumb-2 (or ARM) instruction set, but is expanded into real instructions by the assembler. You'll need to look at the documentation for the specific assembler in order to find out more, but the format you're using works in every assembler I've used.
Children
No data