#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位是哪里来的?