Как рассчитывается смещение в этом коде сборки (C ++)

#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 бит смещения?


person Community    schedule 30.12.2018    source источник
comment
На моем телефоне действительно сложно совместить инструкцию, пункт назначения и источник, но именно так они читаются в каждой строке сборки.   -  person    schedule 31.12.2018
comment
Это настолько ясно, насколько я могу напечатать это в настоящий момент   -  person    schedule 31.12.2018
comment
Было бы полезно, если бы вы указали архитектуру с помощью тега.   -  person zx485    schedule 31.12.2018
comment
Архитектура представляет собой код C ++ и не оптимизирует Keil 6/2013 (режим Thumb)   -  person    schedule 31.12.2018
comment
Я думаю, что 06 F0 - это код инструкции, а 2E F9 - это ветвь, относящаяся к ПК.   -  person Jean-Claude Colette    schedule 31.12.2018
comment
Спасибо, что прояснили это для меня   -  person    schedule 31.12.2018