2012-10-06 67 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位字,它不是堆栈本身。