Понимание этого кода сборки руки части

.syntax unified
.thumb

.cpu cortex-m4
.arch armv7e-m
.fpu fpv4-sp-d16

/* Changes from unprivileged to privileged mode. */
.thumb_func
.section    .kernel
.global     raise_privilege
.type       raise_privilege, %function
raise_privilege:
mrs     r0, control
bic     r0, r0, #1
msr     control, r0
dsb
isb
bx      lr

это часть кода сборки руки. Я могу проверить руководство по чипу, чтобы понять смысл инструкций. Но я не знаю, как понять поведение директив ассемблера, таких как .thumb_func. Более того, я также не знаю, как использовать этот код детали, он не похож на обычную функцию. Так что я не знаю, как это "назвать".


person wzf1943    schedule 14.03.2014    source источник
comment
Псевдооперации, вероятно, не имеют отношения к выяснению того, что делает код. См. контрольный регистр , который не относится к ARM, а специфичен для cortex-M. Межсетевое взаимодействие большого пальца, вероятно, не слишком полезно, как и unified для cortex-M.   -  person artless noise    schedule 14.03.2014


Ответы (2)


  • Инструкции, начинающиеся с ., на самом деле являются директивами ассемблера. Вы можете посмотреть их в GAS: машинные директивы ARM.
  • .syntax unified сигнализирует об использовании унифицированного синтаксиса сборки ARM/Thumb. Концепция объясняется здесь и здесь.
  • .thumb_func сигнализирует о запуске функции режима Thumb для взаимодействия ARM-Thumb. Концепция объясняется здесь и здесь.
  • raise_privilege выглядит точно так же, как void raise_privilege(void) функция-лист (т.е. она не вызывает другие функции) в C для меня. Назовите это с помощью:
bl raise_privilege
person scottt    schedule 14.03.2014

Ассемблер gnu сломан, тупой, неуклюжий, выбери слово...

в этом случае .thumb_func плюс метка - это все, что вам нужно, чтобы иметь возможность вызывать эту метку. thumb_func сообщает ассемблеру, что следующая метка - это то, что я могу вызвать или загрузить адрес и использовать bx.

поэтому в этом или другом коде вы можете просто

bl raise_priviliedge 

(если bl может достичь и/или компоновщик добавляет трамплин). или вы можете

ldr rX,=raise_priviledge  
blx rX 

где rX — некоторый регистр общего назначения (например, r3).

person old_timer    schedule 14.03.2014