我正在跟随剑桥大学的Baking Pi课程,其中一个简单的操作系统是在ARMv6指令集中构建的,目标是Raspberry Pi.
ldr到目前为止,我们一直使用两种方法通过指令将数据加载到寄存器中,现在我意识到我正在使用它们,我不完全理解它们的作用.
所以我使用的东西ldr r0,=0x20200000,我实际上理解为"将存储在存储单元0x20200000的数据读入寄存器r0.
然后我用过以下的东西:
ldr r0,[r1,#4]
Run Code Online (Sandbox Code Playgroud)
我已经理解为"读取存储在r1指向的存储器地址的数据,以4字节的偏移量进入寄存器r0".
然后我遇到了这个:
ldr r0,=pattern
ldr r0,[r0]
Run Code Online (Sandbox Code Playgroud)
pattern这里是一个.int在.data部分(表示接通/断开状态的用于LED的序列的位图).我在阅读本文时意识到,我之前的理解=foo一定是错的,否则上述两条指令都会做同样的事情.
是=x语法基本都像在C的指针,而[x]语法如果被指向的内存x实际上是读?
让我们说ptr下面的C是一个int*,我的评论是否考虑等效组装(概念上,不是字面意思)有意义吗?
r0 = ptr; /* equivalent to: ldr r0,=ptr */
r0 = *ptr; /* equivalent to: ldr r0,[ptr] */
r0 = *(ptr+4) /* equivalent to: ldr r0,[ptr,#4] */
Run Code Online (Sandbox Code Playgroud)