我正在从Texas Instruments的Code Composer Studio上进行调试,并注意到在 CPU处于ARM模式下时,反汇编视图上显示了一条推送指令。
根据ARM and Thumb Assembler Instructions:
PUSH以Thumb状态将多个寄存器推入堆栈(对于ARM 国家使用STM)
问题1:为什么显示推送指令而不是STM?
我还注意到,在程序开始运行之前,堆栈指针的值已经设置完毕。
Q2:堆栈指针的值由谁决定?
程序:
int main(void)
{ // program stops here
OS_ERR err = OS_ERR_NONE;
/*rest of code are omitted*/
}
反汇编:
main():
805dce18: E92D4008 push {r3, lr}
17 OS_ERR err = OS_ERR_NONE;
805dce1c: E3A0C000 mov r12, #0
805dce20: E58DC000 str r12, [sp]
注册:
Name Value Description
CPSR 0x6000019F current program status registers
T 0 If set ARM is in Thumb mode
SP 0x88000F30 stack pointer
答案 0 :(得分:1)
对于Q2)堆栈指针初始化位置在您的二进制文件中。输出二进制文件中的前四个字节表示堆栈指针要初始化到的位置。您可以在链接器文件中修改此值以及堆栈的大小。
答案 1 :(得分:1)
对于Q1),请注意,您提供的链接适用于 ARMv6体系结构。 如果遇到这种情况,请当心。
此外,Arm Information Center给出了答案:
PUSH是STMDB sp!,reglist和POP的同义词 LDMIA sp! reglist。 PUSH和POP是这些中的首选助记符 案例。
如果您想查看有关此问题的整个讨论,请参考TI讨论论坛中的here。