Sei sulla pagina 1di 14

Copyleft 2010 Fabian Priftaj

Appunti di programmazione in assembly 8088

Appuntidiprogrammazione inlinguaggio

lapresentedispensarappresentaunriassuntodellapartediprogrammazione inlinguaggioassemblativo,trattadallibro1ditestousatoalezione

Assembly8088

1 Andrew S. Tanenbaum, Architettura dei calcolatori, Un approccio strutturale - 5^ed.

Pagina 1

Copyleft 2010 Fabian Priftaj

Appunti di programmazione in assembly 8088

Indicegenerale
PARTE1,ILLINGUAGGIOASSEMBLY 1.1Introduzione PARTE2,ILPROCESSORE8088 2.1Introduzione 2.2CiclodiNeumann 2.3Registridell'architettura8088 2.3.1Registriadusogenerale 2.3.2Registripuntatore 2.3.3Registriindice 2.3.4Registrodiflag 2.3.5RegistroIP(InstructionPointer) 2.3.6Registridisegmento PARTE3,INDIRIZZAMENTODELLAMEMORIA 3.1Introduzioneall'indirizzamento 3.2Indirizzamentodiretto 3.3Indirizzamentoindiretto 3.4Indirizzamentoconspiazzamento 3.5Indirizzamentoaregistroconindice 3.6Indirizzamentoimmediato 3.7Indirizzamentoimplicito PARTE4,ISTRUZIONIDELL'8088 4.1Trasferimento,copiaearitmetica 4.2Ciclieoperazioniiterativesustringhe 4.3Istruzionidisaltoedichiamata 4.3.1Salticondizionali 4.4Chiamatedisubroutine 4.5Chiamatedisistemaesubroutinedisistema PARTE5,ASSEMBLATOREas88 5.1Introduzioneall'assemblatore PARTE6,ESEMPIODIPROGRAMMAZIONEASSEMBLY 6.1EsempiodiHello,World!

Pagina 2

Copyleft 2010 Fabian Priftaj

Appunti di programmazione in assembly 8088

PARTE1,LINGUAGGIOASSEMBLATIVO
1.1Introduzione L'assemblatore unprogrammachericeveiningressounfilecontenenteun programmain linguaggioassembly,egeneraunprogrammachecontiene codice binario,prontoadessereeseguito.Gliassemblatoriusano nomisimboliciper variabili e costanti, ed etichette per le istruzioni e gli indirizzi di memoria.

PARTE2,ILPROCESSORE8088
2.1Introduzione Ilprocessore compostodauninsiemediregistri,utilipermemorizzarele informazioniimportantiperilsuofunzionamento.Traivariregistri,quello pi importante ilregistro PC (ProgramCounter),ilqualecontienealsuo interno l'indirizzo della prossima istruzione da eseguire. A volte questo registrovienedettoancheIP(InstructionPointer). 2.2CiclodiNeumann L'attivit dei processori consiste nell'esecuzione di istruzioni in rapida successione.L'esecuzionediognisingolaistruzionevienescompostainpi fasi: Fetchdell'istruzionedallamemoriatramiteilregistroPC Incrementol'indirizzodelregistroPC Decodificadell'istruzioneprelevata Fetchdeidatinecessaridallamemoriaodairegistri Esecuzionedell'istruzione Memorizzazionedell'istruzioneinmemoriaoneiregistri Ritornoalpuntoiniziale 2.3Registridell'architettura8088 L'architettura 8088 ha a disposizione 14 registri, che costituiscono lo spaziodilavoroadisposizionedelprogrammatore.Iregistriall'internodi questa architettura si dividono a seconda l'uso a cui sono destinati: Registriadusogenerale,Registridisegmento,Registripuntatore,Registri indici,Codicidicondizioni,Registro InstructionPointer(IP) . 2.3.1Registriadusogenerale I registri ad uso generale possono essere visti come registri di 16bit, oppure come delle coppie di registri formate da 8bit. Quando andiamo ad accederealregistriAXinrealt quellochestiamofacendo accedereadue registri,ovveroAH:AL,doveALrappresentaiprimi8bitdeldato(partendo dasinistra)eAHrappresentaglialtri8bit(quellipi significativi).I registrichefannoparteinquestogrupposono: AX registro accumulatore, viene usato spesso per contenere il risultato

Pagina 3

Copyleft 2010 Fabian Priftaj

Appunti di programmazione in assembly 8088

delleoperazioni. BX registrodibase,pu essereusatoalpostodiAX,mahaanchealcune funzionicheinveceilregistroAXnonpossiede.AdesempioilregistroBX pucontenereunpuntatoreallamemoria,mentreAXno.Vediamounesempio: MOVAX,BX copiainAXilcontenutodiBX MOVAX,(BX) copiainAXlaparoladimemoriachesi trovaall'indirizzospecificatodaBX CX registrocontatore,vieneusatospessoneiciclievienedecrementato automaticamentedall'istruzioneLOOPeicicliterminanoquandoCXhavalore zero(0). DX registro dati, usato spesso insieme al registro AX per contenere istruzionilunghe32bit(DX:AX). 2.3.2Registripuntatore Tra questi registri troviamo il puntatore allo Stack detto SP (Stack Pointer).Un'altroregistroimportante ilBP(BasePointer)ilqualepunta allabasedelloStack.DunqueilBPpuntaallabasedelrecorddiattivazione corrente(alsuoindirizzopi grande)eSPpuntaallacimadelrecorddi attivazione (al suo indirizzo pi piccolo), perci questi due registri delimitanoilrecorddiattivazione. 2.3.3Registriindice Appartengono a questo gruppo i due registri SI (indice sorgente), e DI (indicedestinazione).Questiregistrisonospessousatiincombinazionecon BPperfareriferimentoaidatinelloStack,oconBXperlocalizzareidati inmemoria. 2.3.4Registrodiflag E' un insieme di registri da 1bit ciascuno. Alcuni di questi bit rappresentanoilrisultatodiespressioniaritmetiche,inquestomodo: Zrisultatozero Srisultatonegativo Vrisultatodioverflow Crisultatoconriporto Arisultatoconriportoausiliario(oltrei3bit) Pparitdelrisultato Iattivazionedegliinterrupt Tattivalamodalitditracing Dcontrollaladirezionedelleoperazionisustringhe 2.3.5RegistroIP(InstructionPointer) Il registro IP punta all'indirizzo dell'istruzione successiva a quella attualmenteinesecuzione.Questoregistrononvienedirettamenteusatodalle istruzioni.

Pagina 4

Copyleft 2010 Fabian Priftaj

Appunti di programmazione in assembly 8088

2.3.6Registridisegmento L'architettura8088usailconcettodi segmento perdistinguerelediverse porzionidimemoria.Esistono4segmenti: CSsegmentodicodice, Contieneleistruzionidelprogramma.IlregistroPC interpretatocomeun registroappartenenteaquestosegmento. DSsegmentodati, Contieneidatiinizializzatienondelprogramma. SSsegmentodistack, Contienelevariabililocalieirisultatiintermedi.GliindirizziSPeBP fannoriferimentoaquestosegmento. IlsegmentodiStack costituitodaparoledi2byte,percuiilpuntatore allo stack (SP) contiene sempre un numero pari. Esso riempito in senso decrescenteapartiredagliindirizzipigrandi. Il comando PUSH decrementa di 2 il puntatore allo stack (SP), e memorizza l'operandoincimaallostack.IlcomandoPOPrecuperailvaloreincimaallo stackeincrementadi2ilpuntatoreallostack(SP). ESsegmentoextra, un segmento di riserva che pu essere allocato in memoria ovunque sia necessario. L'indirizzo iniziale di un segmento si ottiene estendendo i 16bit del registro concatenandogli 4 zeri sulla destra (nelle posizioni meno significative). Questo vuol dire che gli indirizzi dei segmenti indicano sempreindirizzimultiplidi16.Inpraticaun indirizzofisico sicalcola moltiplicandoilregistrodisegmentoper16esommandoglil'offset. L'indirizzofisicodellasuccessivaistruzionedaeseguiresiottienefacendo scorrereilcontenutodelregistroCSdi4posizioniasinistraesommandoil valoredelPC.

PARTE3,INDIRIZZAMENTODELLAMEMORIA
3.1Introduzioneall'indirizzamento L'8088 mette a disposizione alcune modalit di indirizzamento per far riferimento ai dati in memoria. Molte istruzioni contengono 2 operandi chiamatiingeneredestinazioneesorgente.Adesempioleistruzioni: MOVAX,BX ADDCX,270 esegueunacopiadelcontenutodiBXinAX sommaalcontenutodiCXilvalore270

L'architettura8088richiedeinunistruzione,chealmenounodeglioperandi sia un registro. Esistono alcune istruzioni a un operando (come gli incrementi,decrementi,scorrimenti,negazioni,etc.,).Inquesticasinonci sonovincolisuiregistri.L'8088supporta4tipididatifondamentali:

Pagina 5

Copyleft 2010 Fabian Priftaj

Appunti di programmazione in assembly 8088

byte, word (2byte), long (4byte)e decimalibinari (BCD2,nonsupportati dal assemblatore in allegato al libro). Un indirizzo di memoria fa riferimentosempread1byte,maincasodiriferimentoadunaparolacisi riferisce implicitamente anche ai byte che seguono quello indicato. Ad esempiolaparolaall'indirizzo20comprendelelocazionidimemoria20e21. L'8088 assume un ordinamento di tipo littleendian, cio la parte meno significativadiunaparolamemorizzataall'indirizzominore. All'interno dello Stack le parole devono essere allocate in corrispondenza degli indirizzi pari. La coppia di registri DX:AX l'unica messa a disposizione dal processore per i dati long ( AX contiene la parte meno significativa). 3.2Indirizzamentodiretto Questamodalit diindirizzamento quellapi semplice,mediantelaquale l'istruzionecontienel'indirizzodeidatinell'operandostesso.Adesempio l'istruzione: ADDCX,(20) specifica che bisogna sommare al contenuto del registro CX, il contenuto dellaparoladimemoriaagliindirizzi20e21. 3.3Indirizzamentoindiretto In questo caso l'indirizzo dell'operando viene memorizzato in uno dei registri BX, SI, DI.Intuttietreicasisitrattadiunoperandochefa riferimentoalsegmentodati. 3.4Indirizzamentoconspiazzamento Questo tipo di indirizzamento particolarmente utile per il trattamento degli array. Ad esempio se il registro SI = 5, possibile caricare nel registro AL il quinto carattere della stringa FORMAT, con la seguente istruzione: MOVBAL,FORMAT(SI) L'intera stringa pu essere scandita incrementando o decrementando il registroadognipasso. 3.5Indirizzamentoaregistroconindice L'indirizzamentoaregistroconindice moltosimileall'indirizzamentocon spiazzamento. In questo caso si memorizza la base dell'array (cio il suo indirizzominore)nelregistroBXesiusailregistroSIoDIperscandirlo. Adesempio: PUSH(BX)(DI) L'istruzione effettua la somma degli indirizzi tra il registro BX e DI, e successivamentesiposizionaalindirizzodatodallasommadeidueregistri, prelevailcontenutoeloposizionaincimaalloStack. 3.6Indirizzamentoimmediato Inquestocasol'operandodell'istruzioneunacostante.Adesempio: CMPAX,50
2 Binary Coded Decimal

Pagina 6

Copyleft 2010 Fabian Priftaj

Appunti di programmazione in assembly 8088

ConfrontailregistroAXconilvalore50e memorizza l'esitodelconfronto nelregistrodeiflag. 3.7Indirizzamentoimplicito L'operando o gli operandi dell'istruzione sono specificati implicitamente dall'istruzionestessa: PUSHAX PoneincimaallostackilcontenutodiAX,eallostessotempodecrementa ilvalorediSP.

PARTE4,ISTRUZIONIDELL'8088
4.1Trasferimento,copiaearitmetica MOVdest,src L'istruzione pi utilizzata MOV, che specifica una sorgente ed una destinazione. Se la sorgente un registro, allora la destinazione deve essere un indirizzo effettivo. E' possibile anche avere per sorgente un indirizzo effettivo e per destinazione un registro. E' possibile fare riferimentoancheallaparolachiave MOVB, peritrasferimentidibyte.Le istruzioniditrasferimentononhannoalcuneffettosulregistrodeiflag.E' necessarionotarecheleistruzioniditrasferimentonontrasferisconodati, macopianosolamente. XCHGdest,src Quest'istruzione serve a scambiare il contenuto di un registro con il contenuto di un'indirizzo effettivo e viceversa. Esiste anche per questa parolachiavelasuaversioneperiltrasferimentodeibyte,XCHGB. LEAdest,src LEA sta per Load Effective Address, ovvero Caricamento di un indirizzo effettivo.Serveacalcolareilvalorenumericodell'indirizzoeffettivoea memorizzarloinunregistro.(dest=registro,src=indirizzoeffettivo). PUSHopr L'istruzionePUSHserveadinserireoperandiincimaalloStack.L'operando in questione pu essere una costante oppure un indirizzo. In realt ogni volta che si inserisce nello Stack con quest'istruzione, viene implicitamentedecrementatoilvaloredelpuntatorealloStack(SPStack Pointer) di 2 e viene inserito il valore alla nuova locazione in memoria puntatadaSP. POPaddr Rimuove l'operando dallo Stack e lo salva nell'indirizzo effettivo (addr). Anche in questo caso viene modificato il valore del registro SP, il quale vieneincrementatodi2.

Pagina 7

Copyleft 2010 Fabian Priftaj

Appunti di programmazione in assembly 8088

PUSHFopr|POPFaddr EffettuanolaPUSHelaPOPdelregistrodeiflag. XLAT ServeacaricarenelregistroALilbytechesitrovaall'indirizzoAL+BX. E'utileperfarericercherapidenelletabelledidimensioniparia256byte. INeOUT Sonodefinitedall'8088(manonsonoimplementatenell'interpretefornitocon il libro di Tanenbaum). Si tratta di istruzioni di trasferimento da/verso dispositividiI/O. AltreistruzionidellinguaggioAssembly: Operatoriaritmetici Tutte le istruzioni in questo gruppo modificano lo stato dei registri di flag,inbaseall'istruzioneeseguita. ADDa,b Somma:Aggiunge'b'in'a' ADCa,b Sommaconriporto SUBa,b Sottrazione SBBa,b Sottrazioneconprestito MULa,b Moltiplicazionesenzasegno DIVa,b Divisionesenzasegno IMULa,b Moltiplicazioneconsegno IDIVa,b Divisioneconsegno Altrioperatoriaritmetici INCdest Incrementodelladestinazione DECdest Decrementodelladestinazione NEGdest Complementobinario CMP a,b Confrontotraglioperandiaeb CLC Azzeramentodelflagdiriporto Operatorilogici NOTdest Complementologico AND a,b aANDb OR a,b aORb XOR a,b aXORb Operazionidisalto ICC et Saltocondizionato(et:etichetta) 4.2Ciclieoperazioniiterativesustringhe LOOPetichetta DecrementailregistroCXeseilrisultato positivosaltaall'etichetta specificata. LOOPZetichetta Confronta il registro CX con il registro di flag Z per decidere se interrompere l'esecuzione del ciclo. Se DEC(CX) 0 e Z=1 il ciclo si interrompe.

Pagina 8

Copyleft 2010 Fabian Priftaj

Appunti di programmazione in assembly 8088

LOOPNZetichetta Confronta il registro CX con il registro di flag Z per decidere se interrompere l'esecuzione del ciclo. Se DEC(CX)0 e Z=0 il ciclo si interrompe. Esistono anche meccanismi iterativi per il trattamento delle stringhe, disponibili dalle istruzioni REP, REPZ, REPNZ. Queste istruzioni prevedono che il registro SI punti al segmento dati, mentre DI al segmento extra localizzatodall'indirizzoES. 4.3Istruzionidisaltoedichiamata L'operazione di salto pi semplice svolta dall'istruzione JMP che pu contenere come destinazione un indirizzo oppure un etichetta. Esistono due tipidisalti: NEAR (vicino)e FAR (lungo).Sihaunsaltocortoquandola destinazionesitrovanelsegmentodicodicecorrente,chenonpumodificare durante l'esecuzione del programma. In caso di salto lungo invece il contenutodelregistroCS(CodeSegment)vienemodificato. 4.3.1Salticondizionati L'8088ha15istruzionidisaltocondizionato:
JNA(JumpifNotAbove), JBE(JumpifBeloworEqual) JNB(JumpifNotBelow), JAE(JumpifAboveorEqual), JNC(JumpifNotCarry) JE(JumpifEqual), JZ(JumpifZero) JNLE(JumpifNotLessthan), JG(JumpifGreater) JNL(JumpifNotLessthan), JGE(JumpifGreaterorEqual) JO(JumpifOverflow) JS JCXZ(JumpifCXEqualZero) JB(JumpifBelow), JNAE(JumpifNotAboveorEqual), JC(JumpifCarry) JNBE(JumpifNotBeloworEqual),JA (JumpifAbove) JNE(JumpifNotEqual), JNZ(JumpifNotZero) JL(JumpifLessthan), JNGE(JumpifNotGreaterorEqual) JLE(JumpifLessthan), JNG(JumpifNotGreaterthan) JNO(JumpifNotOverflow) JNS

Aldisottoouguale Nonaldisotto

CF=1,ZF=0 CF=0

Zero,Uguale Maggioredi.. Maggioreouguale Overflow Segnonegativo CX=0 Aldisotto

ZF=1 SF=OF,ZF=0 SF=OF OF=1 SF=1 CX=0 CF=1

Aldisopra Diversodazero Minoredi.. Minoreouguale Nooverflow Nonnegativo

CF=0&ZF=0 ZF=0 SFOF SFOF,ZF=1 OF=0 SF=0

Pagina 9

Copyleft 2010 Fabian Priftaj

Appunti di programmazione in assembly 8088

4.4Chiamatedisubroutine L'8088 dispone di un'istruzione per la chiamata di procedura, detta anche subroutine.Analogamentealleistruzionidisalto,ancheperlesubroutinesi fadistinzionetra chiamatevicine e chiamateadistanza (NEAR e FARCALL). L'interpretediTanenbaumimplementasolole NEAR CALL.Ladestinazionepu essereunetichettaoppureunindirizzo.Iparametridellasubroutinedevono essereinseritinelloStackinordineinverso.Dopoil PUSH degliargomenti si esegue l'istruzione CALL, che comincia con l'inserire sullo Stack il valorecorrentedelregistroPC,persalvarel'indirizzodiritorno(inmodo dariprenderel'esecuzionedelprogrammaalterminedellasubroutine). L'istruzioneRETrecuperailvecchiovaloredelregistroPCdalloStackelo scrive all'interno del PC, cos l'esecuzione riprende dall'istruzione successivaallaCALL. Gliargomentidevonoessereaccessibiliallasubroutinepercui,ingenere, l'iniziodiunanuovasubroutineiniziaconil PUSHdelBP(BasePointer),e successivamente si copia il valore corrente di SP in BP. Cos facendo l'indirizzobasepuntaalsuovaloreprecedente,el'indirizzodiritornosi trova alla posizione BP+2, mentre il 1 e 2 argomento si trovano rispettivamenteagliindirizziBP+4eBP+6. Al ritorno da una subroutine necessario copiare il puntatore base nel puntatore allo Stack, effettuare la POP del vecchio BP ed infine eseguire l'istruzioneRET. 4.5Chiamatedisistemaesubroutinedisistema Questeroutinepossonoesserechiamateconlasequenzadichiamatastandard: PUSHdegliargomentisulloStackinordineinverso PUSHdelnumerodichiamatacheidentificalasubroutine sieseguel'istruzioneSYSsenzaparametri Irisultatisonoinseritiall'internodelregistro AX,oppurenelregistro DX:AXnelcasoilrisultatosiaunlong. Suggerimento: per comodit possibile definire all'inizio del programma alcune costanti per i nomi delle chiamate di sistema, in modo da poterle chiamarepernomeinvecechepernumero. OPEN*fname,0/1/2 Questocomandoserveperl'aperturadiunfile.Prendecomeprimoargomento l'indirizzodellastringacontenenteilnomedelfile.Ilsecondoargomento stabilisce la modalit di accesso al file: (0=lettura, 1=scrittura, 2=lettura/scrittura). Se il file aperto in scrittura ma non esiste, la funzioneprovvedeacrearlo. CREAT*fname,0/1/2 Lachiamata CREAT creaunfilevuotoconipermessispecificatidalsecondo argomento. La funzione OPEN e CREAT restituiscono entrambe un intero (come risultato dell'operazione) all'interno del registro AX; questo numero viene detto descrittoredifile epu essereusatoperlalettura,scritturaochiusura delfile.Incasoildescrittoredifile negativo,indicaunerrorenella

Pagina 10

Copyleft 2010 Fabian Priftaj

Appunti di programmazione in assembly 8088

chiamatadiroutine. READfd,buffer,nbytes WRITEfd,buffer,nbytes LechiamateREADeWRITEhanno3argomenti:ildescrittoredifile,unbuffer per i dati e il numero di byte da trasferire. Siccome lo Stack usa la politicaLIFOalloranecessarioinseriregliargomentiinordineinverso: PUSHdelnumerodibytedaleggere/scrivere PUSHdell'indirizzodelbuffer PUSHdeldescrittoredifile PUSHdelnumerodichiamatacheidentificalaroutine(READoWRITE) CLOSEfd Questa chiamata serve a chiudere un file. Richiede solo il descrittore di file,erestituisceilvalore 0 all'interodelregistro AX perindicareche l'operazionehaavutosuccesso. EXITstatus InseriscesulloStacklostatodiuscitadelprocessoenonrestituiscealcun valore. LSEEKfd,offset,0/1/2 Modificailpuntatoredilettura/scritturadiunfilegi aperto.Ilprimo argomento il descrittore di file, il secondo argomento un dato long percivascompostonelledueparolechelocostituisconoevainseritonello Stack per prima la met pi significativa (anche nel caso in cui l'offset fosse contenuto tutto nella met meno significativa). Il terzo argomento indicaseilpuntatoredilettura/scritturavacalcolato:(0=all'iniziodel file,1=allaposizionecorrente,2=allafinedelfile).Ilvalorerestituito lanuovaposizionedelpuntatorerelativaall'iniziodelfile,memorizzato comelongneiregistriDX:AX. GETCHAR Lafunzioneleggeuncaratteredall'inputstandard,losalvanelregistroAL eazzeraAH.IncasodifallimentoilregistroAXvale1. PUTCHARchar Scriveunbytesullostandardoutpute,incasodisuccessorestituiscelo stessobytescritto,mentrerestituisce1incasodifallimento. PRINTF*format,arg Stampa informazioni formattate. Il primo argomento l'indirizzo della stringa.Performattarel'outputsonopresentideicaratterispeciali: %dnotazionedecimale %xnotazioneesadecimale %onotazioneottale %snotazionedistringa Ad esempio la stringa %d indica che l'argomento successivo un intero, presente sullo Stack, e che dovr essere convertito in notazione decimale primadellastampa. SPRINTFbuffer,*format,arg Inquestocasolafunzionericeveininputunbuffer,checontienelastringa chedovrstampatasullostandardoutput.Glialtriargomentisonoglistessi

Pagina 11

Copyleft 2010 Fabian Priftaj

Appunti di programmazione in assembly 8088

dellaPRINTF. SSCANFbuffer,*format,arg Questa funzione il contrario della funzione PRINTF. Legge gli argomenti contenuti nel buffer seguendo il formato specificato all'indirizzo format secondogliargomentiarg.

PARTE5,ASSEMBLATOREas88
5.1Introduzioneall'assemblatore Per la memorizzazione del codice e dei dati all'interno di un file .s, l'assemblatoreusa3sezionidiverse: .TEXT(perleistruzionidelprocessore) .DATA(perladichiarazionedivariabiliinizializzate) .BSS(perladichiarazionedivariabilinoninizializzate) Ci sono due tipi di etichette, quelle globali (costituite da caratteri alfanumericiseguitedalsimbolo:)equellelocali(costituitedaununico carattereseguitodalsimbolo:). Tutti gli identificatori del linguaggio sono definiti dai loro primi 8 caratteri:adesempioBLOCKSIZEeBLOCKSIZZsonolostessosimboloBLOCKSIZ. I valore numerici possono essere ottali, decimali (iniziano con 0), esadecimali (iniziano con 0x). Gli operatori logici sono & ^ ~ per le operazioni bitabit di AND, OR, NOT. Le espressioni possono contenere parentesi quadre, ma non tonde, per evitare di fare confusione con le modalitdiindirizzamento. Vediamoalcunedelleparolechiavimesseadisposizionedalassemblatore: .SECT.TEXT rappresentalasezionedelleistruzioni .SECT.DATA indicalapartedeidatiinizializzati .SECT.BSS partedeidatinoninizializzati .BYTE definisceunasequenzadibyte .WORD definisceunasequenzadiword .LONG definisceunasequenzadilong .ASCIIstrsalvastrsenzainserireilcaratterediterminazione .ASCIIZstrsalvastrinserendoilcaratterediterminazione .SPACEn incrementoilcontatoredilocazionidinposizioni .ALIGNn allineailcontatorediloc.allaloc.chedistanbyte .EXTERN identificaunnomeesterno Ladefinizionedistringheconsentel'usodicaratteridiescape,tracui: \nInvioacapo \tTabulazione \\Backslash \bBackspace \fAvanzamentomodulo \rRitornoacapo \Virgolette

Pagina 12

Copyleft 2010 Fabian Priftaj

Appunti di programmazione in assembly 8088

L'assemblatore as88 modellatosugliassemblatoristandarddiUNIX,ecome taledifferenziadaglialtriassemblatoriperl'8088: MASM (diMicrosoft)e TASM (di Borland), entrambi progettati per sistemi DOS. MASM e TASM supportanoentrambii3modellidimemoriaresidisponibilidall'architettura 8088: tiny,tuttoilcodiceeidatidevonoesserecontenutiin64Kb. small,ilsegmentodicodiceedatipossonoraggiungereciascunoi64Kb. large,ammettepisegmentiperilcodiceeperidati. L'assemblatoreas88usaunmodellodimemoriachesomigliaalmodellosmall, anchesequando usatosenzailtracer,pu gestireiregistridisegmento senzarestrizioni.

PARTE6,ESEMPIODIPROGRAMMAZIONEASSEMBLY
6.1EsempiodiHello,World! Analizziamo un semplice programma in linguaggio Assembly, in grado di stamparesull'outputvideoiltestoHelloWorld

_EXIT =1 _WRITE =4 _STDOUT =1 .SECT.TEXT start: MOV CX,dehw PUSH CX PUSH hw PUSH _STDOUT PUSH _WRITE SYS ADD SP,8 SUB CX,AX PUSH CX PUSH _EXIT SYS .SECT.DATA hw: .ASCII"HelloWorld\n" de: .BYTE0 .SECT.BSS

!1 !2 !3 !4 !5 !6 !7 !8 !9 !10 !11 !12 !13 !14 !15 !16 !17 !18 !19 !20 !21

Pagina 13

Copyleft 2010 Fabian Priftaj

Appunti di programmazione in assembly 8088

DETTAGLI L'istruzione.SECT.TEXTnellariga4specificachelerighesuccessivesono delleistruzionialprocessore.Analogamentela riga17 indicachelerighe sottostantifannopartedellasezionedellevariabiliinizializzate. Lariga19inizializzaunastringadidatida12byte,compresilospazioeil caratteredifineriga(\n). Lerighe5,18e20contengonodelleetichette,riconoscibilidallapresenza delsimbolo:.Questeetichetterappresentanovalorinumerici,percuisono similiadellecostanti;tuttaviailvalorenumericononpuesserestabilito apriori,edquindicompitodell'assemblatorecalcolarlo. L'etichettastartvale0,mailvalorediuneventualeetichettaall'interno dellasezione.TEXTdipenderebbedalnumerodibytechelaprecedono. Nellariga6sihaladifferenzadidueetichette.Questariga equivalente all'istruzioneMOVCX,12,conladifferenzacheinquestocasoilcalcolo della lunghezza della stringa lasciato al programmatore, mentre nell'esempiocompitodell'assemblatorefarlo. Le righe da 7 a 11 mostrano l'istruzione equivalente alla funzione in C: write(1, hw, 12), dove in questo caso il primo parametro indica il descrittore di file per lo standard output (1), il secondo parametro l'indirizzo della stringa (hw), ed il terzo parametro rappresenta la lunghezzadellastringa(12). La riga10 impilasulloStackilnumerodellachiamata write ela riga11 effettualachiamata. Lariga12ripristinailpuntatorealloStack(SP)allaposizioneprecedente allachiamata.Sel'operazionediscritturahaavutosuccessoilnumerodi bytescritticontenutonelregistroAX. La riga13 sottraeilrisultatodellachiamatadella riga11 alvaloredel registroCXperstabilireselachiamatahaavutosuccesso.Diconseguenza, lostatodiuscitadelprogrammasar0soloincasodisuccesso.Lerighe14 e15preparanol'esecuzioneperlachiamatadisistema exit,impilandosullo Stacklostatod'uscitaeilcodicedellafunzioneEXIT.

Pagina 14