#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-битных инструкций. Это связано с тем, что невозможно загрузить смещение для функции
printf()
при использовании небольшого пространства в одном 16-битном коде операции. Следовательно, первая 16-битная инструкция загружает старшие 10 бит смещения, а вторая инструкция загружает младшие 11 бит смещения.
Для меня это выглядит как две инструкции, но откуда берутся старшие 10 бит смещения и младшие 11 бит смещения?