Как рассчитывается смещение в этом коде сборки (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 бит смещения?

0 ответов

Другие вопросы по тегам