Introduction to ARM64v8
Viwango vya Kipekee - EL (ARM64v8)
Katika usanifu wa ARMv8, viwango vya utekelezaji, vinavyojulikana kama Viwango vya Kipekee (ELs), vinataja kiwango cha uwezo na uwezo wa mazingira ya utekelezaji. Kuna viwango vinne vya kipekee, kuanzia EL0 hadi EL3, kila moja ikitoa lengo tofauti:
EL0 - Hali ya Mtumiaji:
Hii ni kiwango cha chini cha uwezo na hutumiwa kwa kutekeleza nambari za maombi ya kawaida.
Programu zinazoendesha kwenye EL0 zimejitenga kutoka kwa nyingine na kutoka kwa programu ya mfumo, ikiboresha usalama na utulivu.
EL1 - Hali ya Msingi ya Kerneli ya Mfumo wa Uendeshaji:
Zaidi ya majukumu ya mfumo wa uendeshaji hufanya kazi kwenye kiwango hiki.
EL1 ina uwezo zaidi kuliko EL0 na inaweza kupata rasilimali za mfumo, lakini kwa vikwazo fulani kuhakikisha uadilifu wa mfumo.
EL2 - Hali ya Hypervisor:
Kiwango hiki hutumiwa kwa uvirtualization. Hypervisor inayotekelezwa kwenye EL2 inaweza kusimamia mifumo mingi ya uendeshaji (kila moja katika EL1 yake) inayotekelezwa kwenye vifaa vya kimwili sawa.
EL2 hutoa vipengele vya kujitenga na kudhibiti mazingira vilivyovirtualized.
EL3 - Hali ya Kufuatilia Salama:
Hii ni kiwango cha juu zaidi cha uwezo na mara nyingi hutumiwa kwa kuanzisha salama na mazingira ya utekelezaji yanayoweza kudhibitika.
EL3 inaweza kusimamia na kudhibiti ufikiaji kati ya hali salama na zisizo salama (kama vile kuanzisha salama, OS ya kuaminika, n.k.).
Matumizi ya viwango hivi hutoa njia iliyopangwa na salama ya kusimamia vipengele tofauti vya mfumo, kutoka kwa programu za watumiaji hadi programu ya mfumo yenye uwezo zaidi. Mbinu ya ARMv8 kwa viwango vya uwezo husaidia katika kujitenga kwa ufanisi sehemu tofauti za mfumo, hivyo kuboresha usalama na uthabiti wa mfumo.
Vidhibiti (ARM64v8)
ARM64 ina vidhibiti vya jumla vya 31, vilivyopewa majina x0
hadi x30
. Kila moja inaweza kuhifadhi thamani ya 64-bit (baiti 8). Kwa operesheni zinazohitaji thamani za biti 32 tu, vidhibiti sawa vinaweza kupatikana katika hali ya biti 32 kwa kutumia majina w0 hadi w30.
x0
hadix7
- Mara nyingi hutumiwa kama vidhibiti vya kufuta na kwa kupitisha parameta kwa subroutines.
x0
pia inabeba data ya kurudi ya kazi
x8
- Katika kerneli ya Linux,x8
hutumiwa kama nambari ya wito wa mfumo kwa maelekezo yasvc
. Katika macOS x16 ndio hutumiwa!x9
hadix15
- Vidhibiti vya muda mrefu zaidi, mara nyingi hutumiwa kwa vidhibiti vya mitaa.x16
nax17
- Vidhibiti vya Wito wa Ndani wa Mchakato. Vidhibiti vya muda mfupi kwa thamani za moja kwa moja. Pia hutumiwa kwa wito wa kazi za moja kwa moja na PLT (Procedure Linkage Table) stubs.
x16
hutumiwa kama nambari ya wito wa mfumo kwa maelekezo yasvc
katika macOS.
x18
- Kudhibiti jukwaa. Inaweza kutumika kama kudhibiti vya jumla, lakini kwenye majukwaa fulani, kudhibiti huu unahifadhiwa kwa matumizi maalum ya jukwaa: Kielekezi kwa kizuizi cha mazingira cha watumiaji wa sasa katika Windows, au kuelekeza kwa muundo wa kazi unaoendeshwa kwa sasa katika kerneli ya Linux.x19
hadix28
- Hizi ni vidhibiti vinavyohifadhiwa na wito. Kazi lazima ihifadhi thamani za vidhibiti hivi kwa mpigaji wake, kwa hivyo zinahifadhiwa kwenye steki na kurejeshwa kabla ya kurudi kwa mpigaji.x29
- Kielekezi cha fremu kufuatilia fremu ya steki. Wakati fremu mpya ya steki inaundwa kwa sababu kazi inaitwa, kudhibiti chax29
kina hifadhiwa kwenye steki na anwani mpya ya fremu (anwani yasp
) inahifadhiwa kwenye kielekezi hiki.
Kudhibiti hiki pia kinaweza kutumika kama kielekezi cha jumla ingawa kawaida hutumiwa kama kumbukumbu ya vidhibiti vya mitaa.
x30
aulr
- Kielekezi cha Kiungo. Kinashikilia anwani ya kurudi wakati maelekezo yaBL
(Branch with Link) auBLR
(Branch with Link to Register) yanatekelezwa kwa kuhifadhi thamani yapc
kwenye kielekezi hiki.
Pia kinaweza kutumika kama kudhibiti kingine chochote.
Ikiwa kazi ya sasa itaita kazi mpya na hivyo kubadilisha
lr
, itahifadhi kwenye steki mwanzoni, hii ni epilogue (stp x29, x30 , [sp, #-48]; mov x29, sp
-> Hifadhifp
nalr
, tengeneza nafasi na patafp
mpya) na kuirudisha mwishoni, hii ni prologue (ldp x29, x30, [sp], #48; ret
-> Rudishafp
nalr
na rudi).
sp
- Kielekezi cha steki, hutumiwa kufuatilia juu ya steki.
thamani ya
sp
daima inapaswa kudumishwa kwa angalau urekebishaji wa quadword au kutokea kwa kosa la urekebishaji.
pc
- Kielekezi cha Programu, kinachoelekeza kwa maelekezo yanayofuata. Kudhibiti hiki kinaweza kusasishwa kupitia kizazi cha kipekee, kurudi kwa kipekee, na matawi. Maelekezo ya kawaida pekee yanayoweza kusoma kudhibiti hiki ni maelekezo ya matawi na viungo (BL, BLR) kuhifadhi anwani yapc
kwenyelr
(Kielekezi cha Kiungo).xzr
- Kudhibiti cha Sifuri. Pia huitwawzr
katika fomu yake ya kudhibiti ya biti 32.
Vidhibiti vya Wn
ni toleo la biti 32 la kudhibiti cha Xn
.
Vidhibiti vya SIMD na Floating-Point
Zaidi ya hayo, kuna vidhibiti vingine 32 vya urefu wa biti 128 vinavyoweza kutumika katika operesheni zilizooanishwa za data nyingi kwa maelekezo moja na kwa kufanya hesabu za nukta kikomo. Hivi huitwa vidhibiti vya Vn ingawa wanaweza pia kufanya kazi katika biti 64, 32, 16, na 8 na kisha huitwa Qn
, Dn
, Sn
, Hn
na Bn
.
Vipimo vya Mfumo
Kuna mamia ya vipimo vya mfumo, vinavyoitwa pia vipimo maalum vya kusudi (SPRs), hutumika kwa kufuatilia na kudhibiti tabia za processors.
Vinaweza kusomwa au kuwekwa tu kwa kutumia maagizo maalum yaliyotengwa mrs
na msr
.
Vipimo maalum TPIDR_EL0
na TPIDDR_EL0
mara nyingi hupatikana wakati wa kurekebisha. Kiambishi cha EL0
kinaonyesha kosa la chini ambapo kipimo kinaweza kupatikana (katika kesi hii EL0 ni kosa la kawaida (haki) ambalo programu za kawaida hufanya nalo).
Maranyingi hutumika kuhifadhi anwani ya msingi ya eneo la kuhifadhi la mnyororo wa wateja la kumbukumbu. Kawaida la kwanza linaweza kusomwa na kuandikwa na programu zinazoendesha katika EL0, lakini la pili linaweza kusomwa kutoka EL0 na kuandikwa kutoka EL1 (kama kernel).
mrs x0, TPIDR_EL0 ; Soma TPIDR_EL0 hadi x0
msr TPIDR_EL0, X0 ; Andika x0 hadi TPIDR_EL0
PSTATE
PSTATE ina vipengele vya mchakato kadhaa vilivyosanidishwa katika kipimo maalum cha SPSR_ELx
, X ikiwa ni kiwango cha ruhusa cha kosa kilichosababishwa (hii inaruhusu kurejesha hali ya mchakato wakati kosa linamalizika).
Hizi ni sehemu zinazopatikana:
N
,Z
,C
naV
hali za hali:N
inamaanisha uendeshaji ulitoa matokeo hasiZ
inamaanisha uendeshaji ulitoa sifuriC
inamaanisha uendeshaji ulibebaV
inamaanisha uendeshaji ulitoa kipindupindu kilichosainiwa:Jumla ya nambari mbili chanya inatoa matokeo hasi.
Jumla ya nambari mbili hasi inatoa matokeo chanya.
Katika upunguzaji, wakati nambari kubwa hasi inapunguzwa kutoka kwa nambari ndogo chanya (au kinyume chake), na matokeo hayawezi kuwakilishwa ndani ya safu ya ukubwa wa biti iliyotolewa.
Kwa dhahiri processor hajui uendeshaji ni wa kusainiwa au la, kwa hivyo itachunguza C na V katika uendeshaji na kuonyesha ikiwa kuna kubeba ilitokea ikiwa ilikuwa ya kusainiwa au isiyosainiwa.
Sio maagizo yote yanayosasisha bendera hizi. Baadhi kama CMP
au TST
hufanya hivyo, na zingine zenye kiambishi cha s kama ADDS
pia hufanya hivyo.
Bendera ya sasa ya urefu wa kusajili (
nRW
): Ikiwa bendera inashikilia thamani 0, programu itaendesha katika hali ya utekelezaji wa AArch64 mara baada ya kurejeshwa.Kiambishi cha Kosa la Kipekee (
EL
): Programu ya kawaida inayoendesha katika EL0 itakuwa na thamani 0Bendera ya hatua moja (
SS
): Hutumiwa na wachunguzi wa kosa la hatua moja kwa kuweka bendera ya SS kuwa 1 ndani yaSPSR_ELx
kupitia kosa. Programu itaendesha hatua na kutoa kosa la hatua moja.Bendera ya hali ya kosa isio halali (
IL
): Hutumiwa kuashiria wakati programu yenye ruhusa inafanya uhamisho wa kiwango cha kosa lisilo halali, bendera hii inawekwa kuwa 1 na processor kuzindua kosa la hali lisilo halali.Bendera za
DAIF
: Bendera hizi huruhusu programu yenye ruhusa kuficha kwa hiari baadhi ya kosa la nje.Ikiwa
A
ni 1 inamaanisha kosa za kushtukiza za asenkroni zitazinduliwa.I
inaashiria kujibu kwa Ombi la Kuingilia la vifaa vya nje (IRQs). na F inahusiana na Ombi za Kuingilia za Haraka (FIRs).Bendera za kuchagua chaguo la kidole cha mstari (
SPS
): Programu zenye ruhusa zinazoendesha katika EL1 na zaidi zinaweza kubadilishana kati ya kutumia kusajili la kidole chao wenyewe na lile la mfano wa mtumiaji (k.m. kati yaSP_EL1
naEL0
). Hii kubadilishana hufanywa kwa kuandika kwa kipimo maalum chaSPSel
. Hii haiwezi kufanywa kutoka EL0.
Mkataba wa Kuita (ARM64v8)
Mkataba wa kuita wa ARM64 unabainisha kwamba parameta nane za kwanza kwa kazi hutumwa katika visajili x0
hadi x7
. Parameta zaidi hutumwa kwenye stakishi. Thamani ya kurudi hutumwa tena katika kisajili x0
, au pia katika x1
pia ikiwa ni urefu wa biti 128. Visajili vya x19
hadi x30
na sp
lazima viwe vimehifadhiwa kupitia wito wa kazi.
Unaposoma kazi katika mkusanyiko, tafuta prologue na epilogue ya kazi. Prologue kawaida inahusisha kuhifadhi kiashiria cha fremu (x29
), kuweka fremu mpya ya kiashiria, na kutenga nafasi ya stakishi. Epilogue kawaida inahusisha kurudisha kiashiria cha fremu kilichohifadhiwa na kurudi kutoka kwa kazi.
Mkataba wa Kuita katika Swift
Swift ina mkataba wake wa kuita ambao unaweza kupatikana katika https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64
Maagizo ya Kawaida (ARM64v8)
Maagizo ya ARM64 kwa ujumla yana muundo wa opcode dst, src1, src2
, ambapo opcode
ni operesheni itakayotekelezwa (kama vile ongeza
, punguza
, hamisha
, nk.), dst
ni kisajili cha marudio ambapo matokeo yatahifadhiwa, na src1
na src2
ni visajili vya chanzo. Thamani za moja kwa moja pia zinaweza kutumika badala ya visajili vya chanzo.
hamisha
: Hamisha thamani kutoka kwa kisajili kimoja kwenda kingine.Mfano:
hamisha x0, x1
— Hii inahamisha thamani kutokax1
hadix0
.ldr
: Pakia thamani kutoka kwa kumbukumbu hadi kwa kisajili.Mfano:
ldr x0, [x1]
— Hii inapakia thamani kutoka kwenye eneo la kumbukumbu linaloelekezwa nax1
hadix0
.Hali ya Kufuta: Kufuta inayoathiri kidole cha awali inaonyeshwa, kwa mfano:
ldr x2, [x1, #8]
, hii itapakia kwenye x2 thamani kutoka x1 + 8ldr x2, [x0, x1, lsl #2]
, hii itapakia kwenye x2 kitu kutoka kwenye safu x0, kutoka kwenye nafasi x1 (indeksi) * 4Hali ya Kabla ya Kufuta: Hii itatumia hesabu kwa asili, kupata matokeo na pia kuhifadhi asili mpya katika asili.
ldr x2, [x1, #8]!
, hii itapakiax1 + 8
katikax2
na kuhifadhi katika x1 matokeo yax1 + 8
str lr, [sp, #-4]!
, Hifadhi kiashiria cha kiungo katika sp na sasisha kisajili cha spHali ya Baada ya Kufuta: Hii ni kama ile ya awali lakini anwani ya kumbukumbu inafikiwa kisha kufuta hufanywa na kuhifadhiwa.
ldr x0, [x1], #8
, pakiax1
katikax0
na sasisha x1 nax1 + 8
Kuwasilisha kwa PC: Katika kesi hii anwani ya kupakia inahesabiwa kulingana na kisajili cha PC
ldr x1, =_start
, Hii itapakia anwani ambapo ishara ya_start
inaanza katika x1 inayohusiana na PC ya sasa.str
: Hifadhi thamani kutoka kwa kisajili hadi kwenye kumbukumbu.Mfano:
str x0, [x1]
— Hii inahifadhi thamani katikax0
kwenye eneo la kumbukumbu linaloelekezwa nax1
.ldp
: Pakia Jozi ya Visajili. Maagizo haya hupakia visajili viwili kutoka kwa eneo la kumbukumbu za mfululizo. Anwani ya kumbukumbu kawaida hufanywa kwa kuongeza kufuta kwa thamani katika kisajili kingine.Mfano:
ldp x0, x1, [x2]
— Hii inapakiax0
nax1
kutoka kwenye maeneo ya kumbukumbu kwenyex2
nax2 + 8
, mtawalia.stp
: Hifadhi Jozi ya Visajili. Maagizo haya huhifadhi visajili viwili kwenye eneo la kumbukumbu za mfululizo. Anwani ya kumbukumbu kawaida hufanywa kwa kuongeza kufuta kwa thamani katika kisajili kingine.Mfano:
stp x0, x1, [sp]
— Hii inahifadhix0
nax1
kwenye maeneo ya kumbukumbu kwenyesp
nasp + 8
, mtawalia.stp x0, x1, [sp, #16]!
— Hii inahifadhix0
nax1
kwenye maeneo ya kumbukumbu kwenyesp+16
nasp + 24
, mtawalia, na kusasishasp
nasp+16
.ongeza
: Ongeza thamani za visajili viwili na uhifadhi matokeo katika kisajili.Syntax: add(s) Xn1, Xn2, Xn3 | #imm, [shift #N | RRX]
Xn1 -> Marudio
Xn2 -> Operand 1
Xn3 | #imm -> Operando 2 (sajili au mara moja)
[shift #N | RRX] -> Fanya mabadiliko au piga simu kwa RRX
Mfano:
add x0, x1, x2
— Hii inaongeza thamani katikax1
nax2
pamoja na kuhifadhi matokeo katikax0
.add x5, x5, #1, lsl #12
— Hii inalingana na 4096 (1 iliyohamishwa mara 12) -> 1 0000 0000 0000 0000adds
Hii inatekelezaadd
na kusasisha benderasub
: Punguza thamani za sajili mbili na uhifadhi matokeo katika sajili.Angalia
add
syntax.Mfano:
sub x0, x1, x2
— Hii inapunguza thamani katikax2
kutokax1
na kuhifadhi matokeo katikax0
.subs
Hii ni kama sub lakini ikisasisha benderamul
: Zidisha thamani za sajili mbili na uhifadhi matokeo katika sajili.Mfano:
mul x0, x1, x2
— Hii inazidisha thamani katikax1
nax2
na kuhifadhi matokeo katikax0
.div
: Gawanya thamani ya sajili moja kwa nyingine na uhifadhi matokeo katika sajili.Mfano:
div x0, x1, x2
— Hii inagawanya thamani katikax1
kwax2
na kuhifadhi matokeo katikax0
.lsl
,lsr
,asr
,ror
,rrx
:Mbadala wa kushoto la mantiki: Ongeza 0 kutoka mwisho ukihamisha biti nyingine mbele (zidisha mara n kwa 2)
Mbadala wa kulia la mantiki: Ongeza 1 mwanzoni ukihamisha biti nyingine nyuma (gawanya mara n kwa 2 kwa nambari zisizo na saini)
Mbadala wa kulia wa hisabati: Kama
lsr
, lakini badala ya kuongeza 0 ikiwa biti muhimu zaidi ni 1, **1s zinaongezwa (**gawanya mara n kwa 2 kwa nambari zenye saini)Zungusha kulia: Kama
lsr
lakini chochote kinachotolewa kulia kinawekwa kushotoZungusha Kulia na Panua: Kama
ror
, lakini na bendera ya kubeba kama "biti muhimu zaidi". Kwa hivyo bendera ya kubeba inahamishiwa kwa biti ya 31 na biti iliyotolewa kwa bendera ya kubeba.bfm
: Harakisha ya Biti, hizi operesheni nakili biti0...n
kutoka kwa thamani na kuziweka katika nafasim..m+n
.#s
inabainisha nafasi ya biti ya kushoto na#r
kiasi cha zungusha kulia.Harakisha ya biti:
BFM Xd, Xn, #r
Harakisha ya biti yenye saini:
SBFM Xd, Xn, #r, #s
Harakisha ya biti isiyo na saini:
UBFM Xd, Xn, #r, #s
Toa na Ingiza Biti: Nakili uga wa biti kutoka kwa sajili na uziweke katika sajili nyingine.
BFI X1, X2, #3, #4
Ingiza biti 4 kutoka X2 kutoka biti ya 3 ya X1BFXIL X1, X2, #3, #4
Toa kutoka biti ya 3 ya X2 biti nne na uziweke kwa X1SBFIZ X1, X2, #3, #4
Panua biti 4 kutoka X2 na uziweke kwa X1 kuanzia nafasi ya biti 3 ukiweka biti sahihiSBFX X1, X2, #3, #4
Toa biti 4 kuanzia biti 3 kutoka X2, panua biti sahihi, na weka matokeo kwa X1UBFIZ X1, X2, #3, #4
Panua biti 4 kutoka X2 na uziweke kwa X1 kuanzia nafasi ya biti 3 ukiweka biti sahihiUBFX X1, X2, #3, #4
Toa biti 4 kuanzia biti 3 kutoka X2 na weka matokeo yaliyozidishwa na sifuri kwa X1.Panua Saini Kwenda X: Panua saini (au ongeza tu 0s katika toleo lisilo na saini) ya thamani ili kuweza kufanya operesheni nayo:
SXTB X1, W2
Panua saini ya baiti kutoka W2 hadi X1 (W2
ni nusu yaX2
) ili kujaza biti 64SXTH X1, W2
Panua saini ya nambari ya 16biti kutoka W2 hadi X1 ili kujaza biti 64SXTW X1, W2
Panua saini ya baiti kutoka W2 hadi X1 ili kujaza biti 64UXTB X1, W2
Ongeza 0s (bila saini) kwa baiti kutoka W2 hadi X1 ili kujaza biti 64extr
: Toa biti kutoka kwa jozi ya sajili zilizounganishwa.Mfano:
EXTR W3, W2, W1, #3
Hii ita unganisha W1+W2 na kupata kutoka biti ya 3 ya W2 hadi biti ya 3 ya W1 na kuhifadhi katika W3.cmp
: Hakiki sajili mbili na weka bendera za hali. Ni jina mbadala lasubs
ikisawazisha sajili ya marudio na sajili sifuri. Inafaa kujua ikiwam == n
.Inaunga mkono syntax sawa na
subs
Mfano:
cmp x0, x1
— Hii inahakiki thamani katikax0
nax1
na kuweka bendera za hali kulingana.cmn
: Hakiki hasi ya operesheni. Katika kesi hii ni jina mbadala laadds
na inaunga mkono syntax sawa. Inafaa kujua ikiwam == -n
.ccmp
: Hakiki ya masharti, ni hakiki ambayo itafanywa tu ikiwa hakiki ya awali ilikuwa kweli na itaweka wazi hasa biti za nzcv.cmp x1, x2; ccmp x3, x4, 0, NE; blt _func
-> ikiwa x1 != x2 na x3 < x4, ruka kwenye funcHii ni kwa sababu
ccmp
itatekelezwa tu ikiwacmp
ya awali ilikuwaNE
, ikiwa haikuwa hivyo, biti zanzcv
zitawekwa kama 0 (ambayo haitakidhi hakiki yablt
).Hii inaweza pia kutumika kama
ccmn
(sawa lakini hasi, kamacmp
vscmn
).tst
: Inachunguza ikiwa thamani za hakiki zote ni 1 (inafanya kazi kama na ANDS bila kuhifadhi matokeo mahali popote). Ni muhimu kuchunguza sajili na thamani na kuangalia ikiwa biti yoyote ya sajili iliyotajwa katika thamani ni 1.Mfano:
tst X1, #7
Hakiki ikiwa biti za mwisho 3 za X1 ni 1teq
: Operesheni ya XOR ikipuuza matokeob
: Tawi lisilo na mashartiMfano:
b myFunction
Tafadhali kumbuka hii haitajaza sajili ya kiungo na anwani ya kurudi (haifai kwa wito wa subrutine ambao unahitaji kurudi nyuma)
bl
: Tawi na kiungo, hutumiwa kwa kuita subrutine. Huhifadhi anwani ya kurudi katikax30
.Mfano:
bl myFunction
— Hii inaita kazimyFunction
na kuhifadhi anwani ya kurudi katikax30
.Tafadhali kumbuka hii haitajaza sajili ya kiungo na anwani ya kurudi (haifai kwa wito wa subrutine ambao unahitaji kurudi nyuma)
blr
: Tawi na Kiungo kwenda Sajili, hutumiwa kwa kuita subrutine ambapo lengo limetajwa katika sajili. Huhifadhi anwani ya kurudi katikax30
. (Hii niMfano:
blr x1
— Hii inaita kazi ambayo anwani yake iko katikax1
na kuhifadhi anwani ya kurudi katikax30
.ret
: Rudi kutoka kwa subrutine, kawaida kwa kutumia anwani katikax30
.Mfano:
ret
— Hii inarudi kutoka kwa subrutine ya sasa kwa kutumia anwani ya kurudi katikax30
.b.<cond>
: Matawi ya mashartib.eq
: Tawi ikiwa sawa, kulingana na hakiki ya awali yacmp
.Mfano:
b.eq label
— Ikiwa hakiki ya awali yacmp
ilipata thamani mbili sawa, hii inaruka kwenyelabel
.b.ne
: Branch if Not Equal. Maelekezo haya yanachunguza bendera za hali (ambazo ziliwekwa na maelekezo ya kulinganisha hapo awali), na ikiwa thamani zilizolinganishwa hazikuwa sawa, inaruka kwenye lebo au anwani.Mfano: Baada ya maelekezo ya
cmp x0, x1
,b.ne label
— Ikiwa thamani katikax0
nax1
hazikuwa sawa, hii inaruka kwenyelabel
.cbz
: Kulinganisha na Kufanya Tawi kwa Sifuri. Maelekezo haya yanalinganisha kisajili na sifuri, na ikiwa wana sawa, inaruka kwenye lebo au anwani.Mfano:
cbz x0, label
— Ikiwa thamani katikax0
ni sifuri, hii inaruka kwenyelabel
.cbnz
: Kulinganisha na Kufanya Tawi kwa Si-Sifuri. Maelekezo haya yanalinganisha kisajili na sifuri, na ikiwa hawako sawa, inaruka kwenye lebo au anwani.Mfano:
cbnz x0, label
— Ikiwa thamani katikax0
si sifuri, hii inaruka kwenyelabel
.tbnz
: Jaribu biti na ruka kwenye si-sifuriMfano:
tbnz x0, #8, label
tbz
: Jaribu biti na ruka kwenye sifuriMfano:
tbz x0, #8, label
Operesheni za kuchagua kwa Masharti: Hizi ni operesheni ambazo tabia yake inatofautiana kulingana na bits za masharti.
csel Xd, Xn, Xm, cond
->csel X0, X1, X2, EQ
-> Ikiwa ni kweli, X0 = X1, ikiwa ni uongo, X0 = X2csinc Xd, Xn, Xm, cond
-> Ikiwa ni kweli, Xd = Xn, ikiwa ni uongo, Xd = Xm + 1cinc Xd, Xn, cond
-> Ikiwa ni kweli, Xd = Xn + 1, ikiwa ni uongo, Xd = Xncsinv Xd, Xn, Xm, cond
-> Ikiwa ni kweli, Xd = Xn, ikiwa ni uongo, Xd = SIO(Xm)cinv Xd, Xn, cond
-> Ikiwa ni kweli, Xd = SIO(Xn), ikiwa ni uongo, Xd = Xncsneg Xd, Xn, Xm, cond
-> Ikiwa ni kweli, Xd = Xn, ikiwa ni uongo, Xd = - Xmcneg Xd, Xn, cond
-> Ikiwa ni kweli, Xd = - Xn, ikiwa ni uongo, Xd = Xncset Xd, Xn, Xm, cond
-> Ikiwa ni kweli, Xd = 1, ikiwa ni uongo, Xd = 0csetm Xd, Xn, Xm, cond
-> Ikiwa ni kweli, Xd = <wote 1>, ikiwa ni uongo, Xd = 0adrp
: Hesabu anwani ya ukurasa wa ishara na uhifadhi katika kisajili.Mfano:
adrp x0, ishara
— Hii inahesabu anwani ya ukurasa waishara
na kuihifadhi katikax0
.ldrsw
: Pakia thamani ya 32-bit iliyosainiwa kutoka kumbukumbu na ongeza ishara hadi 64 biti.Mfano:
ldrsw x0, [x1]
— Hii inapakia thamani iliyosainiwa ya biti 32 kutoka kwenye eneo la kumbukumbu linaloelekezwa nax1
, inaongeza ishara hadi 64 biti, na kuihifadhi katikax0
.stur
: Hifadhi thamani ya kisajili kwenye eneo la kumbukumbu, ukitumia mbadala kutoka kwa kisajili kingine.Mfano:
stur x0, [x1, #4]
— Hii inahifadhi thamani katikax0
kwenye anwani ya kumbukumbu ambayo ni bayti 4 zaidi ya anwani iliyopo katikax1
.svc
: Fanya wito wa mfumo. Inasimama kwa "Wito wa Msimamizi". Wakati processor inatekeleza maelekezo haya, inabadilisha kutoka hali ya mtumiaji hadi hali ya msingi na inaruka kwenye eneo maalum kwenye kumbukumbu ambapo msimamizi wa mfumo wa kernel unapatikana.Mfano:
Prologi ya Kazi
Hifadhi kiungo cha usajili na kielekezi cha fremu kwenye steki:
Wekeza pointer mpya wa fremu:
mov x29, sp
(inaweka pointer mpya wa fremu kwa kazi ya sasa)Tenga nafasi kwenye steki kwa mizani ya ndani (ikiwa inahitajika):
sub sp, sp, <size>
(ambapo<size>
ni idadi ya baiti inayohitajika)
Epilogo ya Kazi
Futa mizani ya ndani (ikiwa ilikuwa imetengwa):
add sp, sp, <size>
Rejesha msajili wa kiungo na pointer wa fremu:
Kurudi:
ret
(inarejesha udhibiti kwa mtu aliyetoa wito kwa kutumia anwani kwenye daftari la viungo)
Hali ya Utekelezaji ya AARCH32
Armv8-A inasaidia utekelezaji wa programu za biti 32. AArch32 inaweza kukimbia katika moja ya seti mbili za maagizo: A32
na T32
na inaweza kubadilisha kati yao kupitia interworking
.
Programu za biti 64 zenye haki zinaweza kupanga utekelezaji wa programu za biti 32 kwa kutekeleza uhamisho wa kiwango cha kipekee kwenda kwa biti 32 zenye haki za chini.
Tafadhali kumbuka kwamba mpito kutoka biti 64 kwenda biti 32 hufanyika na kiwango cha chini cha kiwango cha kipekee (kwa mfano programu ya biti 64 katika EL1 ikichochea programu katika EL0). Hii hufanywa kwa kuweka biti 4 ya daftari maalum la usajili wa SPSR_ELx
kuwa 1 wakati mchakato wa wateja wa AArch32
uko tayari kutekelezwa na sehemu iliyobaki ya SPSR_ELx
inahifadhi mipango ya CPSR ya AArch32. Kisha, mchakato wenye haki huita maagizo ya ERET
ili mchakato ibadilike kwenda kwa AArch32
kuingia katika A32 au T32 kulingana na CPSR**.**
Interworking
hufanyika kwa kutumia biti za J na T za CPSR. J=0
na T=0
inamaanisha A32
na J=0
na T=1
inamaanisha T32. Hii kimsingi inamaanisha kuweka biti ya chini kuwa 1 kuashiria seti ya maagizo ni T32.
Hii inawekwa wakati wa maagizo ya matawi ya interworking, lakini inaweza pia kuwekwa moja kwa moja na maagizo mengine wakati PC inawekwa kama usajili wa marudio. Mfano:
Mfano mwingine:
Rejista
Kuna rejista 16 za biti 32 (r0-r15). Kutoka r0 hadi r14 wanaweza kutumika kwa operesheni yoyote, hata hivyo baadhi yao kawaida huwa zimehifadhiwa:
r15
: Programu ya kuhesabu (daima). Ina anwani ya maagizo yanayofuata. Katika A32 sasa + 8, katika T32, sasa + 4.r11
: Kiashiria cha fremur12
: Rejista ya wito wa ndani wa utaratibur13
: Kiashiria cha stekir14
: Kiashiria cha kiungo
Zaidi ya hayo, rejista zinahifadhiwa katika rejista zilizohifadhiwa
. Ambazo ni sehemu zinazohifadhi thamani za rejista kuruhusu kufanya mabadiliko ya muktadha haraka katika kushughulikia kipekee na operesheni za kipekee ili kuepuka haja ya kuhifadhi na kurejesha rejista kila wakati.
Hii hufanywa kwa kuihifadhi hali ya mchakato kutoka kwa CPSR
hadi SPSR
ya hali ya mchakato ambayo kipekee inachukuliwa. Wakati wa kurudi kutoka kwa kipekee, CPSR
inarejeshwa kutoka kwa SPSR
.
CPSR - Rejista ya Hali ya Programu ya Sasa
Katika AArch32 CPSR inafanya kazi kama PSTATE
katika AArch64 na pia inahifadhiwa katika SPSR_ELx
wakati kipekee inachukuliwa ili kurejesha baadaye utekelezaji:
Vipengele vimegawanywa katika vikundi kadhaa:
Rejista ya Hali ya Programu ya Maombi (APSR): Alama za hesabu na inaweza kufikiwa kutoka EL0
Rejista za Hali ya Utekelezaji: Tabia ya mchakato (inasimamiwa na OS).
Rejista ya Hali ya Programu ya Maombi (APSR)
Alama za
N
,Z
,C
,V
(sawa na AArch64)Alama ya
Q
: Inawekwa kuwa 1 wakati kutukuka kwa nambari za jumla kunatokea wakati wa utekelezaji wa maagizo maalum ya kutukuka ya hesabu. Mara tu inapowekwa kuwa1
, itabaki na thamani hiyo mpaka iwekwe kwa mkono kuwa 0. Zaidi ya hayo, hakuna maagizo yoyote yanayochunguza thamani yake kwa kawaida, lazima ifanywe kusoma kwa mkono.GE
(Kubwa au sawa) Alama: Hutumiwa katika operesheni za SIMD (Maagizo Moja, Data Nyingi) kama vile "kuongeza kwa pamoja" na "kutoa kwa pamoja". Operesheni hizi huruhusu kusindika pointi nyingi za data katika maagizo moja.
Kwa mfano, maagizo ya UADD8
ya kuongeza jozi nne za herufi (kutoka kwa waendeshaji wawili wa biti 32) kwa pamoja na kuhifadhi matokeo katika rejista ya biti 32. Kisha inaweka alama za GE
katika APSR
kulingana na matokeo haya. Kila alama ya GE inalingana na moja ya kuongeza herufi, ikionyesha ikiwa kuongeza kwa jozi hiyo ya herufi kulivuja.
Maagizo ya SEL
hutumia alama hizi za GE kutekeleza hatua za masharti.
Rejista za Hali ya Utekelezaji
Vipande vya
J
naT
:J
inapaswa kuwa 0 na ikiwaT
ni 0 seti ya maagizo ya A32 hutumiwa, na ikiwa ni 1, T32 hutumiwa.Rejista ya Hali ya Bloki ya IT (
ITSTATE
): Hizi ni vipande kutoka 10-15 na 25-26. Huhifadhi masharti ya maagizo ndani ya kikundi kilicho na kipimo chaIT
.Biti ya
E
: Inaonyesha mweisho.Vipande vya Hali na Kizuizi cha Kipekee (0-4): Vinabainisha hali ya sasa ya utekelezaji. Ya tano inaonyesha ikiwa programu inaendeshwa kama biti 32 (1) au biti 64 (0). Zingine 4 zinaonyesha hali ya kipekee inayotumiwa kwa sasa (wakati kipekee kinatokea na kinashughulikiwa). Nambari iliyowekwa inaonyesha kipaumbele cha sasa ikiwa kipekee nyingine itaanzishwa wakati huu inashughulikiwa.
AIF
: Baadhi ya kipekee zinaweza kuzimwa kwa kutumia vipandeA
,I
,F
. IkiwaA
ni 1 inamaanisha kuzimwa kwa ghafla kutafanyika.I
inaconfigure kujibu kwa vifaa vya nje vya Ombi la Kuingilia (IRQs). na F inahusiana na Ombi za Kuingilia za Haraka (FIRs).
macOS
BSD syscalls
Angalia syscalls.master. BSD syscalls zitakuwa na x16 > 0.
Mach Traps
Angalia katika syscall_sw.c mach_trap_table
na katika mach_traps.h mifano. Idadi ya juu ya Mach traps ni MACH_TRAP_TABLE_COUNT
= 128. Mach traps zitakuwa na x16 < 0, hivyo unahitaji kuita nambari kutoka kwa orodha ya awali na hasi: _kernelrpc_mach_vm_allocate_trap
ni -10
.
Unaweza pia kuangalia libsystem_kernel.dylib
katika disassembler kupata jinsi ya kuita hizi (na BSD) syscalls:
Maranyingi ni rahisi kuangalia msimbo uliopanguliwa kutoka libsystem_kernel.dylib
kuliko kuangalia msimbo wa chanzo kwa sababu msimbo wa wito wa mfumo wa BSD na Mach hutengenezwa kupitia hati (angalia maoni katika msimbo wa chanzo) wakati katika dylib unaweza kupata nini kinachoitwa.
wito wa machdep
XNU inasaidia aina nyingine ya wito unaoitwa tegemezi la mashine. Idadi ya wito hawa inategemea usanifu na wala wito au idadi haihakikishiwi kubaki thabiti.
ukurasa wa comm
Huu ni ukurasa wa kumbukumbu ya mmiliki wa kernel ambao umepangwa katika eneo la anwani ya kila mchakato wa mtumiaji. Lengo lake ni kufanya mpito kutoka hali ya mtumiaji hadi nafasi ya kernel haraka kuliko kutumia syscalls kwa huduma za kernel ambazo hutumiwa sana mpito huu ungekuwa wa ufanisi mdogo.
Kwa mfano, wito gettimeofdate
unasoma thamani ya timeval
moja kwa moja kutoka kwa ukurasa wa comm.
objc_msgSend
Ni kawaida sana kupata kazi hii ikitumiwa katika programu za Objective-C au Swift. Kazi hii inaruhusu kuita njia ya kitu cha Objective-C.
Parameta (maelezo zaidi katika nyaraka):
x0: self -> Kiashiria kwa kipengee
x1: op -> Chaguzi ya njia
x2... -> Mengine ya hoja za njia iliyohimizwa
Kwa hivyo, ikiwa unaweka kizuizi kabla ya tawi kwa kazi hii, unaweza kwa urahisi kupata nini kinachoitwa katika lldb na (katika mfano huu kitu kinaita kitu kutoka NSConcreteTask
ambacho kitatekeleza amri):
Kwa kuweka variable ya mazingira NSObjCMessageLoggingEnabled=1
inawezekana kurekodi wakati hii function inaitwa kwenye faili kama /tmp/msgSends-pid
.
Zaidi ya hayo, kwa kuweka OBJC_HELP=1
na kuita binary yoyote unaweza kuona variables nyingine za mazingira unazoweza kutumia kurekodi wakati hatua fulani za Objc-C zinatokea.
Inapoitwa hii function, ni muhimu kupata method iliyoitwa ya instance iliyotajwa, kwa hili utafutaji tofauti unafanywa:
Fanya utafutaji wa cache wa matumaini:
Ikiwa mafanikio, maliza
Pata runtimeLock (soma)
Ikiwa (realize && !cls->realized) realize class
Ikiwa (initialize && !cls->initialized) initialize class
Jaribu cache ya class yenyewe:
Ikiwa mafanikio, maliza
Jaribu orodha ya method ya class:
Ikiwa imepatikana, jaza cache na maliza
Jaribu cache ya superclass:
Ikiwa mafanikio, maliza
Jaribu orodha ya method ya superclass:
Ikiwa imepatikana, jaza cache na maliza
Ikiwa (resolver) jaribu method resolver, na rudia kutoka kwenye utafutaji wa class
Ikiwa bado hapa (= kila kitu kingine kimeshindwa) jaribu forwarder
Shellcodes
Kwa kuchakata:
Kutoa baits:
Kwa macOS mpya:
Last updated