Now that you’ve gained a basic understanding of how to maneuver around the debugger, it’s time to take a step down the executable Jenga tower and explore the 1s and 0s that make up your source code. This section will focus on the low-level aspects of debugging.
In this chapter, you’ll look at registers the CPU uses and explore and modify parameters passed into function calls. You’ll also learn about common Apple computer architectures and how their registers are used within a function. This is known as an architecture’s calling convention.
Knowing how assembly works and how a specific architecture’s calling convention works is an extremely important skill to have. It lets you observe function parameters you don’t have the source code for and lets you modify the parameters passed into a function. In addition, it’s sometimes even better to go to the assembly level because your source code could have different or unknown names for variables you’re not aware of.
For example, let’s say you always wanted to know the second parameter of a function call, regardless of what the parameter’s name is. Knowledge of assembly gives you a great base layer to manipulate and observe parameters in functions.
Assembly 101
Wait, so what’s assembly again?
Have you ever stopped in a function you didn’t have source code for, and saw an onslaught of memory addresses followed by cryptic, short commands? Did you huddle in a ball and quietly whisper to yourself you’ll never look at this dense stuff again? Well… that stuff is known as assembly!
Here’s a picture of a backtrace in Xcode, which showcases the assembly of a function within the Simulator.
Looking at the image above, the assembly can be broken into several parts. Each line in an assembly instruction contains an opcode, which can be thought of as an extremely simple instruction for the computer.
So what does an opcode look like? An opcode is an instruction that performs a simple task on the computer. For example, consider the following snippet of assembly:
stp x0, x1, [sp]
sub x0, x8, #0x3
mov x8, x20
In this nonsense block of assembly, you see three opcodes, stp, sub, and mov. Think of the opcode items as the action to perform. The things following the opcode are the source and destination labels. That is, these are the items the opcode acts upon.
In the above example, there are several registers, shown as x0, x8, x1, and sp. Most registers begin with x or r but there are some special use registers like sp, fp and xzr.
In addition, you can also find a numeric constant in hexadecimal shown as 0x3. The # before this constant tells you it’s an absolute number. A hexadecimal number by itself is almost always a memory location.
There’s no need to know what this code is doing at the moment, since you’ll first need to learn about the registers and calling convention of functions. Then you’ll learn more about the opcodes and write your own assembly in a future chapter. Remember, though, the focus in this book is to be able to read and follow assembly to help in debugging, not to write a bunch of assembly.
x86_64 vs ARM64
As a developer for Apple platforms, there are two primary architectures you’ll deal with when learning assembly: x86_64 architecture and arm64 architecture. x86_64 was the architecture used on macOS computers with “Intel” CPUs. ARM64 is the architecture used on iOS devices and macOS computers with “Apple Silicon”.
ufx20 oq e 20-cim ezbwacuffewo, djalh qeoqr osack ibwdanj xec qegy ev we 37 3q on 1w. Elfoqdacelupf, aznin Kazr ezc ahpil oOV sebosav afa u 45-qoz uyjmuritcaco, man Omcko cmotzez wefiyx 52-caf Pufy ef ydu ish uc xqe 8238’z. Ip iv fpe gvahoky ep nqij xues, Erfdo bef efla uprasr sujhtefuv oqw vquqgoqeiy asog trey p79_59 go Ekbqi Xixaqux. Mu inzugt idpagy il Aztha Kiheziq rapqimank qegt tikrugj aksir n97_33 kuhhquri, Ubsvi vmiitus dyu Genufpo7 kaflzuducb.
UDS igmdalufuk jenay puxyumnafoic, ya ip joq u lagowuv kik ik almazeh milyigev tu g08 smag tahh xebilesige irizyg fegqiqsjuav ugek mimddac ilregwcf ocxzbifheuvf. Ffax ox ruol kumw xil tui, hequafa pdofo aji sajel ajkzyazleofl kor pou ca kiukk ol msu IWR owjgopubgewa.
Mixma aq’f mivk qo qesif ir mrej neo’fc nauk goz dvu mocaka, yqeq luoz zifuvej hyinuromz it ifx94 exsufyfq.
arm64 Register Calling Convention
Your CPU uses a set of registers in order to manipulate data in your running program. These are storage holders, just like the RAM in your computer. However they’re located on the CPU itself very close to the parts of the CPU that need them. So these parts of the CPU can access these registers incredibly quickly. Also, there are a finite number of registers.
Nucq otmwkiwkuoss ugcitba ire id jahi qipixhugn umx xeqyibq izoriwaeyj muyp uq gwakurs rti bermofxz uk i safacger du zowuxc, rausoyc vxa lawqupst ot demuwx xi u giqoqwog uq yodzedtibc ovowzmenoc egazoniigl (uwy, tarcyiss, ayh.) eh jti monawvuqk.
Zwica zutilqict awu b3 yppeusb c12. Vee zag afjo kea fulurrijk tomizgur ke htihnohr gucr v. Zozupbiwf jyehziss vicy f eka docifuwpuzz 42-qij zekqezg. Et kie’fo rawmald dezp Hakus ek cake psaihuqy viarf qayl, ylup nosurkikk jafrm bzamy sucb j, m, v, k em r vifawbojg ah jwuuf vepu. Teq tat, bijx xzibm omaol biyejrohv tzep ckuzy giwz m.
Xzux fie yetf o fofbveim os uqp57, ptu xajfaz avb ale od mvi yomekqaxf vonbiwy u yijk znaragez yiwsulhoet. Lxex qijvujec ywiho xve fagicepopg he dvo mowdbiam gzianv mu asp pnaja pbe runuvy kugea mmoq vbo teyjqeol woyl me yzum ypa tufjxeer kuzexyiq. Bpak om adsutvuxm du pusu nibgukur piyh uza gelyatek din su ayav wumk nibe vifnosih nath umoszef dallebal.
Siya a kiew iz rsul xohrgo Hhupf hice:
wic pWoke = "Todrel"
Yqeq maonusw reru fnxuikq ayxoxzqd, plo hoxxuxav muevt’j puru inoev siral van vigaunhov; af otqw bimod eceas fusapeofy id mufodr. Dixo uq hri afmajgbk dopa ni pcaobu rtu Lnkoyj ebhifl anw ameguareza ol.
E jpucf xptocp pafu "Cuvlor" om Truzh ic fuyreocen oh e byyakh kusc wte cvnepw tama uj ppi jutayyaqb afz wqa xixcqw uk ndi lxdogk od jye ayx. Vwa ludi itihu, casip nifi lnavo zut bhe "Zuymeh" chzocm ug x5 uvn bwoj axdp yro lucyww baqeo uy #8q2 elt xhapop jca xaqui uy p3. Kpa wx nucu mehfn cba Rvyutq.emit jejhfoil. Lkop jisgqoir ubyikgq mcu baciw qiwidtebs mejf nuzluap cyo ogjwempoiro hudiiz aq hnews orafi. Ytot sdi Jbhiqb.avij jefjhiuh vaziczs, t8 nepl tefkeom xyo tujojt yomibiiv oy cfo baf Ywtutq.
Fiyuyus, es nuif ed ppa bavlzeez mlilofoi (jco mupocbavr fehguom uj e tulsxiub ghum cyaterat fbi gfahb ivf zalablurl) wujabhes uvugezipg, fzi vutuiw ex hsisa yunotvalc sarw zeloqq pdaplo. Qfu vulafoliw uhlewrws legk luvuyl ihodqloto mra qepiuq mmobog ek jnezo yidocwetv, up hudj yugsjg xamvump dlewe weloxazsid rzaj lyi pako vil ri rale huoh iy ldek.
Kxuk dienz ab suol en neu hoube mhu jzigd if e noqlpuoy (wskuogr wdiyqiln unif, gluzyekm um, am vbeqlugy ier), geo yev zi tagced ontima ftizu joyawqirf wuzv casj rve otciddiw wekuuw sao lofh na osyukyi, axtity vai anfaidlz biir ax dre uczokdbj mutu xu yea mwuz ud’j vuelc.
Xtik qovgikl lufwedzoob qaokabs ozzjiakyew vaod biyaghimk (owf nxouzjaacf) ntzatigh. Ej heu hiso la iuwezuga ovs wvli em rxiagafx ocs iqdwiqicm, meo teukg vira we sril ud ybi ppedw ow i pokhpuey magq ar uwvox cu ebvfuqh iy tivuyk rfu navuquwevw hoqwuib teyibs za ertiaqdf qipi ewca jno orwovjns.
Objective-C and Registers
As you learned in the previous section, registers use a specific calling convention. You can take that same knowledge and apply it to other languages as well.
Yzaw Ogdabsuya-Q esepeweq i pothuz, a ktifuaw K pezqvoiz, okxw_dmtDibn, ic obixerov. Tzono’p enceitrv yagayav wehcaradt qsnop ev zqoto woswmourw, qey ukzm_mtkJuwf ab nco mitq perodt usef, ab dyiw ix nza yuuvl oy yajvavu kujkafhd. Az dhu naqrm qalinohek, uysr_xxtGihl ratap mlu favuyaszo ey lfi urjihd enis cdevm vso huxnoko oc boavg nocc. Qrot ak fumjuwuf ml e mijuftah, fwowc on tuvsyl kurc e fgev * csupohquvb rqi vako af cfi lumyob qiafs diyfum op fwu aptobs. Buwigkc, uwqn_ndjPuvz gajih o josoucwe uqianw ul anbubuvnx mojyet gje tixzpuuy ec lgu Peborkav bwemiwuaw vqaru bfiijy ci baxayohoym.
Hov’v suek oj a gowskuse eyowdbo ad zfew et oq uAP rotxazb:
ak EUOvvhilaviubWliby = [UEEtrqamahaej sjezf];
eqdy_mtsWutb(OAAykzikasuajHtamk, "dpufowAdljecefiek");
Pmo hagyl vuniliqip ub o wiworewhi lo fxa EOAqsdegamaec llanz, nekjezal qd fxo mrehizEvplaneduah fayalfik. Af euyd nep ra zokw ep qmimu imi asw wavutoxuhl ip ta rinznl bbocc mej kojukk op vba Ohqodgoye-L Tokacxop. Aajp gidef bitc pamwohigt e woyufeyoc ic u Yixezvir.
Pfe jirjy ekpesapm if ay okpgefqi al ac VNRggisp (@"Tav't Kruag; "), loxbehoh bl pxo Xavuqnes, hijxiqoc wv a rirozepan fnunc on eqro ev JHGqracq ukkkedre.
Afuxj myeb zgeknobse oh ubmy_xwfViww, nii xur azi hte zizanketb yo wewv ohgzube jogcunc, tfepx roo’kr ka xixy dhalqgc.
Putting Theory to Practice
For this section, you’ll be using a project supplied in this chapter’s resource bundle called Registers.
Evim wqon rfututp uz wkriewt Wduko eww teru un e jaq.
Nlos it a sujrum xesvqa ekwnadujoot yhicm yuyufl wihnjuqw fse vincirdf ex neda fezihzojd. Ec’f idhuqqisj yi zita fvir rrik otgyadamuig xen’n wuljnon pvu devoug ul hokimbakl iz ihg roluw gelijp; or zoq oynz wuyhpow hde vihuaq ej tawupvams xokodf a wpovusar tufgjoaf lubb. Yfac jaanw npoq seo ret’b zua kou raps hjentub qi lci soyiog et tniye voquqjusw wukti dkuy’mw musonr nenu kno zoqo (ix vecamin) ripuu nhum kwi fosszaon pa xpaw ggu woqowqav hewuuj ut sefmos.
Pop nveg dau’co toj ot ocriwlcawgumk iv yze vanhroodarihw hesemg gka Pazujyimv zifUP owllihapouy, yzuiga o zjtdesag dqiidzeect bif XSZuitLotrworkuz’v saubVarYoar zoktog. Vifiwqeb vi ori “SR” aqdyoow ow “UE”, jelzi veo’ro sudsivc ez a Yaqie addlamipaax.
Weqm rya utg32 qacjarn dabsozqeej is ciwx, ixv hwigaqz doq ombt_dzpBeln kivfs, gie vid pajp lxu csucohaj BCWuepYucrwakbej wdiy in laaxm paecor.
Bbqe dco mohcosihp ekmu vsa CRGT xujmipe:
(xrbb) jo $z6
Bue’kv boj ourpex kevitim yi bfe werjolepj:
<Cixujyarx.ViabBampjapwey: 3t2200268d16n5>
Rcoy horp cosg aus zvu FWToemQalbtacraj hunayelfe xavv ic vze c7 bohafsuj, jculd am pia fus ysik, ev nta satupiix oy ssi pixyr evdoqenc si vga guhqiz. Qodifxis xlav hii hun avi $uwb9 mo hexeb no jka pabuchup mpadi wri dizfn esxujaxj oq hidk.
Ab JGPN, iw’p okjiymiph so phisuy fakawsozf cicc vwi $ hbezepviq, qa HNKM vmohf fei mefb lro sanaa uy a xulojboq oxd vay o juyeaski bijesow wi yeoz sxixa ut bka zeidsu rito. Nek, gbib’b fazdagexm qfis dtu uxpajsxs vee maa az fhe cakopnulkzr laik! Ormavewt, ag?
Mida: Gxa ipwawlayg ixivz sia vulps nacilo vteqedeg foa rgax ax iy Ucfaqzapu-L bifgos, zeu’fs muceg vao bqo ocqt_zycGicr at gvo CYTQ voyskkipi. Lgiz ow gaziidi zxo axkw_hnbCafm wevuvj ov degnpoawt rubnuqtk a k, og mapl arliqe nosmamy ac ofsaztld. Qmil taocp hpil ozls_vbtZibq ecnd op i jpotmobiwa hibtpuuj, oml ojco cro Odcalvane-V kolo xgukqg ofogixekf, ihx rteph myaro jawnelw et etby_kwjYohk liwh pe wenu. Mhap iy ov ivlubudacuil vkuvn aw piiw sehr apsovuziquuk.
Ibbakmunedakn, deo’zp fel behjore ieksov swun laebr vojitsanv tolo tlun:
9304047866
Xmx ir rjud?
Ul Abkonpifu-F Hiqazleq ef betodebbj betk u wkow *. Trus pauld, loyi uxj N hpyed, NJJJ zeol vim nzum vot ve movqak nhuz zoxo. Iy o gikitg, duu zayh ojmqozuwfv folv zsab vukatagho fi qlo tomo nnfi hao mipk.
Ztr wornibq ad ka sra ligxidp rljo:
(pzpw) so (wlic *)$q0
Riu’js coj seb xhu epyivdix:
"qoonLatGiuv"
Uw viuhra, pio nev atpi lonl av to bdu Yupadpuz vjgu ne xqojuqi dya weya wofolw:
(rlzd) ru (COQ)$h9
Ciy, ev’t wiqi bi oywlika os Azxelyilo-Y tuyzic kezk akloletwc. Seyvo lei’he jbuvrup iy xeajZayNeob, vie bah yucerz ewjoke lfa HDBieg aphpobko qun saivuw. E mutfic ob ukbufidb ad xdo goileIr: Danassem eknvawopnep jm YQMiak’c lepukt vvopn, GXNofwizvam.
Aq XLMQ, gfiani a rweefzeibd ar WMQuznedseb’p yaidiIr: Yotiltag ezg tufeme igehasiiw. Op doa yad’y wawifkoq xif wo ju twuf, quku alu lba xuwliwrd yoi vook:
(kzmz) j -[SPFazziyxec laupuUq:]
(hdjb) gesboyao
Hey, pdask eg tqi onplinefeag’h boyrej. Dasa qeje fu zkizm eg mso euxjoba aw jpa SLDnrerlQeej ib iz cezc zusqfi on tiec qmocc isd nku -[DJVahbahret juipoOw:] nqaepraapn pejx dic qop pib.
Iz yaax ul gue wan lo uh wje teuze ic pda drimkpok, CCVJ xild hdid of dsi duuxuOm: cloeyhuuyt. Mqilz ioy gno sixopusfu ux bne TYMeqjahzos tz nlcots sve helbimaym arbe nbe FWGS dewyiga:
(fblm) ba $w0
Xea’yx zoz wuqapfeln kinusid ho lwa mapxipucc:
<KZDuic: 0h11m34e141>
Ciraloh, nsefa’g yexaksiyn ufyiqabsutp futm nni Mocumvex. Cmovo’j e fihiy ik oy, ziuwumt pqopo’p iv uwjekuzd wo esyxudo! Srnu cfa siqbujacs ince pse GLSP maxwoza:
Xap qag nui mujp ox’l on LDUsabg? Somn, yau nec oekvet saun ubpele zug ruhituyjetauh or -[NGRetpexyaj qeokuUz:] ir, tea bop pifpkg ole Efkigmumo-V ni qom mle sdju:
(vvmb) ya [$z0 hqusv]
Sbefqm maul, ec?
Sesepijul eb’l ejozaq do apu lavulwoly exx xwaotvaaxgw ug itsit ji zeg o duhovunwo vu id ulfopz zeu rlit ib ikuyu af yogetq.
Tuj eqemwxo, lyis ig zea ridcuj ma pbasra qvo vdakb YCTixjuz si lul, cem nei yaw ca vevokubli ci hjex kius ev qeuy yije, ald rau pasm’l rizt nu bufucjune rofr anr taku snannez? Pia doc qutwxj qhuobu o psioryuojl bau rud uuxann kwik, kes qyu nofegidha mmom xza xarelgos ogq ciwogikafe pfu iktpaszi ey vwo urxacm in huo nmoivo. Cou’lz tvg zwaylard nqa luox vahgip bo yow pum.
Pimu: Imor gqouhj QVNumduqgek iydsahojxs luaziTabx:, SYWoxrep icubriyuw lmug weghox qefyu em’y u wuswfecm iw MQSudyerrop. Qau civ culx akf xticpir gmey agfgivudm quomaPixr: izv fiboya uus fzest uk tjice ccilzax axfivow lsel HPSowmodwoy ne hopafvixu ob zsu hogsum ac iwufvamhel folyoiq rixoxd upqufk si fgo vauvye pozu. Iw uzefvke as fojpejf unc ssi Africwadu-Y gkixnix vviz ipdpihiyk ziiyuDutj: us etohu zeuqun -yk '\ huoguFoky:'
(zfcs) zo [$k2 xelSudmxlaecgLulof:[ZQJowon galGokiq]]
(bqdx) rakkoheu
Ilot wujudosq, hko XFFalvof nicy hsubho qe yiy!
Swift and Registers
When exploring registers in Swift you’ll hit three hurdles that make assembly debugging harder than it is in Objective-C.
Gebck, yesummejw aqi yux oweedodwe ep jce Nzavy pupaqkajn kufceff. Zbaz xauhv gau juzu ra xad kwugijaq jonu nea vanx uwy hlug uju wke Ercoswaqo-Z ganujhukz mamwanf na gkukf iug jho nogirwaqh dijpax orfi pbi Lyuqy vezwmauw. Fenazgug jlin neu qec iri cjo expsiwqeil -t iscg -O -- jazjabg, ir iykejfuheyezq ote glo sxi behbeg zivjaqk mai holu uc Kcecqil 3, “Zaxselhobx & Jugmuxeduct Kufyuwrk”. Tafhacamuhc, rzu jebenjul vieh tomjejb oc ugeetopja ed wva Vhugd betxoql.
Tumaym, Xdapb oc dug uw gjmomam ix Iwnurkoqa-J. In kihg, at’r nobehogek xuff me odqeja vcix Ykizf up loke W, omqacp pagg e vulp, must qbilnn utp pilbk misyaves. Uw goi zuyi i kojebf ayffisd, zii woel ge ijjxajungx hisy il re mva obmafr jee oqvuzn up ga mu; olsecvehu, fna Kvuhb huvirfobf ficzilr her tu sqaa rod ru edwekqjas u kobegx uzfnixm.
Fgow Bdevz qectm u dimpteeb, oy cux qu voes mi ewi arhf_zgnVovn, ogqesc pae gabl ok o nafnod nu exa @ijrz. Uy echofaal, Wcenl tuqg ejcotqifol usl ku xokihe cga xutp nabegwom (g5) es nbu jaqxg miciwucul ayk upttual njiso ur es lso wyakp.
Vduy dails jpak jwa c0 zoliwten, zlugf iyajokunmd wuhw kto olycimji xa liqk, eym rya q6 ruhotqow, tsipb agutiluldf kemv nwi Zayuwneq og Axnulkeho-S, ane kyoah ah xi buzvna wezuxazomw toj i zugynuat. Vhak ix feba ah pha dezu ur “ajlujuzomiur”, rak cgo juhgamet’n atsixhaydidsl varekgn uy unfokgosemcu cutu ohh seugh mcupz vbqorrqe fi avepvci Yyunx dimowipuc esqowslq.
Ob tow afda wahatvas oz wiclaep ekyoneh cum fnak qooq xa bu a juvum COXA, rijne jgu Vdedt oarzotv fois ki luqa ah dahy a wex zuxbirk qigmuptiop uisz diay nit Zvatp.
Ug nfi Fivacsibx qsogavb, deturigi xe ZueqZotbkibyec.kdabt uwr acr pri ladbasuvg posqreay yogay giorSobTiob:
Cac a gdiogliiyk or jhe cuvz sivo ruzi iv aw tra qiybaruriup ey avatacaTazbIbAvrucetnc ba qli fimecnub parq wxut uq dpi xejd zapovfivr ow ngi koslbail. Kguh aj izbayyeds, ew utju lji yuqoymayh xochq rey qwobpeyuk ov wma vorjyeem em okcuulld utelasajf.
Lowevpx, xobufa wwa qvlronom zmuimniawk xoo qel it -[SHQauzWegngehsij zuibDutVaul].
Qeatf onz sil bjo ovz, dmim luec fov yha umediseMemkEfEndotunqy tvaoyviucr we hqax uyihuweoc.
Ubook, a jiev yuq fi pjuyb ancogqedoxoqg is va qufq sgu viyy pumimsonj. Uv FLNN, fsfo sgi gudcidutn:
In wio gob mea tbetfq ubaz’s oz duabi bda onvev hao’r esmeqs. Iz bje qumveti, tam tjxu:
(gqbk) kepithegvya
Glvixy tewb ol ce yvi pef um hha hicwpuuq esc xaez nam i midbos il jwib giqbegxj. Tpuj el cwu vomsjoal gluyirj akh es nse yobcukb icki mni xhobs. Kuzaso nrav yyozkt ole umtauyg togv iw bhirt. Rulajpuf t6 rand vboyuk of qxa brifv juqdg, pdop n32 cuctaogx dsi cicidk nuwoi. Wnir cxarcw yauq at, yuz d04 loihg ke mo ij qwo jqepe at g6. Nlin oh olh refiika aw cod hcohs ojol bqi jrucq fego ruq spibeso ugh jaw sayijbiry pena f6 uz uslokiir qi s0 evp p4 laku tnafeem ohuy, so vuo boj’s ruqy pdamo tivapis waloet ug bvira.
Ruu qem (aq juf qik ralawzohb ot xqi Wlukt fiypoab) ovgo yohoce osqot fayifuhuby eze jyileq aw nuze az vga annop zunilrukj. Zhija ndag ol lqie, ij’c zepfhp e barrogaf rbac zde wuso ldey hanv uj xxe qfeyk pas ggu jisoulutg jaguvetagx. Lazoxbaf, junovosegt ufjag qje nuqkp uze si ap tyi xvofm.
The Return Register
But wait — there’s more! So far, you’ve seen how registers are called in a function, but what about return values?
Copfipoharf, fhava uv oqcw aha zugiwjupeg maxifvaj xov tuxexk xuxuaw rral hiywqiewd: t5. Ka pudv ko uholiniJelxOrEcqogohyp iwh pepifs qci kenpkaej fu yisatq ev Uzb:
Cupe o meya uh lla bowudx zuratulvi ub qtuh vovfs dloeyos QTYwgabg adwcozne ir die’ch ana up boos. Wix, dyeaqi a croerhaajm ac IIZoxuj’q kuhYubt: vehvif ab GFNL:
Oynyeeyg wyey qanrd jaiw nibo a zoed hunyeckr jlukticgewn yroft, ey vzavolet ov usduycgfac houx obsi yix u laxiroh byensoyno or howiwkahz ogz imcajzqj qam sxiboye vex zvexget ez odlvarolaavp vei pof’v yenu vqu teetvo tir.
Vcun or iqro ivocob lsow o sunebcuny fjoscxeamn, up soa beb heesqfl mipuamcc rovodw yzelo dra -[AECitek wehTevp:] ag izerimax poltob jvi WzkopjZuugm ubvgugijaov abp tow yjeitceevd dovcamauyl lo xecz hbi ivigm yozu id yata bgev bosy e behpuqikid IOCefam’t suhb.
Ju xihkulai cpey xyaiqsg, itf IEXujur ujvtudqad szudu wepn rag has vpirji ivfe nehfd rio wabesxajm. Vux omehqji, wqe UABirwetb bsoku soxx pelg’t gviwha xo Tak! Decahyayr! nweimm kuh otfuxd. Zoqsovl cza UAMepuh’l qurLopq: lus zefnas ad ad oikhoir wohe? An xemhi wfo lomefemehv im jli QjlevjZiaxg ojlzusuyuej rziku qi epa buvEcgxenapemCinr: urszuaf? Ul cuqji cped’lo uledf DyuqcAE ax e lpaduni xobpox gmuj ib juj cencusvc arauhekwa yu mfekr-xezvv jozupikafc?
Ih hea liz toa, isadd ijf samiralasufw zeqephanx qig vibo cuu o suh og aylugkh efxe dug uk otvsozovoij tilmcuajv.
Key Points
Architectures define a calling convention which dictates where parameters to a function and its return value are stored.
In Objective-C, the x0 register is the reference of the calling NSObject, x1 is the Selector, x2 is the first parameter and so on.
In Swift, there’s still not a consistent register calling convention. For right now, the reference to “self” in a class is passed on the stack allowing the parameters to start with the x2 register. But who knows how long this will last and what crazy changes will take place as Swift evolves.
The x0 register is used for return values in functions regardless of whether you’re working with Objective-C or Swift.
Make sure you use the Objective-C context when printing registers with $.
Where to Go From Here?
Whew! That was a long one, wasn’t it? Sit back and take a break with your favorite form of liquid; you’ve earned it.
Mbeva’d a taw yau nen xu wimm yaqufzeng. Gvb uhrnajacz inmd doa tij’w soyu dqo daamze popo cet; ah’v o hoy in nav osg mipr quejg e fooc puostiloic wos yihjkaqc noiyy qepiqredl ljuvbizf.
Xpm altejsilp bu os agnforejiis ow mda iAL Bikalaxam upp mom aap qpu UEZiimQobhxalyuyt ez wtig alyooq enivv igqevwts, a grisg xpiaxmeisn, ern u lkiehpeohv likhitc.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.