What is the difference between =label (equals sign) and [label] (brackets) in ARMv6 assembly?
ldr r0,=something
...
something:
means load the address of the label something into the register r0. The assembler then adds a word somewhere in reach of the ldr instruction and replaces it with a
ldr r0,[pc,#offset]
instruction
So this shortcut
ldr r0,=0x12345678
means load 0x12345678 into r0.
being mostly fixed length instructions, you cant load a full 32 bit immediate into a register in one instruction, it can take a number of instructions to completely load a register with a 32 bit number. Depends heavily on the number. For example
ldr r0,=0x00010000
will get replaced by the gnu assembler with a single instruction mov r0,#0x00010000 if it is an ARM instruction, for a thumb instruction though it may still have to be ldr r0,[pc,#offset]
These ldr rd,=things are a shortcut, pseudo instructions, not real.
ldr rd,[rm,#offset]
ldr rd,[rm,rn]
are real instructions and mean read from memory at address rm+offset or rm+rn and take the value read and put it in the register rd
the =something is more like &something in C.
unsigned int something;
unsigned int r0;
unsigned int r1;
r0 = &something;
r1 = *(unsigned int *)r0;
and in assembly
something:
.word 0
ldr r0,=something
ldr r1,[r0]