2012-10-06 65 views
2

我正在研究爲ARM處理器(IRQ,Supervisor,User,...)的不同模式設置堆棧的主題。 由於設置不同的堆棧需要相同的指令序列(基本上只是堆棧地址更改),所以我會問我的問題,以解決設置IRQ堆棧的問題。 假設我有以下定義:DCD指令和IRQ堆棧

IRQ_Stack EQU 0x8000 
NoInt  EQU 0xC0 
IRQ32md EQU 0x12 

下面的代碼用於設置堆棧(I添加行號,以使註釋):

1. MOV r2, #NoInt|IRQ32md 
2. MSR CPSR_c, r2 
3. LDR r13_irq, =IRQ_NewStack 
4. ... 
5. ... 
6. IRQ_NewStack: 
7. DCD IRQ_Stack 

行1剛剛加載r2爲通過將值加載到CPSR_c來禁用中斷並進入IRQ模式 行的目的。 然後,在線,LDR用於將IRQ_NewStack標籤的(32位)地址加載到以IRQ模式分組的堆棧指針中。

請問您能解釋一下指令的用途嗎?

我在ARM手冊上看到DCD用於「保留32位字」。當我讀「保留一個32位字」,我認爲這就像爲單個32位變量保留空間,這意味着DCD充當EQU(可能是EQU只是DCD的宏)。 但是,如果是這種情況,爲什麼我應該爲整個堆棧預留一個32位字,而這個字可以比一個32位字長?

謝謝。

+0

我認爲你在你的代碼中有一個錯誤。它應該是'LDR r13_irq,= IRQ_Stack'或'LDR r13_irq,IRQ_NewStack'。 –

+0

是的,你是對的......謝謝 – salvo

回答

4

DCD保留1個指向堆棧的32位字,它不是堆棧本身。