vak: (Default)
[personal profile] vak
Чтобы определить, как же работает машинная команда "mov r1, pc" на процессоре с архитектурой ARMv6-M, я сваял простую програмку.
unsigned pc, base;
asm volatile(
" adr %1, base \n"
"base: mov %0, pc \n"
: "=r" (pc), "=r" (base)
);
printf("base = %08x\n", base);
printf("pc = %08x\n", pc);
Результат:
base = 10000330
pc = 10000334
То есть имеем смещение +4 байта. Что несколько неожиданно, так как размер самой команды MOV всего два байта. То есть PC пролетает вперёд на лишнюю команду.

Вот как выглядит дизассемблированный машинный код:
1000032e:       a100            add     r1, pc, #0
10000330 <base>:
10000330: 467d mov r5, pc
Видим, что ассемблерная команда ADR превратилась в ADD того же регистра PC с константой. Но в случае команды ADD значение PC не пролетает вперёд, а честно указывает на следующую команду.

Верно я подозревал, что не всё так просто с этой командой MOV. Не зря эту возможность убрали в архитектуре aarch64.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org