; TeX output 2003.11.26:1324_2 ~?ՁZݺIqqecss2074AssemblyfHOwmWTO cG 1 ecrm1000F*ranois-RenU RideauqL ectt1000rideau@ens.fr}v0.4l,16NovembreU 1997&6 ecss1000QuestoilLinuxAssemblyHOWTO.QuestodoGcumentodescrivecomeprogrammareinassemblyutilizzandostru-mentidiprogrammazione8 ecsi1000LIBERIV;,concentrandosisullosviluppGoperosulsistemaoperativoLinuxsupiattaformei386.bIlmaterialeinclusopGotrebbeessereomenoapplicabileadaltrepiattaformehardwaree/osoftware.bCon-tributiODUZIONEdz#3ؼ1.1%LegalU Blurp.荍.............................................w31.2%NOT*AU IMPORTANTE6Ӎ.荍.......................................w31.3%PrimaU dicominciare3.荍........................................w3%1.3.1EComeU usarequestodoGcumentoG5.荍..............................w3%1.3.2EDoGcumentiU correlati7M.荍....................................w41.4%Storiaޛ.荍................................................w41.5%RingraziamentiX.荍...........................................w62AVETEBISOGNODELL'ASSEMBL Y?O?72.1%ProU econtro3.荍.............................................w7%2.1.1EIU vqantaggidell'assembly.荍..................................w7%2.1.2EGliU svqantaggidell'assemblytۍ.荍................................w7%2.1.3EV*alutazioni1.荍.........................................w82.2%ComeU NONusarel'assembly)s.荍....................................w9%2.2.1EProGceduraU generaleperottenerecodiceecientea.荍....................w9%2.2.2ELinguaggiU concompilatoriottimizzantiA.荍..........................w9%2.2.3EProGceduraU generaleperaccelerareilvostrocodice Y.荍....................w9%2.2.4EIspGezioneU delcodicegeneratodalcompilatoreэ.荍......................x?103ASSEMBLA TORI^103.1%AssemblyU inlinediGCCȩ.荍......................................x?10%3.1.1EDoveU trovqareGCC3.荍.....................................x?10%3.1.2EDoveU trovqaredoGcumentazionepGerl'assemblatoreinlinediGCC.荍............x?11%3.1.3EInvoGcareU GCCperfarglitrattarecorrettamentel'assemblyinline:׍.荍...........x?113.2%GASSэ.荍.................................................x?12%3.2.1EDoveU trovqarlo(%.荍........................................x?12*_2 ~?GINDICE]!2ՁV%3.2.2ECos'U lasintassiA*T&TM!.荍..................................x?12ؼ%3.2.3EMoGdoU a16bitlimitato".荍...................................x?133.3%GASPL퍍.荍................................................x?14%3.3.1EDoveU trovqareGASP+.荍....................................x?14%3.3.2EComeU funziona.荍.......................................x?143.4%NASMI.荍................................................x?14%3.4.1EDoveU trovqareNASM.荍....................................x?14%3.4.2ECosaU faXፍ.荍...........................................x?143.5%AS86,׍.荍.................................................x?14%3.5.1EDoveU proGcurarsiAS86L.荍...................................x?15%3.5.2EComeU invoGcarel'assemblatore?.荍..............................x?15%3.5.3EDoveU trovqaredoGcumentazione*.荍...............................x?15%3.5.4EEU senonriescopiacompilareLinuxconquestanuovqaversione?.荍...........x?163.6%AL*TRIU ASSEMBLATORI.荍.....................................x?16%3.6.1EL'assemblatoreU Win32F*orthx.荍................................x?16%3.6.2ET*erse5%.荍.............................................x?16%3.6.3EAssemblatoriU nonlibGerie/onona32bit.^).荍........................x?164MET APR>OGRAMMAZIONEEMACRO3174.1%CosaU integratoneipacchettimenzionati.荍............................x?17%4.1.1EGCC .荍.............................................x?17%4.1.2EGASqs.荍.............................................x?17%4.1.3EGASPj.荍............................................x?18%4.1.4ENASMg!.荍............................................x?18%4.1.5EAS86Jy.荍.............................................x?18%4.1.6EAL*TRIU ASSEMBLATORIQ.荍.................................x?184.2%FiltriU esterni_ˍ.荍.............................................x?18%4.2.1ECPP9.荍.............................................x?18%4.2.2EM4f.荍..............................................x?18%4.2.3EMacroU conivostriltriE.荍..................................x?19%4.2.4EMetaprogrammazione[!.荍...................................x?195CONVENZIONIDICHIAMA TAY205.1%Linuxދ.荍................................................x?20%5.1.1ELinkingU aGCCǍ.荍.......................................x?20%5.1.2EELFU eda.out:qproblemi.Y.荍.................................x?20%5.1.3ELinux:qchiamateU disistemadirettey.荍............................x?21%5.1.4EI/OU sottoLinuxe.荍.......................................x?21(C_2 ~?G1.8INTR>ODUZIONEbV3ՁV%5.1.5EAccedereU adrivera16bitdaLinux/i386^Q.荍.........................x?21ؼ5.2%DOSB .荍.................................................x?225.3%WinzozzU ecompagniabGellawG.荍....................................x?225.4%UnU sistemaopGerativotuttovostro.#'.荍................................x?226COSED>AFAREERIFERIMENTI923(1INTRcODUZIONE荍!N ecbx12001.1LegalBlurpMCopyrightwcP !", cmsy10 `1996,1997PbyF*ranois-RenRideau.ThisdoGcumentmaybGedistributedunderthetermsset forthU intheLDPlicenseat@http://sunsite.unc.edu/LDP/COPYRIGHT.html.#Í1.2NOTAIMPORTANTEC'U daaspGettarsichequestosial'ultimorilasciodiquestodocumentodapartemia.ؼC'Iuncandidatoalruolodicuratore,.manchl'HOWTOnondiventaucialmentesuo,.accetter򎦍suggerimentiU ecritiche.Siete(inparticolareinvitatiapGorredomande,arisponderealledomande,acorreggerelerispostedate,ad aggiungerenuove rispGostealleFAQ,afornireriferimentiadaltrosoftware,6adindicareerroriolacunenellepaginealrespGonsabileattuale.Sequalcunodivoimotivqato,potrebbepernoHЃ ecti1000DIVENT;ARECILRESPONSABILEDELLEF_AQ.U Inunaparola,contribuite!PerU contribuire,pGerfavorecontattatechiunquesembricurarel'Assembly-HOWTO.Icuratoriattualisono:F;r}/anois-RenRideauU mailto:rideau@clipper.ens.fredU oraPaulAndersonU mailto:paul@geeky1.ebtech.net.#Í1.3PrimadicominciareMQuestodoGcumentointenderispGonderealledomandepifrequentidellepGersonecheprogrammanoovoglionoprogrammareinassemblya32bitpGerx86utilizzandoassemblatorilib}/eriɹ,spGecialmentesottoilsistemaopGerativoLinux.E8PotrebbeinoltrerimandareadaltridocumenticircaassemblatorinonlibGeri,Wnonperx86oU nona32bit,anchesequestononilsuoscopGoprincipale.PoichSl'interesseprincipaledellaprogrammazioneinassemblyconsistenelrealizzarelevisceredeisiste-mi@opGerativi,{degliinterpreti,deicompilatoriedeigioGchi,laddove@uncompilatoreC@nonriesceafornirel'espressivitrichiesta(abbastanzararochesitrattidiunaquestionediprestazioni), ciinteresseremoprincipalmenteU diquestotipGodisoftware. 1.3.1#!\ComeusarequestodoQcumen>toMQuesto?doGcumentocontienerispGosteadalcunedomandepostedifrequente.1iInmolteoccasioni,zlvengonoforniti·URL›dialcuniarchividisoftwareodoGcumentazione.FPerfavore,notatechegliarchividimaggioreutilitThannodeimirrorecheaccedendoadunmirrorpivicinodaunlatoevitateadInternettracononc_2 ~?G1.8INTR>ODUZIONEbV4ՁVnecessario4edall'altrorisparmiatetempGoprezioso.QInparticolare,ccisonodeigrandidepositisparsipertutto ilU mondochefannoilmirroranchedialtriarchividipubblicointeresse.ؼDovresteU imparareadannotarviqualisonoquestipGostivicinoavoi(dalpuntodivistadellarete).T*alvolta,nla+listadeimirrorsitrovqainunleoinunmessaggiodilogin.Sietepregatidiseguireiconsigli.Altrimenti,U dovresteinterrogarearchiecircailsoftwaredicuisieteallaricerca...LaU versionepirecentediquestidoGcumentirisiedeadhttp://www.eleves.ens.fr:8080/home/rideau/Assembly-HOWTOoppurehttp://www.eleves.ens.fr:8080/home/rideau/Assembly-HOWTO.sgmlmaanchecichesitrovqanegliarchividegliHOWTOdiLinuxdovr}/ebbeessereabbastanzaaggiornato(iononU homoGdodisaperlo):ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/U (?)UnaU traduzioneinfrancesediquestoHOWTOpuesseretrovqatadallepartidi:ftp://ftp.ibp.fr/pub/linux/french/HOWTO/ 1.3.2#!\DoQcumen>ticorrelati#SenonsapGetecos'ilsoftwarelib}/ero,sietepregatidileggereattentamenteXlaLicenzaPubblicaGeneraleGNU,Y#chevieneusataintantissimosoftwarelibGeroedunmodelloperlamaggiorpartedellelicenzepGerquestotipodiprogrammi.SitrovqadisolitoinunlechiamatoCOPYING,conunaversionepGerlelibrerieinunlechiamatoCOPYING.LIB.AnchequalchepubblicazionedellaFSFu(freesoftwarefoundation)U pGotrebbeesservid'aiuto.InIparticolare,tilsoftwareIlibGeropiinteressanteIdisponibileconsorgentichepGossonoessereconsultatieQcorretti.gOT*alvoltapGersinopossibileprendereinprestitodelcodice.gOLeggeteconcuralelicenzespGecicheU edagiteinconformitadesse.C'0unaFAQpGercomp.lang.asm.x86cherispGondeadomandegenerichecircalaprogrammazioneinassembly sux86eadomandecircaalcuniassemblatoricommercialiinambienteDOS a16bit.XSAlcuneriguardanolaprogrammazionelibGerainasma32bit,cospotresteessereinteressatialeggerequesteFAQ...http://www2.dgsys.com/~raymoon/faq/asmfaq.zipEsistonowFAQwgedoGcumentazioneriguardantilaprogrammazionesullavostrapiattaformapreferi-ta,qualunquewWessasia,chedovresteconsultarepGerquestionispecicheallapiattaformastessanondirettamenteU correlateallaprogrammazioneinassembler.#Í1.4StoriaMOgniversionecontienealcunecorrezionierettichedipGococontochenonnecessariomenzionareognivolta.ؼV ersione0.123apr1996F*rancois-ReneFarRideau b> cmmi10creaepubblicailprimomini-HOWTO,pGerchNonneU pGossopidirisponderesempreallestessedomandesucomp.lang.asm.x86V ersione0.24mag1996*v8_2 ~?G1.8INTR>ODUZIONEbV5ՁVV ersione0.3c15giu1996*V ersione0.3f17ott1996T*rovqataU l'opzione-fasmpGerabilitarel'assemblatoreinlinediGCCsenzaleottimizzazioni-OV ersione0.3g2no>v1996CreatalastoriadeldoGcumento.Aggiuntiiriferimentinellasezionesullacompilazioneincrociata. AggiuntaU lasezionecircalaprogrammazionedell'I/OsottoLinux(videoinparticolare).V ersione0.3h6no>v1996maggioriU informazionisullacompilazioneincroGciata.qV*ederedevel/msdossusunsite.V ersione0.3i16no>v1996NASMU stadiventandoU moltoadabile.V ersione0.3j24no>v1996RiferimentoU allatraduzioneinfrancese.V ersione0.3k19dic1996Cosa?qMiU erodimenticatodifareriferimentoaT*erse???V ersione0.3l11gen1997*V ersione0.4pre113gen1997Ilmini-HOWTOfinformatotestovienetrasformatoinuncompletoHOWTOflinuxdoGc-sgml,pervedere comeU sonogliSGMLtoGols.V ersione0.420gen1997PrimoU rilasciodell'HOWTOcometale.V ersione0.4a20gen1997AggiuntaU lasezioneringraziamenti*.V ersione0.4b3feb1997SpGostatoU NASM:oraprimadiAS86V ersione0.4c9feb1997AggiuntaU lasezioneavetebisognodell'assembly?V ersione0.4d28feb1997AnnuncioU prematurodiunnuovorespGonsabiledell'Assembly-HOWTO.V ersione0.4e13mar1997RilascioU pGerDrLinuxV ersione0.4f20mar1997*V ersione0.4g30mar1997*_2 ~?G1.8INTR>ODUZIONEbV6ՁVV ersione0.4h19giu1997ancoraU aggiunteacomeNONusarel'assembly;aggiornamentisuNASM,GAS.V ersione0.4i17luglio1997informazioniU sull'accessoalmoGdoa16bitdaLinux.V ersione0.4j7settem>bre1997*V ersione0.4k19ottobre1997*V ersione0.4l16no>vembre1997rilascioU pGerLSL,sestaedizione.QuestoU ancoraunaltroultimo-rilascio-di-F*ar-prima-che-un-altro-curatore-gli-subGentriU (?)#Í1.5RingraziamentiMV*orreiU ringraziareleseguentipGersone,inordinediapparizione:ؼLinusT;orvaldsU mailto:sepolto.vivo@nella.postapGerU LinuxBruc}/eEvansU mailto:bde@zeta.org.aupGerU bccdacuiestrattoas86SimonT;athamU mailto:anakin@poboxes.comeJulianHallU mailto:jules@earthcorp.compGerU NASMJimNeilU mailto:jim-neil@digital.netpGerU T*erseTimBynumU mailto:linux-howto@sunsite.unc.edupGerchU mantienegliHOWTOR}/aymondMoonU mailto:raymoon@moonware.dgsys.compGerU lesueFAQEricDumasU mailto:dumas@excalibur.ibp.frpGer'lasuatraduzioneinfrancesedelmini-HOWTO(unacosatristeperl'autoreoriginaleessere franceseU escrivereininglese)PaulAndersonU mailto:paul@geeky1.ebtech.neteU R}/ahimAzizarabmailto:rahim@megsinet.netpGerU l'aiuto,senonperaverU rilevqatol'HOWTO.T*utteU lepGersonechehannodatoillorocontributoconidee,commentiesuppGortomorale. _2 ~?G2.8AVETEBISOGNODELL'ASSEMBL Y?+ӹ7ՁV2A=VETEG\BISOGNODELL'ASSEMBL(Y?:Beh,knon4vorreiinterferireconcichestatefacendo,kmaeccoalcuniconsigliderivqantidaunaespGerienza ottenutaU faticosamente.#2.1ProecontroM2.1.1#!\Iv\|an>taggidell'assemblyL'assemblyU puesprimerecosemoltoabassolivello:pGoteteU accederearegistrieadI/Odipendentidallamacchina. pGoteteҷcontrollarel'esattocomportamentodicodiceinsezionicritichechepGotrebbeҷcomportareilbloGccarsiU dihardwareoI/O.pGotete3ttrasgredireleconvenzioni3tdelvostrocompilatoreabituale,k ilchepGotrebbe3tpermetterealcuneottimizzazioni(comeadesempioviolaretempGoraneamenteleregoleperilgarbagecollecting,threading,ecc).ottenereiaccessoamoGdidiprogrammazioneinsolitidelvostroprocessore(adesempiocodicea16bitpGerU l'avviool'interfacciaBIOSsuiPCIntel).pGotete!costruireinterfaccetraframmentidicoGdicecheusanoconvenzioniincompatibili(adesempioproGdottiU dacompilatoridiversioseparatidaunainterfacciaabassolivello).pGoteteiprodurrecodiceragionevolmenteveloGceperciclistrettiperfarfronteaduncompilatorenon-ottimizzanteU diqualitscadente(madopGotuttosonodisponibilicompilatoriottimizzantiliberi!).pGotete|produrrecodiceottimizzatoamanocherisultaottimoperlavostraparticolarecongurazionehardware,U manonpGerquelladichiunquealtro.pGoteteLscriveredelcodiceperilcompilatoreottimizzantedelvostronuovolinguaggio(qualcosachepGocheU personefanno,edanchelorononlofannomoltospesso). 䍍2.1.2#!\Glisv\|an>taggidell'assemblyML'assembly{Ȁunlinguaggiomoltoabassolivello(piinbassoc'sololacoGdicaamanodelleistruzioniincoGdiceU binario).ؼCiU signica:All'inizioU lungoetediosodascrivere.țU notevolmentesoggettoaderrori.GliU errorisarannomoltodicilidascovqare.ȖU moltodiciledacomprendereemoGdicare,inaltreparoledamantenere.IlU risultatodecisamentenonpGortabileversoaltrearchitetture,esistentiofuture.Il%vostrocoGdiceverrottimizzatosolopGerunacertaimplementazionediunastessaarchitettura:adesempio,-tra^lepiattaformecompatibiliIntel,avere^CPUQdiverseodierenticongurazioni(ampiezzadelcbus,KveloGcitedimensionirelativediCPU/cache/RAM/bus/dischi,KpresenzadiFPU,estensioniMMX,ecc.)-purichiederetecnichediottimizzazioneradicalmentediverse.-ItipidiCPUcomprendonoߠ_2 ~?G2.8AVETEBISOGNODELL'ASSEMBL Y?+ӹ8ՁVgiwIntel386, 486,Pentium,PPro,PentiumwIGI;Cyrix5x86, 6x86;AMD\K5,K6.Inoltre,continuano adU apparirenuoviU tipi,pGercinonaspettatevichequestoelencooilvostrocoGdicesianoaggiornati.'Il&$vostrocoGdicepotrebbeinoltrenonessereportabileversopiattaformeconsistemioperatividierentima{conlastessaarchitetturapGerlamancanzadistrumentiadeguati(bGeh,GAS{hparefunzionaresututtelepiattaforme;vaquantosembra,TNASMfunzionaopuessereresofunzionantesututtelepiattaformeIntel).Perdeteu9pitempGosupochidettaglienonpoteteconcentrarvisullaprogettazionealgoritmicasupiccolaeݬgrandescalache,comenoto,pGortailmaggiorcontributoallaveloGcitdelprogramma.IPeresempio,pGotresete&perderedeltempoperscrivereinassemblydelleprimitivemoltoveloGciperlamanipolazionedi'listeomatrici,\8quandosarebbGebastatoutilizzareunatabellahashperacceleraremoltodipiilvostroܓprogramma.IQMagari,inunaltrocontesto,sarebbGeservitounalberobinario,oqualchestrutturaadU altolivellodistribuitasuunclusterdiCPU.Undpiccolocambiamentodnell'impGostazionealgoritmicapotrebbefarperdereognivqaliditatuttoilcoGdiceassemblygiesistente.~UPerciosieteprontia(edingradodi)riscriverlotutto,/oppuresietevincolatiU adunaparticolareimpGostazionealgoritmica.Per"quantoriguardailcoGdicechenonsiscostatroppGodaquellochepresenteneibGenchmarkcon-venzionali,QiPcompilatoriottimizzanticommercialipGermettonodiottenereprestazionimiglioririspettoall'assemblymanuale(bGeh,Jcimenoverosullearchitetturex86rispGettoallearchitettureRISCeforseCmenoveropGercompilatorilargamentedispGonibili/liberi;I`comunque,GperCcodiceCC|tipico,GGCCselaU cavqadiscretamente).Ein@ognicaso,IcomediceilmoGderatoreJohnLevinesucomp.compilers,icompilatorirendonode-cisamentezpifacileutilizzarestrutturedaticomplesse,nonsistancanoametstradaecisipu򎡍aspGettarechegenerinocodiceabbastanzabuono*.euInoltreprovvederannoapropagarec}/orrettamentetrasformazioni dicoGdiceattraverso tuttoil(lunghissimo)programmaquandositratterdiottimizzarecoGdiceU traiconnidelleprocedureedeimoduli. ,2.1.3#!\V alutazioniMT*uttoVwsommato,VpGotrestenotarechenonostantel'usodell'assemblysiatalvoltanecessario(osemplicementeutile,U inalcunicasi),sarilcasoche:˫minimizziateU l'usodelcoGdiceassembly;incapsuliateU questocoGdiceininterfaccebendenite;facciateXgenerareautomaticamenteilvostrocoGdiceassemblydastruttureespresseinunlinguaggioapiU altolivellorispGettoall'assemblystesso(adesempiolemacrodell'assemblyinlinediGCC);facciateU tradurreinassemblyquestiprogrammidastrumentiautomatici;facciateU ottimizzarequestocoGdice,sepossibile;tuttiipuntidicuisopra,cioGscriviate(un'estensionead)unbackendpGeruncompilatoreottimizzante.˫Anche(&neicasiincuil'assemblynecessario(adesempio,1%nellosviluppGodisistemioperativi),1%scopriretechenonU neservepGoimoltoecheiprincipiprecedenticontinuanoavqalere.ؼA>Jquesto>riguardo,vGdateun'oGcchiataaisorgentidelkerneldiLinux:8pGoco>assembly*,vGgiustolostrettonecessario,ilZchehacomerisultatounsistemaopGerativoveloGce,hadabile,portabileZemantenibile.-AncheZungiocodisuccessoMcomeDOOMMistatoscrittoquasicompletamenteinC,consolounaminuscolapartescrittainassemblyU pGerrenderlopiveloGce. _2 ~?G2.8AVETEBISOGNODELL'ASSEMBL Y?+ӹ9ՁV2.2ComeNONusarel'assemblyM2.2.1#!\ProQcedurageneraleperottenerecodiceecien>teComediceCharlesFitermansucomp.compilerscircailconfrontotracoGdiceassemblygeneratoamanoo automaticamente,ؼL'uomoU dovrebbGesemprevincere,edecconeimotivi:ؼPrimoU passo:ql'uomoscriveiltuttoinunlinguaggioadaltolivello.SecondoU passo:qprovvedeadunprolingpGertrovqareipuntiincuisipGerdepitempo.T*erzoU passo:qfaproGdurrealcompilatorecodiceassemblyperquellepiccolesezionidicodice.QuartoFpasso:lepGerfezionaamanocercandopiccolimiglioramentirispettoalcodicegeneratodallamacchina.ؼL'uomoU vincepGerchsausarelamacchina. 2.2.2#!\Linguaggiconcompilatoriottimizzan>tiMIlinguaggiqualiOb0jectiveCAML,SML,CommonLISP*,Scheme,ADA,Pascal,C,C++,traglialtri,dispGon-gonodicompilatoriottimizzantilibGericheottimizzerannoilgrossodeivostriprogrammi(espGessootterrannorisultatiDmiglioririspGettoall'assemblymanualeanchepGerciclistretti),zpermettendovinelfrattempodiconcen-trarviasudettaglipiadaltolivello,iltuttosenzavietarvidiottenerequalchepuntopGercentualediprestazioniin')pinellamanieraespressasopra,0Zunavoltacheilvostroprogettoavrraggiuntoun'impGostazionestabile.ؼCerto,U cisonoanchecompilatoriottimizzanticommercialipGerlamaggiorpartediqueilinguaggi!AlcunidlinguaggihannocompilatoricheproGduconocodiceC,chepuessereulteriormenteottimizzatodauncompilatoreC.LISP*,Scheme,۬Perlemoltialtrifannopartediquestacategoria.jLaveloGcitabbastanzabuona. 2.2.3#!\ProQcedurageneraleperaccelerareilv>ostrocodiceMPerquantoriguardal'accelerazionedelvostrocoGdice,YdovresterestringerlaallepartidiunprogrammacheunoU strumentodiprolinghadecisamenteidenticatocomeuncollodibGottiglia.Perci,U seidenticatequalchepGorzionedicodicecometroppolenta,dovreste:ؼprimaU dituttoprovqareadusareunalgoritmomigliore;pGoiU provqareacompilarlainvecediinterpretarla;pGoiU provqareadabilitareeranarel'ottimizzazioneperilvostrocompilatore;pGoiBdarealcompilatoredeiconsiglisucomeottimizzare(informazionesuitipiinLISP;usodiregisterconU GCC;unmucchioU diopzioninellamaggiorpartedeicompilatori,ecc.);inne,U seilcaso,ripiegatesullaprogrammazioneassembly*.ؼCome{ultimacosa,Rprimacheviriduciateascrivereassembly*,RdovresteispGezionareilcodicegenerato,RpercontrollareU8cheilproblemarisiedaproprionellacattivqagenerazionedelcoGdice,=vistochepGotrebbeanchenonUesserecos:ilcoGdicegeneratodalcompilatorepotrebbeesseremigliorediquantoavrestepGotutofarevoi,:spGecialmente sullemodernearchitetturemulti-pipGelined!LepartilentediunprogrammapGotrebbero ;_2 ~?G3.8ASSEMBLA TORI]~!10ՁVessereintrinsecamentetali.?pIpigrossiproblemisullearchitetturemoGderneconprocessorivelocisonodovuti aritardidiaccessoallamemoria,ncache-miss,TLBmiss,epagefault;7l'ottimizzazionesuiregistridiventainutile,.ned$otterreterisultatimiglioririprogettandolestrutturedatiedilthreadingpGerottenereunamigliorloGcalit`nell'accessoallamemoria.SAPotrebbeforseessered'aiutounapprocciocompletamentediversoalproblema. 2.2.4#!\IspQezionedelcodicegeneratodalcompilatoreMCisonomolteragionipGerispezionareilcodiceassemblygeneratodalcompilatore.VYEccocosapotetefarecontaleU coGdice:ؼcontrollateseilcoGdicegeneratopuesseremiglioratoinmanieraovviaconassemblymanuale(oconleU oppGortuneopzioniperilcompilatore).QuandoU ilcaso,partitedacoGdicegeneratoemodicatelo,inveceU diripartiredazero.Pineingenerale,tutilizzateilcoGdicegeneratocomestubdamodicare.NInquestomodo,talmeno,viene gestitoU correttamenteilmoGdoincuilevostreroutineassemblysiinterfaccianocolmondoesterno.RintracciareU deibugnelvostrocompilatore(raramente,sispGera).IlmoGdocanonicoperfargenerarecodiceassemblyinvoGcareconilag-Silvostrocompilatore.-Cifunziona conlamaggiorpartedeicompilatoriUNIX,compresoilcompilatoreCdiGNU(GCC),manelvostrocasolecosepGotrebberoandarediversamente.OtNelcasodiGCC,conl'opzione-fverbose-asmverrproGdottocodiceassemblyDrpicomprensibile.kCerto,GsevoleteottenerebuoncoGdiceassembly*,GnondimenticatedidareisoliticonsigliU elesoliteopzionipGerl'ottimizzazione!(3ASSEMBLA(TORI荍3.1AssemblyinlinediGCCMIl notocompilatoreGNU C/C++(GCC),uncompilatoreottimizzantea32-bitallabasedelprogettoGNU,suppGortal'architetturax86abbastanzabene,eforniscelapossibilitdiinserirecodiceassemblyneiprogram-miC,inmoGdotalechel'allocazionedeiregistripuessereospecicataolasciataaGCC.GCCfunzionasullamaggiorpartedellepiattaformedispGonibili,(tralequalisonodegnedinotaLinux,*BSD,VST*a,OS/2,*DOS,U Win*,ecc. 3.1.1#!\Do>vetrov\|areGCCIlU sitooriginalediGCCilsitoFTPdiGNUؼftp://prep.ai.mit.edu/pub/gnu/inU cuisitrovqaanchetuttoilsoftwareapplicativodelprogettoGNUchestatorilasciato.V*ersioniU congurateeprecompilatepGerLinuxpossonoesseretrovqateinftp://sunsite.unc.edu/pub/Linux/GCC/v%.ԐEsistonounsaccodimirrorFTPvdientrambiv%isitiintuttele partiU delmondo,coscomecopiesuCD-ROM.Recentemente,U losviluppGodiGCCsibiforcato.qMaggiorinotiziesullaversionesperimentale,egcs,pressohttp://www.cygnus.com/egcs/U . _2 ~?G3.8ASSEMBLA TORI]~!11ՁVDovrestetrovqaredeisorgentiadattatipGerilvostrosistemaopGerativopreferitoedeibinariprecompilatiai solitiU sitiFTP*.ؼLaversionepicomunepGerDOSsichiamaDJGPPepuesseretrovqatanelledirectoryconquestonomeneisitiU FTP*.Vedere:http://www.delorie.com/djgpp/C'ancheunaversionediGCCpGerOS/2chiamataEMX,chefunzionaanchesottoDOSedincludemolteroutineU dilibreriapGerl'emulazionediUNIX.Dateun'occhiatadallepartidi:http://www.leo.org/pub/comp/os/os2/gnu/emx+gcc/http://warp.eecs.berkeley.edu/os2/software/shareware/emx.htmlftp://ftp-os2.cdrom.com/pub/os2/emx09c/ 3.1.2#!\Do>vetrov\|aredoQcumentazionepQerl'assemblatoreinlinediGCCMLaUwdoGcumentazionediGCCincludeledidocumentazioneinformatotexinfo.rPotetecompilarliconT*eXepGoistampareilrisultato,!oppureconvertirliin.infoesfogliarliconemacs,oppureancoraconvertirliin.htmloU (conglistrumentiappropriati)intuttocichevolete,oppuresemplicementeleggerlicoscomesono.DiU solitoile.infositrovqanoinognibuonainstallazionediGCC.LaU sezionecorrettadacercare:qC?Extensions::ExtendedAsm::LasezioneInvoking?GCC::SubmodelOptions::i386Options::MpGotrebbeanch'essarivelarsiutile. '3Inparticolare,e daivincolisuinomideiregistrispGeciciperl'i386:abcdSDBacorrispondonorispettivqamentea:%eax,U %ebx,%ecx,%edx,%esi,%edi,%ebp(nessunaletterapGer%esp).LaU DJGPPGamesresource(nonsolopGerhackerU deigiochi)haquestapaginaappostaperl'assembly:http://www.rt66.com/~brennan/djgpp/djgpp_asm.htmlInne,ɭc'+unapaginawebchiamataDJGPP~QuickASM~ProgrammingGuidechetrattaURL,FAQ,sintassiU asmA*T&TpGerx86,alcuneinformazionisull'asminlineelaconversionedeile.ob0j/.lib:http://remus.rutgers.edu/~avly/djasm.htmlGCCgdipGendegdaGASpGerl'assemblingeseguelasuasintassi(vedereinseguito);Lseusatel'asminline,badate(bGene:[Dnecessariocheicaratteripercentosianoprotettidall'espansioneperpoteresserepassatiaGAS.U V*ederelasezionesuGASinseguito.Potete trovqareunДsac}/co"diesempiutilinellasottoGdirectorylinux/include/asm-i386/deisorgentidelkerneldiU Linux. 3.1.3#!\In>voQcareGCCperfarglitrattarecorrettamen>tel'assemblyinlineMAssicurateviXTdiinvoGcareXTGCCXconilag-O(oppure-O2,-O3,ecc.)=pGerXTabilitareleottimizzazioniel'assemblyinline.vetrov\|arloLoU trovqatenellostessopGostodoveavetetrovqatoGCC,inunpacchettodenominatobinutils.3.2.2#!\Cos'lasin>tassiA T&TPoichGASstatoconcepitopGersupportareuncompilatoreUNIXa32bit,essoutilizzalanotazione standardA*T&T,cheassomigliamoltoallasintassidegliassemblatoristandardpGerm68kedstandardnelmondo-UNIX.QuestasintassinonnpGeggiorenmiglioredellasintassiIntel*.d)ȑ-semplicementediversa.UnaU voltachecisiabituati,lasitrovqamoltopiregolaredellasintassiIntel,ancheseunpGo'noiosa.ؼEccoU lecoseacuiprestaremaggioreattenzionequandosihaachefareconlasintassidiGAS:ؼInomideiregistrihanno%comepresso, acosicchiregistrisono%eax,%dlecosviainvecedisoloeax,2dl,ecc.bCi)_faschesiapGossibileincluderesimbGoliC)Testernidirettamentenelsorgenteassembly*,senzaU alcunrischiodiconfusioneesenzaalcunbisognodiorribiliunderscoreantepGosti.L'ordinedegliopGerandilasorgente(osorgenti)pGerprimaeladestinazioneperultima,nchel'oppostodella;convenzioneInteldiavereprimaladestinazioneelesorgentipGerultime.Quindi,cichenellasintassi8intel蘺mov?ax,dx(caricailcontenutodelregistrodxnelregistroax)diventermov?%dx,%axnellaU sintassiA*T&T.Lanlunghezzadell'opGerandospecicatatramiteunsussoalnomedell'istruzione.$Ilsusso蓺bperbyteBb(8bit),F"wpGerword(16bit)elpGerlong(32bit).kAAdesempio,F"lasintassicorrettapGerl'istruzione _2 ~?G3.8ASSEMBLA TORI]~!13ՁVmenzionata_pGocofasarebbestatamovw?%dx,%ax.aComunque,gasnonrichiedeunasintassiA*T&T rigorosa,quindiilsussoopzionalequandolalunghezzapuesserericavqatadairegistriusaticomeopGerandi,U altrimentivienepostaa32bitperdefault(conunavviso).^荍GliW"opGerandiimmediatisonoindicaticonilpresso$,Wcomeinaddl?$5,%eax(sommailvqalorelong5alU registro%eax).L'assenzaHdipressoinunopGerandoindicacheunindirizzodimemoria;\percimovl?$pippo,%eaxmettel'indirizzoFdellavqariabilepipponelregistro%eax,gmentremovl?pippo,%eaxmetteilcontenutodellaU vqariabilepipponelregistro%eax.L'indicizzazioneol'indirezioneottenutaracchiudendoilregistroindiceol'indirizzodellacelladimemoria[diindirezionetraparentesi,]Jcomeintestb?$0x80,17(%ebp)(esegueuntestsulbitpialtodelU vqalorebyteall'oset17dallacellapuntatada%ebp).:eEsisteunprogrammapGeraiutarviaconvertireprogrammidallasintassiT*ASMallasintassiA*T&T.Dateun'oGcchiataU aؼftp://x2ftp.oulu.fi/pub/msdos/programming/convert/ta2asv08.zipGAShaunadoGcumentazioneesaurienteinformatoT*eXinfo,chetrovqatenelladistribuzionedeisorgenti (e?forsealtrove).1Potete?sfogliarelepagine.infoestratteconemacsoconcichepiviaggrada.C'eraunlechiamatogas.doGcoas.docdallepartidelpacchettosorgentediGAS,mastatoincorpGoratonelladoGcumentazioneinT*eXinfo.kPCerto,'incasodidubbio,ladoGcumentazionedenitivqasonoisorgentistessi!UnaU sezionecheviinteresserparticolarmente蓺Machine?Dependencies::i386-Dependent::ؼAncora,6i sorgentidiLinux(ilkerneldelsistemaopGerativo)sirivelanobuoniesempi;cdateun'oGcchiataaiseguentiU lesottolinux/arch/i386:kernel/*.S,?boot/compressed/*.S,mathemu/*.SSestatescrivendoqualcosatipGounlinguaggio,unpacchettopGerithread,ecc.HspotresteancheguardarecomesiVcompGortanoaltrilinguaggi(OCaml,VZgforth,ecc.)tqoVpacchettiperithread(QuickThreads,VZMITpthreads,LinuxThreads,U etc),oquelche.Inne,L=limitarsiacompilareunprogrammaC6inassemblypGotrebbemostrarvilasintassidelgenerediistruzioniU cheviinteressano.qV*ederelaprecedentesezione2(Avetebisognodell'assembly?). EЍ3.2.3#!\MoQdoa16bitlimitatoMGASunassemblatorea32bit, ilsuocompitoquellodisuppGortareuncompilatorea32bit.[dAttualmentehapsolounsuppGortolimitatoperilmodoa16bit,jcheconsistenell'antepGorreipressiperi32bitalleistruzioni,cosicchscrivetecoGdicea32bitchegiranelmoGdoa16bitsuunaCPUa32bit.TInentrambiimoGdiU supportal'usodeiregistria16bit,manonl'indirizzamentoa16bit.Utilizzated?ledirettive.code16e.code32pGerpassaredaunmodoall'altro.Notatecheun'istruzionediassemblyU inlineasm(".code16nn")consentiraGCCdiproGdurrecodicea32bitchegirerinrealmode!MistatodettochelamaggiorpartedelcoGdicenecessariopersupportarepienamentelaprogrammazionenelvmoGdoa16bitstataaggiuntaaGASvdaBryanF*ord(sipregadiconfermare),Ituttavianonsitrovqainnessuna+delledistribuzionichehoprovqato,3noabinutils-2.8.1.x...csarebbGerograditemaggioriinformazionisuU questoargomento.Unasoluzioneeconomicaquelladideniremacro(vedereinseguito)cheinqualchemoGdoproduconolacoGdica3binaria(con.byte)soloperleistruzionidelmodoa16bitdicuiavete3bisogno(quasinessunaseusate64ilcoGdicea16bitcomesopraesepotetesupporreconcertezzacheilcodicegirersuunaCPU6,x86ingrado3digestirei32bit).PertrovqarelacoGdicacorretta,8poteteispirarviaisorgentidegliassemblatoriingradoU digestirei16bit.G_2 ~?G3.8ASSEMBLA TORI]~!14ՁV3.3GASPMGASP@(GASPreproGcessor)kilPreprocessoreperGAS.Aggiungemacroedeicostruttisintatticicarinia GAS. 3.3.1#!\Do>vetrov\|areGASPGASPU sitrovqaassiemeaGASnell'archiviobinutilsdiGNU.3.3.2#!\ComefunzionaF*unzionacomeunltro, sinmoGdomoltosimileacppeprogrammianaloghi.YzNonhoalcunaideasuidet- tagli,B(ma=jassiemeadessotrovqatedoGcumentazionerelativqaintexinfo,B(pGercilimitateviasfogliarla(in.info),stamparla,U sviscerarla.qGASconGASPmisembrauncomuneassemblatoreconmacro.#Í3.4NASMMIlprogettoNetwideAssemblerstaproGducendounulterioreassemblatore,scrittoinC,chedovrebbGeessereabbastanzaU moGdularepersupportareeventualmenteU tuttelesintassiediformatidioggettoconosciuti.3.4.1#!\Do>vetrov\|areNASMMhttp://www.cryogen.com/NasmؼLe3Creleasebinarie,jnelvostrosolitomirrordisunsite,sottodevel/lang/asm/. DovrebbGeroinoltreesseredispGonibiliU come.rpmo.debneicontribdellevostredistribuzioniRedHat/Debian.3.4.2#!\CosafaMNelU momentoincuiquestoHOWTOvienescritto,laversionecorrentediNASM0.96.ؼLasintassiinstileIntel.9-ȑintegratodelsuppGortoperlemacro.9-Iformatidileoggettosupportatisonobin,U aout,coff,elf,as86,(DOS)obj,win32,rdf(illoroformatospGecico).NASMU puessereusatocomebackendU pGerilcompilatoreliberoLCC(sonoinclusiiledisupporto).DiwcertoNASMvsievolvewtroppGorapidamenteperchquestoHOWTOvpGossaessereaggiornato.3Amenoche8voistiateusandoBCCcomecompilatorea16bit(ilcheesuladagliscopidiquestoHOWTOsullaprogrammazionea32bit),ydovresteusareNASMfinvecedi,yadesempio,ASMfoMASM,pGerch铀attivqamentesuppGortatoU onlineegirasututtelepiattaforme.Nota:qconU NASMtrovqateancheundisassemblatore,NDISASM.Il@suoparserscrittoamanolorendemoltopiveloGcediGASanchese,ovviamente,non@suppGortatrefantastiliardiR`diarchitetturedierenti.pSevoletegenerarecoGdiceperx86,Rdovrebbeesserel'assemblatoredascegliere.#Í3.5AS86MAS86<7unassemblatore80x86a16e32bit,partedelcompilatoreC;diBruceEvqans(BCC).Seguefondamentalmentev%lasintassiIntel,fanchesenediscostaleggermentepGerquantoriguardalemoGdalitdiindirizzamento._2 ~?G3.8ASSEMBLA TORI]~!15ՁV3.5.1#!\Do>veproQcurarsiAS86MUna46versionedecisamentesupGeratadiAS86distribuitadaHJLusemplicementepGercompilareilkernel diLinux,inunpacchettochiamatobin86(versionecorrente:0.4),dispGonibileinogniarchiviodiGCCpGerLinux.HYT*uttavia٫nonconsiglioanessunodiusarlopGerqualcosachenonsiacompilareLinux.HYQuestaversionesuppGortasolounaversionemodicatadelformatoperleoggettodiminix,ϻchenonsupportatadallebinutilsɟGNUɁoaltroechehaqualchebugnelmoGdoa32bit,quindifarestepropriomeglioatenerlasolopGerU compilareLinux.ؼLeZversionipirecentirealizzatedaBruceEvqans(bGde@zeta.org.au)sonopubblicateassiemealladistribuzioneF*reeBSD.Beh,loerano:N:nonsonoriuscitoatrovqareisorgentidalladistribuzione2.1inpGoi:(Quindi,mettoiU sorgentidame:http:///www.eleves.ens.fr:8080/home/rideau/files/bcc-95.3.12.src.tgzIldprogettoLinux/8086(conosciutoanchecomeELKS)dstainqualchemoGdomantenendobGcc(anchesenoncredoU cheabbianoinclusolepatchpGeri32bit).qDateun'occhiatadallepartidihttp://www.linux.org.uk/Linux8086.htmlftp://linux.mit.edu/U .T*raol'altro,vOquesteversionepirecenti,vOcontrariamenteaquellediHJLu,vOsuppGortanoilformatoGNUoa.outpGerqLinux,5Ecosicch阀pGossibileillinkingtrailvostrocoGdiceediprogrammiLinuxe/ol'utilizzodeisolitistrumenti\dalpacchettoGNU\HbinutilpGermanipolareivostridati.QuestaversionepucoGesisteresenzaalcunU dannoconquellaprecedente(vedereladomandarelativqainseguito).BCC,T=versionedel12marzo1995eprecedenti,TkesegueipushedipGopdisegmentisoltantoa16bit,Tkilche莡nonU pGocoseccantequandosiprogrammanelmodoa32bit.UnaU patchdispGonibilenelprogettoT*uneshttp://www.eleves.ens.fr:8080/home/rideau/Tunes/allaNsottopaginafiles/tgz/tunes.0.0.0.25.src.tgznelladirectorydecompressaLLL/i386/LapatchdovrebbGeU ancheesseredispGonibiledirettamentedahttp://www.eleves.ens.fr:8080/home/rideau/files/as86.bcc.patch.gzBruce{Evqanshaaccettatoquestapatch,cosseungiornocisardaqualcheparteunaversionepirecentediU bGcc,lapatchdovrebbGeesserestatainclusa. ]3.5.2#!\Comein>voQcarel'assemblatore?MEcco[ulavoGcenelMakelediGNU[spGerusarebccalloscopoditrasformareasm.sinoggetto.oedottenereunU listato.l:ffGp%.o?%.l:)`%.s)`bcc?-3-G-c-A-d-A-l-A$*.l-o$*.o$< ffG-T*oglieteW%.l,=-A-le-A$*.lsenonvoletealcunlistato.Sevoletequalcos'altroinvecediuna.outGNU,pGoteteconsultareladoGcumentazionedibcccircaglialtriformatisupportatie/outilizzareob0jcopydalpacchettodelleU GNUbinutils.3.5.3#!\Do>vetrov\|aredoQcumentazioneMLatdoGcumentazionequellacheinclusanelpacchettobGcc.&}DaqualchepartenelsitodiF*reeBSDssonoinoltredispGonibilifclepaginedimanuale.HIncasodidubbi,jisorgentistessisonospGessounabuonadocumentazione: _2 ~?G3.8ASSEMBLA TORI]~!16ՁVnonBPmoltobGencommentata,Fmalostilediprogrammazionechiaro.k;Potresteprovqareavederecomeas86 U utilizzatoinT*unes0.0.0.25... 3.5.4#!\EsenonriescopiacompilareLin>uxconquestanuov\|aversione?MLinussepGoltovivonellapGostaelamiapatchpGercompilareLinuxconas86a.outpGerLinuxnoncel'hafattaadarrivqargli(!).zOra,.>questonondovrebbGeavereimpGortanza:limitateviatenereilvostroas86dalpacchettobin86in/usr/binelasciatechebGccinstallil'as86buonocome/usr/local/libexec/i386/bcc/asdovedovrebbGewrisiedere.٘Nonavretemaibisognodichiamareesplicitamentequestoas86buono*,pGerchbGccfatuttocomesideve, compresalaconversionedalformatoa.outdiLinuxquandovieneinvoGcatoconleopzionicorrette;U limitatevipGerciadassemblareusandobcccomefrontend,nonfatelodirettamenteconas86.#Í3.6ALTRIASSEMBLATORIQueste&SsonoaltresceltepGossibili,/nonconvenzionali,nel&ScasoincuileprecedentinonviabbianosoGddisfatto(pGerch?).1Nonleconsiglioneicasicomuni(?),mapGotrebberorivelarsimoltoutilisel'assemblatoredeveessereintegratonelsoftwarechestateprogettando(adesempiounsistemaopGerativoounambientedisviluppGo). 3.6.1#!\L'assem>blatoreWin32F orthWin32F*orthـunsistemaANSFORTHa32bitlib}/ero.gchegirasottoWin32s,Win95,WinNT.Includeunassemblatore}libGeroa32bit(consintassipressaopGostssa)integratonellinguaggioFOR*TH.LagestionedellemacrorealizzataconlapienapGotenzadellinguaggioFOR*TH;comunque,l'unicocontestodiinputedioutputsuppGortatoWin32F*orthstesso(nessunacreazionedile.ob0j;[certo,potresteaggiungerlavoistessi).qLoU trovqatequi:ؼftp://ftp.forth.org/pub/Forth/win32for/ 3.6.2#!\T erseT*ersesunostrumentodiprogrammazioneconLALsintassidell'assemblatorepicompattapGerlafamigliax86!ؼV*ederehttp://www.terse.comG.JSidicechecenesiaunclonelibGerodaqualcheparte.JSarebbGestatoabbandonato inseguitoapreteseinfondatesecondolequalilasintassiapparterrebbGeall'autoreoriginale.RViinvitoU acontinuarnelosviluppGo,nelcasolasintassiviinteressi. 3.6.3#!\Assem>blatorinonlibQerie/onona32bit.Potetebtrovqarepiinformazioniariguardo,assiemeallebasidellaprogrammazioneassemblypGerx86,nelleFAQU diRaymondMoGonpercomp.lang.asm.x86ؼhttp://www2.dgsys.com/~raymoon/faq/asmfaq.zipV*aOnotatochetuttigliassemblatorichesibasanosulDOSOdovrebbGerofunzionaresottol'emulatorediDOS pGerHLinuxedaltriemulatorianaloghicosicch,RsenepGossedetegiuno,pGotetecontinuareHadusarloinunverosistemaopGerativo.qAlcuniassemblatorirecentipGerDOSsupportanoancheCOFFe/oaltriformatidiledoggettochesonosuppGortatidallalibreriaGNUVBFD,cospoteteusarliinsiemeaivostristrumentilibGeriaU 32bit,magariusandoGNUob0jcopy(chefapartedellebinutils)comeltrodiconversione._2 ~?G4.8MET APR>OGRAMMAZIONEEMACRO嬻17ՁV4MET(APRcOGRAMMAZIONEG\EMACRO:LaU programmazioneinassemblyunascoGcciatura,trannechepGersezionicritichedeiprogrammi.ؼDovresteusareglistrumentiappropriatipGerilcompitogiusto,quindinonsceglietel'assemblyquandonon x|adatto;*C,OCAML,pGerl,SSchemepotrebberoessereunasceltamiglioreperlamaggiorpartedellavostraprogrammazione.Comunque,nCciiOGRAMMAZIONEEMACRO嬻18ՁV4.1.3#!\GASPMAggiungeU tuttiitipicitrucchettidellemacroaGAS.ConsultatelasuadoGcumentazionetexinfo. 4.1.4#!\NASMAncheNASMWhadelsuppGortoperlemacro.7LDateun'occhiataalladocumentazionerelativqa.7LSeavetequalche idea1brillante,8=pGotrestevolercontattaregliautori,8=dalmomentochelostannosviluppandoattivqamente.ewNelfrattempGo,U dateun'occhiataailtriesternipresentatiinseguito.4.1.5#!\AS86MHauunpGo'disemplicesupportoperlemacro,manonsonoriuscitoatrovqaredelladocumentazione.9IJsorgentisonozmoltochiaripGercisesieteinteressatidovrestecapirlifacilmente.JSelecapacitdibasenonvibastano,dovresteU usareunltroesterno(vedereinseguito).4.1.6#!\AL TRIASSEMBLATORI#Win32FOR*TH:CODEһedEND-CODEsonodellemacrochenoncommutanodalmoGdointerpretazionealU moGdocompilazione,cosicchavetepienoaccessoallapGotenzadelFOR*THdurantel'assembling.TUNES:Gnonfunzionaancora,maSchemeunverolinguaggioadaltolivellocheconsentemetaprogrammazioneU arbitraria.#Í4.2FiltriesterniMQualunquewsiailsuppGortoperlemacrodelvostroassemblatore,Yoqualunquelinguaggioutilizziate(pGernoilC!),sesecondovoiillinguaggiononsucientementeespressivo,pGotetefarpassareileattraversounltroU esternoconunaregolacomequestanelMakele:XffG%.s:%.S?altre_dipendenze>$(FILTRO)?$(OPZIONI_DEL_FILTRO)<$<>$@ YffG4.2.1#!\CPPCPPnonmoltoespressivo,SmasucientepGerlecosefacili,SstandardedchiamatoinmoGdotrasparentedaU GCC.ؼPerfareunesempiodellesuelimitazioni,>$nonsipGossonodichiarareoggettiinmoGdotalecheidistruttorivenganochiamatiautomaticamentealterminedelbloGccodidichiarazione;?nonavetediversionoregoledivisibilitU (scoping),ecc.CPPsitrovqaassiemeadognicompilatoreC.Sevelasietecavqatasenzaaverneuno,`nonpreoGccupatevidiproGcurarviU GCC(anchesemichiedocomeabbiatefatto). 4.2.2#!\M4MM4vidtuttalapGotenzadellemacro,conunlinguaggioT*uring-equivqalente,ricorsione,espressioniregolari,ecc.qPoteteU farcituttocicheCPPnonriesceafare.DateU un'oGcchiataamacro4th/This4thda8_2 ~?G4.8MET APR>OGRAMMAZIONEEMACRO嬻19ՁVftp://ftp.forth.org/pub/Forth/K۹inReviewed/ANS/(?),MolesorgentidiT*unes0.0.0.25comeesempidi unutilizzoavqanzatodellemacroconm4.lComunque,ilsuoscomoGdosistemadiprotezionedall'espansionevi7%obbligaadutilizzarepGerlemacrounostilebasatosullaricorsioneincodaconpassaggiodicontinuazioneesplicito(explicitcontinuation-passing)sevoleteunausoavanzatoETdellemacro(ilchericordaT*eX.ApropGos-ito,G3qualcunoChaprovqatoadusareT*eXCpGerlemacrodiqualcosadidiversodallacompGosizionetipograca?).QuestocomunqueNONwpGeggiodiCPP*,ilqualenonpermettenilquotingnlaricorsione.qLaversionegiusta9dim4daproGcurarsiGNUm41.4(osuccessivqa,&seesiste),laqualehailmaggiornumerodifun-zionalitedilminornumerodibugolimitazionirispGettoallealtre.Rm4progettatoperesserelentopertutto(trannegliutilizzipisemplici,ilchepGotrebbe(andareancorabGeneperlamaggiorpartedeiprogrammiassemblyU (nonstatescrivendoprogrammiinassemblydamilionidirighe,vero?). 4.2.3#!\Macroconiv>ostriltriMPotete-"scrivervideisempliciltripGerl'espansionedellemacroconisolitistrumenti:!pGerl,c#awk,sed,ecc.Sifainfrettaedaveteilcontrollosututto.JMaovviamente,lapGotenzanellagestionedellemacrobisognaguadagnarselaU confatica.4.2.4#!\MetaprogrammazioneMInvece<|diusareunltroesternocheespandelemacro,AjunmoGdoalternativodiproGcederequellodiscrivereprogrammiU chescrivonopartidialtriprogrammi(ointeriprogrammi).ؼAdU esempio,pGotresteutilizzareunprogrammachediainuscitacoGdicesorgenteؼpGerU generaretavoleU precalcolatediseno/coseno/quant'altro,pGerU estrarreunarappresentazioneinformasorgentediunlebinario,pGerU inserirelevostrebitmapnelcodicecompilatodiroutinedivisualizzazionerapide,pGerQestrarredocumentazione, codicediinizializzazione/conclusione, tabelledidescrizionecoscome coGdiceU ordinariodaglistessilesorgenti,pGer0averecoGdiceassemblypGersonalizzato,(tgeneratodaunoscriptperl/shell/schemechesioGccupadielabGorazioneU generica.pGer:propagaredatidenitiinunpuntosoloversovqaripGezzidicodiceetabelleconriferimentiincrociati.ecc.ؼPensateci! Bac>kenddacompilatoriesisten>ti `CompilatorilcomeSML/NJ,Ob0jectiveCAML,MIT-Scheme,ecc.hannoUillorobackendUgenericopGergliassemblatorichepGotresteomenovolerusareseintendetegeneraresemiautomaticamenteU delcoGdicepartendodailinguaggirelativi.IlNew-JerseyMac>hine-CoQdeT oolkit `C'unprogettopGercostruire,Yusandoillinguaggiodipro-grammazioneIcon,ԿunabasepGerprodurrecodicechemanipolal'assembly*. 0Dateun'occhiatadallepartidiؼhttp://www.cs.virginia.edu/~nr/toolkit/Cb_2 ~?G5.8CONVENZIONIDICHIAMA TA20ՁVT unes `Il progettoT*unesOSstasviluppandoilsuoassemblatorecomeun'estensioneallinguaggioScheme, comeQpartedelsuoproGcessodisviluppo.p]Almomentononancoraingradodigirare,Rftuttaviaogniaiuto莡bGeneU accetto.ؼL'assemblatoremanipGolaalberidisintassisimbGolici,cospuugualmenteservirecomebasepGeruntraduttorediqsintassiassembly*,undisassemblatore,unbackendcomunepGerassemblatore/compilatore,ecc.InoltretuttalapGotenzadiunverolinguaggio, Scheme,lorendeinsupGeratoperquantoriguardalemacroelametaprogrammazione.http://www.eleves.ens.fr:8080/home/rideau/Tunes/(5CONVENZIONIG\DICHIAMA(TA荍5.1LinuxM5.1.1#!\LinkingaGCCȑil moGdopreferito.ControllateladocumentazionediGCCegliesempidaile.SdelkerneldiLinuxche passanoU attraversogas(nonquellichepassanoattraversoas86).Glir=argomentia32bitvengonopGostisullostack(push)inordineinversorispGettoallasintassi(pGercuivisiaccedeprelevqandolinell'ordinecorretto)sopral'indirizzodiritornoa32bit.%ebp,%esi,%edi,%ebxsonosalvqatiL-dallafunzionechiamata,glialtridallafunzionechiamante;dzpGercontenereilrisultatosiusa%eax,oppureU %edx:%eaxpGerrisultatia64bit.StackFP:nonnesonocerto,߀mapGensocheilrisultatovqadainst(0)echel'interostacksiasalvqatodallafunzionea chiamante.=NotatecheGCCahadelleopzionipGermodicareleconvenzionidichiamatariservqandoregistri,pGerNmettereargomentineiregistri,pGernonfaresupposizionisullapresenzadell'FPU,ecc.ControllateleU pagine.infoi386.F*ateattenzione:!iinquestocasodovetedichiararel'attributodeclpGerunafunzionecheseguirleconvenzionidichiamatastandarddiGCC(nonsocosafacciaconleconvenzionidichiamatamoGdicate).dLeggetelepagineU infodiGCCnellasezione:qC?Extensions::ExtendedAsm:: 5.1.2#!\ELFeda.out: problemi.MAlcuniU compilatoriCantepGongonoununderscoreprimadiognisimbGolo,mentrealtrinonlofanno.InU particolare,GCCa.outpGerLinuxeettuaquestaantepGosizione,mentreGCCELFpGerLinuxno.SeMavetebisognodigestireinsiemeentrambiicompGortamenti,Dguardatecomefannoipacchettiesistenti.VAdesempio,U proGcuratevideivecchiU sorgentidiLinux,Elk,qthreads,oOCAML...PoteteU inoltrefarignorarelarinominazioneimplicitaC->asminserendoistruzionicomeXffG)`void?pippoasm("pluto")(void); &ffG ȍpGerU esseresicurichelafunzioneCpippovengachiamatadavveroplutoinassembly*.Notatecheilprogrammadiutilitobjcopy,#dalpacchettobinutils,#dovrebbGepermetterviditrasformareivostriNoggettia.outinoggettiELFux: chiamatedisistemadiretteMCiespressamenteNON>consigliato,bpGoichleconvenzionicambianoditantointantootravqariantidel kernelo(vedereL4Linux),inoltresipGerdelaportabilit,comportaunlavorodiscritturamassiccio,siharidondanzaconglisforzidilibGcED}INOL*TREprecludeestensioniecorrezioniapportatealibccome,$ adesempio,ilYpacchettozlibc,cheprovvedeadunatrasparentedecompressionealvolodilecompressicongzip.oIlOametoGdoconvenzionaleOaeconsigliatoperchiamareiservizidisistemadiLinux,Perimarr,quellodipassareU attraversolalibGc.ؼGli?oggetticondivisidovrebbGeromantenerelavostrarobaentrodimensionicontenute.E'sepropriovoletebinariU pipiccoli,utilizzate#!qescaricatesull'interpreteilfardellochevoletetoglieredaivostribinari.Ora,7sepGerqualcheragionenonvoletefareunlinkallalibGc,7procuratevilalibGcstessaecapitecomefunziona!DopGotutto,U aspirateasostituirla,no?PotresteU inoltredareun'oGcchiataacomeilmioeforth1.0cU ftp://ftp.forth.org/pub/Forth/Linux/linux-eforth-1.0c.tgzloU fa.Anche^isorgentidiLinuxtornanoutili,inparticolarel'headerleasm/unistd.h,chedescrivecomeeettuareleU chiamatedisistema...F*ondamentalmente,p(generatejunint?$0x80,conilnumeroassoGciatoa__NR_nomedellasyscall(daasm/unistd.h)xin%eax,ediparametri(noacinque)in%ebx,%ecx,%edx,%esi,%edirispGettivqamente.5Ilrisultatovienerestituitoin%eax,doveunnumeronegativounerroreilcuioppGostocichelibGcmetterebbeinerrno.LostackutentenonvienetoGccato,cosnonnecessarioaverneunovqalidoquandoeettuateunachiamataU disistema. ۍ5.1.4#!\I/OsottoLin>uxMSe@voleteeettuaredell'I/O@sottoLinux,x-ositrattadiqualcosadimoltosemplicechenonrichiedel'arbitraggiodel8UsistemaopGerativo,>ealloradovresteconsultarel'IO-Port-Programming?mini-HOWTO,oppurehabisognodiQCundriverdipGerifericanelkernel,Knelqualcasodovresteprovqareadapprofondirelevostreconoscenzesull'hackingdelkernel,sullosviluppGodidriverdipGeriferica,suimodulidelkernel,ecc.,periqualicisonoaltriU eccellentiHOWTOedoGcumentidelLDP*.InU particolare,secicheviinteressalaprogrammazionedellagraca,allorapartecipatealprogettoGGI:http://synergy.caltech.edu/~ggi/http://sunserver1.rz.uni-duesseldorf.de/~becka/doc/scrdrv.htmlComunque,inccedereadrivera16bitdaLinux/i386MCiteoricamentepGossibile(dimostrazione:y^guardatecomeDOSEMUثriescaagarantireaiprogrammiunaccessoapGortehardwareinmodoselettivo),edhoanchesentitovoGcisecondolequaliqualcunodaqualche!partecisarebbGedifattoriuscito(neldriverPCI?RobapGerl'accessoVESA?ISA!PnP?Nonso).`QSeavetefPinformazionipipreciseariguardo,jsiateibGenvenuti.Comunque,buonifPpGostiincuicercaremaggioriinformazioniU sonoisorgentidelkerneldiLinux,isorgentidiDOSEMU(edaltriprogramminelDOSEMUWr}/epository*ftp://tsx-11.mit.edu/pub/linux/ALPHA/dosemu/),_esorgentidivqariprogrammiabassolivellosottoLinux...h(forseGGIosesuppGortaVESA).F*ondamentalmente,doveteusarelamoGdalitprotettaU a16bitoilmoGdovm86._y_2 ~?G5.8CONVENZIONIDICHIAMA TA22ՁVIlRprimopisemplicedamettereinpiedi,mafunzionasolamenteconcoGdiceeducato(well-bGehaved)che non[utilizzal'aritmeticadeisegmentioindirizzamentoassolutodeglistessi(segmento0inparticolare),FamenochenoncisitrovinelcasoincuituttiisegmentiutilizzatipGossanoesserepreparatiinanticipGonellaLDT.ؼIlsecondopGermettepicompatibilitconicomuniambientia16bit,Fgmarichiedeunagestionepicomplessa.InU entrambiicasi,primadipGotersaltarealcodicea16bit,doveteЉfarezunmmapdituttigliindirizziassolutiutilizzatinelcoGdicea16bit(comeROM,buervideo,5zonesuU cuiagirilDMAedI/Omemory-mappGed)da/dev/memallospazioindirizzidelvostroprocesso.)preparareU laLDTe/oilmonitorpGerilmodovm86ottenereU glioppGortunipermessidiI/Odalkernel(vederesopra)Ancoraunavolta,*leggeteconcuraisorgentideicontributialDOSEMUrepGositorymenzionatosopra,*in particolareU queimini-emulatoripGerfargirareELKSe/osempliciprogrammi.COMsottoLinux/i386."獍5.2DOSMLamaggiorpartedeiDOSnextendervienefornitacondell'interfacciamentoaserviziDOS.LeggetelalorodoGcumentazioneeariguardo,imaspessosilimitanoasimulareint?$0x21esimili,icosvicomportatecomese`NfosteinmoGdoreale(dubitocheabbianoqualcosadipidistubedestensioniperlavorare`NconoperandiaU 32bit;moltoprobabilmentesilimiterannoaripGortarel'interruptnelgestoredelmoGdorealeodelvm86).ؼDoGcumentazioneU suDPMIeani(emoltopi)puesseretrovqatainftp://x2ftp.oulu.fi/pub/msdos/programming/AncheU DJGPPvienefornitoconilproprioderivqato/sottoinsieme/sostitutodiglibGc.ȑ"pGossibile"lacompilazioneincrociatadaLinuxaDOS,guardatenelladirectorydevel/msdos/delvostro mirrori/loGcaledell'areaFTPhdisunsite.unc.eduDateancheun'occhiataalDOShextenderMOSSdalprogettoFluxU inUtah.ؼAltriU doGcumentieFAQsonomoltoDOS-centrici.qNoinonconsigliamodisvilupparepGerDOS.5.3Winzozzecompagniab_ellaMEhi,GquestoDrdoGcumentoriguardasoloilsoftwarelibGero.kT*elefonatemiquandoWinzozzdiventalibGero,GocisipGossonoU usarestrumentidisviluppoliberi!ؼBeh,U dopGotuttocisono:CygnusSolutionsU http://www.cygnus.comhaQsviluppatolalibreriacygwin32.dllpGerfargirareiprogrammiGNUsupiattaformeMicrashoft.Cos쎤 pGotete/usareGCC,GAS,tuttiglistrumentidiGNU/emoltealtreapplicazioniUNIX.Dateun'occhiataallalorobhomepage.Io(F*ar)nonintendodilungarmisullaprogrammazionediWinnaNannamasonocertochepGoteteU trovqareunsaccodidocumentazioneariguardopraticamenteovunque...5.4Unsistemaop_erativotuttovostro.MEssendowilcontrollocicheattraemoltiprogrammatoriall'assembly*,Mildesideriodisvilupparesistemiop-erativi[spGessocicheliportaall'(oderivqadall')hackinginassembly*.Va[notatocheognisistemachepL_2 ~?G6.8COSED>AFAREERIFERIMENTI23ՁVpGermettelosviluppodisestessopotrebbeessereconsideratounsistemaoperativo*,anchesemagarigira sopraadunsistemasottostantecheforniscemultitaskingoI/O(inmoGdomoltosimileaLinuxsopraMachoU OpGenGenerasopraUNIX),ecc.ؼQuindi,N%pGerWrenderepifacileildebugging,pGotrestevolersviluppareilvostrosistemaopGerativoprimacomeU proGcessochegirasopraaLinux(nonostantelalentezza),quindiusareilFluxOSkitU http://ww.cs.utah.edu/projects/flux/(chebconsentel'utilizzodidriverdiLinuxeBSDEnelvostroOS)EpGerrenderloautonomo.FQuandoilvostrosistema}stabile,restaancoradeltempGoperscriveredeidriverpGerl'hardwaretuttivostri,selacosavifaproprioU piacere.QuestoHOWTOnonsioGccuperdiargomentiqualiilcoGdiceperilbootloaderedentrarenelmodoa32bit,gestire{gliinterrupt,ifondamentidegliorroriintelmoGdoprotettooV86/R86*,ladenizionediunvostro5 formatopGerileoggettoeleconvenzionidichiamata.fIlluogoprincipaleincuitrovqareinformazioniattendibili:ariguardosonoisorgentidisistemiopGerativiobootloadergiesistenti.#CisonounsaccodiriferimentiU inquestapaginaWWW:http://www.eleves.ens.fr:8080/home/rideau/Tunes/Review/OSes.html(6COSEG\DcAF=AREERIFERIMENTIriempireU lesezioniincomplete.aggiungereU ulterioririferimentiasoftwareedoGcumentazione.aggiungereesempifacilidalmondorealepGerillustrarelasintassi,lapotenzaelelimitazionidiogni soluzioneU propGosta.chiedereU aiutoingiropGerquestoHOWTO.trovqareU qualcunochehadeltempGopersubentrarminelmantenimento.cheU siailcasodispGenderequalcheparolasull'assemblysualtrepiattaforme?AlcuniU riferimenti(inaggiuntaaquelligipresentinelrestodell'HOWTO)$@^/imanualidelp}/entiumU http://www.intel.com/design/pentium/manuals/$@^/bugnelleCPUdellafamigliax86U http://www.xs4all.nl/~feldmann$@^/hornet.eng.u.e}/duperprogrammatoriassemblyU http://www.eng.ufl.edu/ftp$@^/ftp.luth.seU ftp://ftp.luth.se/pub/msdos/demos/code/$@^/F_AQdelmo}/doprotettoU ftp://zfja-gate.fuw.edu.pl/cpu/protect.mod$@^/Paginadell'assembly80x86U http://www.fys.ruu.nl/~faber/Amain.html$@^/Coursewar}/eU http://www.cit.ac.nz/smac/csware.htm$@^/pr}/ogrammazionedigio}/chiU http://www.ee.ucl.ac.uk/~phart/gameprog.html$@^/esp}/erimentidiprogrammazionesoloinassemblysottoLinuxU http://bewoner.dma.be/JanWE"ovviamente,+utilizzateNivostristrumentidiricercasuInternetpGercercareulterioriinformazionieragguagliatemiU suqualunquecosainteressanteU troviate!ؼ.sigU dell'autore:~_2 ~?G6.8COSED>AFAREERIFERIMENTI24ՁV--,2,9d_?v~ X^-- --?Fare--rideau@clipper.ens.fr--Francois-ReneRideau--+)ang-VuBan----s'c/?.4|--Join?theTUNESprojectforacomputingsystembasedoncomputingfreedom!Y:lTUNES?isaUseful,NotExpedientSystemWWW?pageatURL:http://www.eleves.ens.fr:8080/home/rideau/Tunes/;_2GHЃ ecti1000!N ecbx1200]f ecbx1000&Lt$ffffecbx14408 ecsi10006 ecss1000Iqqecss2074qL ectt1000 1 ecrm1000 !", cmsy10 b> cmmi10m