【发布时间】:2012-10-06 16:21:33
【问题描述】:
我正在研究为 ARM 处理器的不同模式(IRQ、主管、用户...)设置堆栈的主题。 由于设置不同的堆栈需要相同的指令序列(基本上只有堆栈地址更改),我将求助于设置 IRQ 堆栈的问题来问我的问题。 前提是我有以下定义:
IRQ_Stack EQU 0x8000
NoInt EQU 0xC0
IRQ32md EQU 0x12
以下代码用于设置堆栈(我添加行号以启用 cmets):
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 以禁用中断并进入 IRQ 模式
在 2 行中,将值加载到 CPSR_c。
然后,在第 3 行,LDR 用于将IRQ_NewStack 标签的(32 位)地址加载到以 IRQ 模式存储的堆栈指针中。
你能解释一下第7行的教学目的是什么吗?
我在 ARM 手册上看到 DCD 用于“保留 32 位字”。当我阅读“保留一个 32 位字” 时,我认为这就像为单个 32 位变量保留空间,这意味着 DCD 充当 EQU(可能是 EQU 只是一个DCD...的宏)。
但是,如果是这种情况,我为什么要为整个堆栈保留一个 32 位字,它可以比一个 32 位字还大?
谢谢。
【问题讨论】:
-
我认为您的代码中存在错误。它应该是
LDR r13_irq, =IRQ_Stack或LDR r13_irq, IRQ_NewStack。