如何在此汇编代码(C ++)中计算偏移量

时间:2018-12-30 21:53:50

标签: c++ assembly arm keil thumb

#include <stdio.h>
int f1
{
        printf ("world\n");
}

int f2
{
        printf ("hello world\n");
}

int main()
{
        f1();
        f2();
}

此C ++代码是在Thumb模式下编译的,类似于以下内容

.text:00000000  main
.text:00000000  10 B5                      PUSH {R4, LR}
.text:00000002  C0 A0                      ADR R0, aHelloWorld
.text:00000004  06 F0 2E F9                BL __2printf
.text:00000008  00 20                      MOVS R0, #0
.text:0000000A  10 BD                      POP {R4, PC}
.text:00000304  68 65 6C 6C+aHelloWorld    DCB "hello world",0

在我正在阅读的书中,它开始解释这种情况,如下所述:

  

我们可以轻松发现2字节(16位)操作码。如前所述,这就是Thumb。

接着说,我不明白为什么,

  

但是,BL指令由两个16位指令组成。这是因为在一个16位操作码中使用较小的空间时,无法为printf()函数加载偏移量。因此,第一个16位指令加载偏移量的高10位,第二个指令加载偏移量的低11位。

对我来说,它看起来像两条指令,但是偏移量的高10位和偏移量的低11位是哪里来的?

0 个答案:

没有答案