我正在学习剑桥大学的Baking Pi课程,其中在 ARMv6 指令集中构建了一个简单的操作系统,针对 Raspberry Pi。
到目前为止,我们一直在使用两种方式通过ldr
指令将数据加载到寄存器中,现在我意识到我正在一起使用它们,我并不完全理解它们的作用。
所以我使用了类似的东西ldr r0,=0x20200000
,我实际上将其理解为“将存储在内存位置 0x20200000 的数据读入寄存器 r0。
然后我使用了类似的东西:
ldr r0,[r1,#4]
我将其理解为“将存储在 r1 指向的内存地址处的数据以 4 个字节的偏移量读取到寄存器 r0 中”。
然后我遇到这个:
ldr r0,=pattern
ldr r0,[r0]
pattern
这是.int
该.data
部分中的一个(表示 LED 的一系列开/关状态的位图)。读到这里,我意识到我之前的理解=foo
一定是错误的,否则上面的两个指令都会做同样的事情。
=x
语法基本上更像C中的指针,而语法[x]
就好像x
实际读取了所指向的内存?
假设ptr
在下面的 C 中是 an int*
,我对等效程序集(概念上,而不是字面意思)的评论是否有意义?
r0 = ptr; /* equivalent to: ldr r0,=ptr */
r0 = *ptr; /* equivalent to: ldr r0,[ptr] */
r0 = *(ptr+4) /* equivalent to: ldr r0,[ptr,#4] */