2013-06-20 47 views
10

我遵循劍橋大學的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] */ 
+0

可能重複: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 –

回答

14
ldr r0,=something 
... 
something: 

指的標籤東西的地址加載到寄存器R0。彙編然後添加一個字某處LDR指令的範圍,並用

ldr r0,[pc,#offset] 

指令

所以這個快捷

ldr r0,=0x12345678 

意味着負載爲0x12345678到R0替換它。

大多是固定長度的指令,你不能在一條指令中加載一個完整的32位立即數到一個寄存器中,它可能需要一些指令來完全加載一個32位數的寄存器。取決於數量。例如

ldr r0,=0x00010000 

將通過GNU彙編被替換爲一個單一的指令MOV R0,#0x00010000在如果是ARM指令,Thumb指令雖然它可能仍然必須LDR R0,[PC,#偏移]

這些ldr rd,=東西是一個快捷方式,僞指令,不是真實的。

ldr rd,[rm,#offset] 
ldr rd,[rm,rn] 

是真實的說明和地址RM從內存中的意思是讀+偏移或RM + RN,並採取讀出的值,並把它在寄存器rd

的=東西更像是&東西用C 。

unsigned int something; 
unsigned int r0; 
unsigned int r1; 

r0 = &something; 
r1 = *(unsigned int *)r0; 

和裝配

something: 
    .word 0 

ldr r0,=something 
ldr r1,[r0] 
+0

現在超級清晰,謝謝你的回答! :) – d11wtq

相關問題