我遵循劍橋大學的Baking Pi課程,在ARMv6指令集中構建了一個簡單的操作系統,針對Raspberry Pi。ARMv6程序集中的= label(等號)和[label](括號)有什麼區別?
到目前爲止,我們一直使用兩種方法通過ldr
指令將數據加載到寄存器中,現在我意識到我將它們一起使用,但我不完全理解它們都做了什麼。
所以我使用的東西像ldr r0,=0x20200000
,我竟理解爲「讀取存儲在內存位置0x20200000到寄存器R0的數據
像當年我用的東西:
ldr r0,[r1,#4]
我已經理解爲「讀取存儲在存儲器地址上的數據指出,由R 1,在4個字節的偏移,到寄存器R0」
然後我會遇到這樣的:
ldr r0,=pattern
ldr r0,[r0]
pattern
這裏是.data
部分(代表LED的開/關狀態序列的位圖)中的.int
。我在閱讀這篇文章後意識到,我之前對=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] */
可能重複:HTTP:// stackove rflow.com/questions/14046686/ldr-vs-mov-arm-assembly http://stackoverflow.com/questions/9374703/llvm-gcc-assembler-ldr-syntax http://stackoverflow.com/questions/9735169/ iphone-assembly-compilation-error-with-ldr-parameters –