Разбиране на кода за сглобяване на рамото на тази част

.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. Thumb inter-networks вероятно не е много полезно, нито 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