I'm following along with the Baking Pi course from Cambridge University, in which a simple operating system is built in the ARMv6 instruction set, targeting the Raspberry Pi.
We've been using two ways of loading data into registers via the ldr
instruction so far and I realize now that I'm using them together, I don't fully understand what they both do.
So I've used things like ldr r0,=0x20200000
, which I actually understood as "read the data stored at the memory location 0x20200000 into register r0.
Then I've used things like:
ldr r0,[r1,#4]
Which I've understood as being "read the data stored at the memory address pointed to by r1, at an offset of 4 bytes, into register r0".
Then I encounter this:
ldr r0,=pattern
ldr r0,[r0]
pattern
here is a .int
in the .data
section (a bitmap representing a sequence of on/off states for an LED). I realize upon reading this, that my previous understanding of =foo
must be wrong, otherwise both of the above instructions would do the same thing.
Is the =x
syntax basically more like a pointer in C, while the [x]
syntax is as if the memory that is being pointed to by x
is actually read?
Let's say ptr
in the C below is an int*
, do my comments thinking about equivalent assembly (conceptually, not literally) make any sense?
r0 = ptr; /* equivalent to: ldr r0,=ptr */
r0 = *ptr; /* equivalent to: ldr r0,[ptr] */
r0 = *(ptr+4) /* equivalent to: ldr r0,[ptr,#4] */