0

我正在尝试对 ARM C 代码使用内联汇编。我的“main.c”代码如下所示:

...
void jump()
{
  __asm
  {
    B  0x15000
  }
}


INT32 main(void)
{
  ...
  Write val1 into register 1
  jump();
  Write val2 into register 2
  ...
}

当我运行这段代码时,我希望它val1被写入寄存器 1,然后跳转到地址0x15000发生并且寄存器 2 中没有写入任何内容。但是当我查看寄存器 1 和寄存器 2 时,它们都被写入了val1and val2。所以似乎jump()没有发生。我错过了什么吗?

更新 1

正如评论中所建议的,我创建了一个最小的可重现示例,即:

void jump()
  {
    __asm
    {
      B  0x15000
    }
  }

int main(void)
{  
  int i, j, k;
  i = 1;
  jump();
  j = 2;
  k = i + j;
  return 128;
}

当我编译它时,armcc --asm main.c我得到这个main.s

        ARM
        REQUIRE8
        PRESERVE8

        AREA ||.text||, CODE, READONLY, ALIGN=2

jump PROC
        BX       lr
        ENDP

main PROC
        MOV      r0,#0x80
        BX       lr
        ENDP


        AREA ||.arm_vfe_header||, DATA, READONLY, NOALLOC, ALIGN=2

        DCD      0x00000000

所以看起来 jump() 被优化了?那是什么,我该如何预防?

更新 2

我什至尝试volatile在函数名称之前添加:

 volatile void jump()
  {
    __asm
    {
      B  0x15000
    }
  }

但它没有帮助,jump()功能被优化了。

4

0 回答 0