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