【问题标题】:Why displaying PUSH rather than STM when CPU is in ARM mode?为什么 CPU 处于 ARM 模式时显示 PUSH 而不是 STM?
【发布时间】:2019-02-19 02:02:02
【问题描述】:

我在德州仪器公司的 Code Composer Studio 上进行调试,发现当 CPU 处于 ARM 模式时在反汇编视图上显示推送指令。

根据ARM and Thumb Assembler Instructions

PUSH 在 Thumb 状态下将多个寄存器推入堆栈(对于 ARM 状态使用STM)

Q1:为什么显示的是push指令而不是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

【问题讨论】:

  • A1) 只是您的反汇编程序的友好服务。请注意,官方材料建议使用push,这可能就是反汇编程序将stmdb 也显示为push 的原因。 A2)打电话给你main的人已经设置好了。至于是不是随机的,我不知道。如果您的操作系统尚未运行,那么它可能不是随机的。
  • SP 寄存器在 main() 被调用之前由启动代码初始化(例如 C 运行时初始化)。

标签: assembly arm embedded


【解决方案1】:

对于 Q1)请注意,您提供的链接适用于 ARMv6 架构。 如果您的情况与该案有关,请小心。

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

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

如果您想查看有关此问题的全部讨论,请参阅 TI 论坛中的here

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-12-01
      • 1970-01-01
      • 2011-11-21
      • 2011-04-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      相关资源
      最近更新 更多