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位字长?
谢谢。
我认为你在你的代码中有一个错误。它应该是'LDR r13_irq,= IRQ_Stack'或'LDR r13_irq,IRQ_NewStack'。 –
是的,你是对的......谢谢 – salvo