当CPU处于ARM模式时,为什么显示PUSH而不是STM?

时间:2019-02-19 02:02:02

标签: assembly arm embedded

我正在从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

2 个答案:

答案 0 :(得分:1)

对于Q2)堆栈指针初始化位置在您的二进制文件中。输出二进制文件中的前四个字节表示堆栈指针要初始化到的位置。您可以在链接器文件中修改此值以及堆栈的大小。

答案 1 :(得分:1)

对于Q1),请注意,您提供的链接适用于 ARMv6体系结构。 如果遇到这种情况,请当心。

此外,Arm Information Center给出了答案:

  

PUSH是STMDB sp!,reglist和POP的同义词   LDMIA sp! reglist。 PUSH和POP是这些中的首选助记符   案例。

如果您想查看有关此问题的整个讨论,请参考TI讨论论坛中的here