Curso de Assembler

Embed Size (px)

DESCRIPTION

Curso de programación en Aseembler

Citation preview

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 1/16

    CursodeAssemblerBy:GerardoRicharte

    HolaGente!

    Porfinmemandeaescribiralgosobreesto,quieroagradecerlesespecialmentea

    ArielNardelli FedericoJoselevichMauricioTaslik DiegoPazGastnSanchez NicolaiKuzminskiEduardoArias FernandoBardelliLuisMamud JuanEstevaPabloRotzyld FabinBenavidez

    Porhaberseprendidodeentradaenestaidea,yporhaberhechosugerencias,yporhabermehechodecidirme.!!!

    Bueno,Mmmm...

    Vamosaempezarporalgoquequizsmuchosyasepan,perocomoesindispensable,igualselotengoquecontar:

    LaMemoriadeLasPC:

    Comoyasabrn,dehaberescuchadoporah,hayvariostiposdememoria,laMemoriaBase,laMemoriaExpandida(EMS),MemoriaExtendida(XMS),UpperMemoryBlocks(UMB),HighMemoryArea(HMA)yunmontnmasdereferenciasadistintostiposdememoria,loquelesvoyacontaresquedireccindememorialecorrespondeaunBytedentrodelprimerMegaByte,esdecir,dentrodelamemoriabase(0640K)yenlazonadondeestnlasplaquetasdeexpansin,Monitor,BIOSROM,readelacontroladoradeDisco,etc...

    TratemosdeacostumbrarnosaverlosnmerosenHexadecimal(base16).Losdgitosquepuedenformarunnumeroenestabase,son:0,1,2,3,4,5,6,7,8,9,A,B,C,D,EyF,tomandovaloresenesemismoorden,el0vale0ylaFvale15.Deestaformaunnumero,porejemplo0FA3h(la'h'finalindicaqueestaen'Hexa'),expresadoendecimalvaldra(3)+(Ah*16)+(Fh*16*16)+(0*16*16*16),oloqueeslomismo3+160+3840+0=4003,pongmonosdeacuerdoquecuandounnmeroloescribimosenHaxaleponemosla'h'alfinal,ysicomienzaconunaletra,leagregamosun'0'adelanteparanoconfundirnosconunnombredevariable.EstofueunabreveperonecesariaintroduccinalsistemaHexadecimaldenumeracin.

    Ahorasi,veamoscomosedireccionalamemoriadeunaPC.

    Tengamosencuentaquesiqueremosdireccionar1Mbnoshacenfalta5dgitoshexadecimales,esdecir,poderescribir,dealgunaforma0FFFFFho100000h1quees1*16^5=1Mb(1queseresta,correspondealbyte#0).Comolos80x86tienenregistrosde16bits(8bits=1Byte,16bits=1Word)o4dgitoshexa,solopodramosllegaradireccionar

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 2/16

    0FFFFhbytes,loquesignifican64Kbsolamente(deaqulalimitacindelos.COMs).Loquesehaceesutilizardosregistrosalavezparaapuntaraunsolobyte,loquenosampliaelcampoapoderdiferenciar0FFFFh:0FFFFhbyteso1MgdeMbmuchsimo!Entonces,Quepasaquenosepuedetenertantamemoriasinhacercosasextraas?Claro,loquepasaesqueparadireccionarseusandosregistros,peronoubicadosunoalladodelotro,sinodesplazadosundgito.Que?Si,yasequeestaconfuso,ahoratecuento:

    EnunRegistro,digamosquesellamaDS,esta0040h,yenotro,digamosBS,hay006Ch.LadireccinalaqueapuntaDS:BS(asseescribe)es0040:006C,peroestadireccin,ennmerosde5cifrasseescribe0046C,laconversinessimplsima,loquehayquehaceressumarlosregistrosdelasiguienteforma:

    BS>006CDS>+0040DS:BS>0046Ch

    Deestasuma,unosepuededarcuentaqueparareferirseaunamismaposicindememoriapuedehabermuchasformasdistintas.

    Porejemplo,parareferirsea0046C,sepuedehacer:

    000C046C+0046+00000046C=0046:000C0046C=0000:046C

    023C005C+0023+003F0046C=0023:023C0046C=003F:005C

    Esdecir,puedehabermuchasformasdenombrarelmismobyte,ytenemosquetratardeacostumbrarnosadarnoscuentaque,porejemplo,0F000:1234y0F123:0004sonequivalentes.

    Tenemosqueunadireccindememoriaseseparaendospartes,ladelaizquierdadel':'eselfamosoSEGMENTosegmentoylodeladerechaeselOFFSETodesplazamiento,deunadireccin.

    Conclusin:ParareferirnosacualquierPosicindeMemoriaesnecesarioconocersuSegmentysuOffset,yaquesabiendounosolo,nospodemosestarrefiriendoamuchosbytesdistintos.

    AlgunasPosicionesdeMemoriatiles:

    de0000:0000a0040:0000latabladepunterosdeinterrupciones.CadapunterotomadosWords(unDWord)elprimeroparaelOffsetyelsegundoparaelSegment.en0040:0000WordElnumerodePortcorrespondientealCOM1en0040:0002WordElnumerodePortcorrespondientealCOM2

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 3/16

    en0040:0004WordElnumerodePortcorrespondientealCOM3en0040:0006WordElnumerodePortcorrespondientealCOM4en0040:0027ByteStatusdelasteclasespeciales.en0040:0049ByteElmodoactualdevideo.en0040:006CDWordLahoraactual,primeroelwordmenossignificativoyluego,en40:(6C+2)elmassignificativo.Elnumeroes18.2veceslahora.

    apartirdeB000:0000LamemoriadevideodelaHrcules(Texto&Grficos)apartirdeB800:0000Lamemoriadevideodelasotras(Texto&AlgunosGrficos)

    Muchasmasposicionesdememoriasepuedensacardevarioslugares,dondeyosiemprebuscoesenASM.NG(NortonGuidedeAssembler)yen2MchNfo2,(TooMuchInfoTwo)comonopodaserdeotramanera.:)

    Nota:SiunDWordesYYYYXXXX,elWordmenossignificativoesXXXX,yelmassignificativoesYYYY.SiunWordesYYXX,elBytemassignificativoesYYyelmenossignificativoesXX.

    Paraprobarlasposicionesdememoria,desdepascalpuedenhacer:

    IfMem[$0040:$0049]=7Then{ModoTexto}paraleerunbyte(el'$'significaHexa)Mem[$B800:(Columna+File*80)*2]:='A'ParalaletraMem[$B800:(Columna+File*80)*2+1]:=WhiteParaelatributoMemW[$0040:0000](oMemW[$40:0])paraunWordMemL[$40:$6C]paraunLongInt(oDWordSignado)

    DesdeC:

    if(peekb(0x0040,0x0017)==7){/*ModoTexto*/}paraunbyte(ochar)pokeb(0xB800,(Columna+File*80)*2,'A')Paralaletrapokeb[0xB800,(Columna+File*80)*2+1,WHITE)Paraelatributopeek(0x40,2)ypoke(0x40,2)paraunint(WordSignado)

    yparaunDWordhayquehacerun#defineporqueelCnotrae:

    #definepeekpokel(seg,ofs)(*(unsignedlongfar*)(MK_FP(seg,ofs)))

    ahorasi:

    if(peekpokel(0x40,0x6C)==0x0F0342034){}ypeekpokel(0x40,0x6C)=0paraunDWord

    Muybien,ahorayasabemosquelamquinatienememoriaytambinsabemoscomoapuntaraunaposicinenestamemoria,perobueno,estecursoesdeAssembler,nodememorias,porlotanto,lointeresanteyapropiadoseraquelescomentara,ascomosidepasadafuera,comosehaceenAssemblerparacargarograbaralgodesdeohacialamemoria.Pero,primerohayquesaberotrascositas...Noestanfcillacosa...Al"hablar"enAssembler,estamosdicindolealamquinaenlomascercanoasuidiomaposible(yaquesuverdaderoidiomaesde"1"y"0"totalmente)loquetienequehacer.Estamoshablandodirectamente,nosotrosmismos,sinlaayudadeuntraductor

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 4/16

    (compilador),conelcerebropropiamentedichodelamquina.Estamoshablandoconelvendito80x86.Entoncesparadecirlealgotenemosqueconocerlounpocomas.Comoesmuyprobablequemuchostengan8086/88o80286vamosaverespecialmente,laestructurainternadeestos"micros"(microprocesadores),porarriba,sololonecesarioparaprogramarenassembler,obviamentetambinsirveparalosiluminadosquetengan386o486,oquizs586oP5.Internamentetodoslosmicros(entiendoquetodos),tieneunaspocasvariables,llamadasREGISTROSquesonendondeseprocesanlosdatos,sehacenoperacionessonporlascualessepuedeaccederamemoria,etc.Sirvenparatodo.Peronotodassirvenparalomismo,yaunquemuchassiseanintercambiables,todasestndestinadasparaalgoenespecial,ytienenunaqueotrafuncinpropia.Losregistrosdelafamilia80x86son:

    AX AcumulatorRegister AcumuladorBX BaseIndexRegister IndiceBaseCX CounterRegister ContadorDX DataRegister DatoSI SourceIndex IndicedeOrigenDI DestinationIndex IndicedeDestinoBP BasePointer PunteroBaseSP StackPointer PunterodePilaIP InstructionPointer PunterodeInstruccionesCS CurrentSegment SegmentoActualdelProgramaDS DataSegment SegmentodeDatosES ExtraSegment SegmentoExtraSS StackSegment SegmentodePila

    FlagsSealizadoresdeEstado:

    Todosestosregistrossonde16bits,esdecirdeunWord.PerolosregistrosqueterminanenX(AX,BX,CX,DX)puedensermanejados,tambin,comosifuerandosBytes(Queloson),porseparado,susnombresson,AHparaelBytemassignificativodeAXyALparaelmenossignificativo,BHyBLparaBX,CHyCLparaCXyDHyDLparaDX(laHylaLhacenreferenciaa"Hi"y"Lo",esdecirAltoyBajo,altoessinnimodemassignificativoybajodemenos.Siporejemplo:

    AX=437AhEntoncesAH=43hyAL=7AhBX=0145hBH=01hyBL=45hCX=0AABBhCH=0AAhyCL=0BBhDX=1hDH=00hyDL=01h

    Deigualmanera,si:

    AL=10hyAH=32hAX=3210hBL=08hyBH=0CAhBX=0CA08hCL=1hyCH=1hCX=0101hDL=00yDX=00DX=0000h

    Estoscuatrosonlosnicossegmentosquesepuedensepararenbytealtoybytebajo.

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 5/16

    Funcionesespecificas:

    AX,Acumulator:Sirveparahacertodaslasoperacionesaritmticas,yalgunas,comoMultiplicaryDividir,lesonexclusivas.AX(yALporsuversindeunsolobyte)sonlosnicosregistrosquepuedensermultiplicadosydivididosporotroregistro.LarestadeAXyAL,porejemplo,ocupanunbytemenosqueladecualquierotroregistro,peroestonoesparapreocuparse,unbyte,realmentenoesnada,pormasqueseacumule.

    BX,BaseIndex:Sirveparaserusadocomoregistrodebaseparaunndiceoarray,esdecir,unaposicindememoriapuedeserapuntadaporBX(suoffset),igualmentetambinselopuedeusarparahacersumasrestasytodotipodeoperacioneslgicas.AX,CXyDXnosirvenparaapuntaramemoria.

    CX,Counter:Eselregistroreservadoparacontar,comosunombreloindica.Paraestepropsitohayrdenesespecialesquelodecrementanoincrementanyhacenalgosegnelresultado.Tambinhayciertasrdenesrepetitivasquenecesitansabercuantorepetirse,pormediodeCX(oCLensuversinByte)selesindica.

    DX,Data:Esteregistronotienedefinidounuso,engeneralesutilizadoparapasarciertosparmetros,perosicumpleunafuncin,porejemploenlamultiplicacin,sisemultiplicaAX=1000h(unWord)por,simplemente10h(unByte)elresultadoes00010000h(UnDWord),entonces,elWordAltodelresultadodelamultiplicacinsedepositaenDX,yelBajoenAX.

    SI,SourceIndex:Puedeserutilizadocomondiceaposicionesdememoria,esdecirsepuedeponerunnmeroenSI(Offset)yleereldatodeestaposicin.Peroalaveztieneunafuncinespecfica,ladeRegistroFuenteparalasrdenesdetratamientodecadenas.HayciertasrdenesenAssemblerquesonpara,porejemplomovertodaunacadenadebytes,deunlugaraotro,ladireccindelacualseleenlosbytesseponeenSIantesdedecirquelea.

    DI,DestinationIndex:ComoSI,puedeserusadocomondice.PerosufuncinespecficaesladeRegistrodeDestinoparalasoperacionesdecadena,loqueseleedeelcontenidodeSI(nodeSImismo,sinodelaposicindememoriaalaqueapuntaSI)esdepositadoenlaposicindememoriaalaqueapuntaDI,expresadapor[DI].Allavez,igualqueconSI,sepuedenhaceroperacionesaritmticassimples(sumayresta),ytambintodotipodeoperacioneslgicas(AND,OR,XOR).

    BP,BasePointer:Punteroaunaposicindememoria,muyparecidoaBX,perogeneralmenteusadoparafacilitarelpasajedeparmetrosenfuncioneshechasconlenguajesdealtonivel,porunacaractersticapropiaqueyavoyaexplicar.

    SP,StackPointer:PunteroqueindicaenqueOffsetterminaelStack,opila.ElStack,esunreadelamemoriaprincipaldelamquina,(noestadentrodelMicro,nitampocoesfija)quesirveparapreservarcosas,laestructuradelStack,queyaexplicaremasafondo,essimple,estaestructuraesllamadaLIFO(LastInFirstOut)oloqueeslomismo,loltimoqueentra,esloprimeroquesale,escomosituviramosunapiladecosas,loltimoqueapoyamosarribavaaserloprimeroquepodamossacardespus.Sinoestaclaro,nosepreocupen,yavoyaexplicarlobien,yvoyadecirparaqueseusa,ycuando.

    IP,InstructionPointer:ElpunterodeinstruccineselqueleindicaalMicrocualvaaserla

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 6/16

    prximainstruccinquedebeejecutar(SoloelOffset).ElprogramaenAssemblertieneunaestructuralgica,lacualsepuedeseguir.IPcomienzaalprincipiodelprograma(laprximaordenquesedebeejecutareslaprimeradelprograma),seejecutaesaordeneIPesincrementadotantocomoBytesocupelaordenrecinejecutada(notodaslasrdenesocupanunbyte)luegosigueconlaprximayassucesivamente.SipudiramosdealgunaformacambiarelcontenidodeIPloqueestaramoshaciendoseriaunadesviacin,ounJump(salto)aotroladodelprograma,yefectivamentesepuedehaceresto,peronodiciendoIP=1234h,sinohaciendounsalto,queesequivalenteaestoltimo:JMP1234h.Yalovoyaexplicar,estotambin.

    Sehabrndadocuenta,quesiemprequedijequeapuntabaaunaposicindememoria,hicenotarquesoloeraelOffsetloqueestabacomprendido,porejemploenDIoSI,BXoSP.Peroentonces,comoesposiblequeconsolamenteeloffsetalcanceparaidentificarunaposicindememoria?siyomismodije:

    "ParareferirnosacualquierposicindememoriaesnecesarioconocersuSegmentysuOffset,yaquesabiendounosolo,nospodemosestarrefiriendoamuchosbytesdistintos."

    Bueno,acestalacuestin:

    CS,CurrentSegment:EselSegmentoactualdeejecucin,juntosCS:IPapuntanalaprximaordenqueelMicrodebeleerparaejecutar.Veamosalgo:

    CS:IP=1000:FFFAhayunaordenentoncesIPseincrementa:CS:IP=1000:FFFEQuepasasiahorahayotraorden,eIPseincrementadenuevo?

    Fcil:FFFE+1=FFFFperoFFFF+1=10000!!!

    Quepasaenestecaso?CSnoseincrementa,eIPnopuedecontenerunnumerode5cifras!LoquepasaesqueIPvuelvea0000yelprogramasigueenCS:IPosea1000:0000,loqueesunaposicin64kmasbajadememoria,oseacualquierlado...Esteeselproblemaporloquelos.COMsnopuedentenermasde64kdelargosinhacernadararo(cambiarCScuandoseanecesario).

    DS,DataSegment:EselsegmentodestinadoaserusadojuntoconBX,SIyDIparaapuntaraunadireccindememoria.TambinpuedeserusadoconBPySP,perohacefaltaexpresarloconcretamente.(Masadelanteaclaroesto)

    ES,ExtraSegment:EsunsegmentoExtraparaserutilizadocuandohagafalta.Tambintieneunafuncinpropia:JuntoconDIindicaneldestinoenlas"rdenesdecadena"(eldatoledodeDS:SIespuestoenES:DI,enlasordenesdemovimiento).

    SS,StackSegment:ElsegmentodeStackjuntoconSPapuntanalaltimaposicinquefueutilizadapara"depositar"datosenelStack.

    Porultimo:

    Flags:Esunregistroespecialenelcualseguardanlosresultadosdelaltimaoperacinmatemticaodecomparacin.Noseguardanlosresultadosnumricos,sololosdeestado,esdecir:

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 7/16

    CF CarryFlag BanderadeporAcarreoPF ParityFlag BanderadeporParidadAF AuxiliaryFlag BanderaAuxiliarZF ZeroFlag BanderaporCeroSF SignFlag BanderadeSignoTF TrapFlag BanderadePasoSimpleIF InterruptFlag BanderadeInterrupcinDF DirectionFlag BanderadeDireccinOF OverflowFlag BanderaporSobreflujoIOPL I/OPrivilegeLevel Soloen286osuperiorNT NestedTaskFlag Soloen286osuperiorRF ResumeFlag Soloen386osuperiorVM VirtualModeFlag Soloen386osuperior

    HastaaqulaexplicacindelosregistrosinternosdelMicro.

    Paraapuntaraunaposicin,hacefaltaindicarsuOffsetysuSegment,estosehacemedianteunregistrodesegmento(DS,CS,SS,ES)yunOffset,quepuedeserunnmeroounregistrocomoBS,SI,DI,BP,SP:

    DS:[3304h]ApuntaalSegmentDSyaloffset3304h.Loscorchetesindicanqueloquesequiereeselcontenidodeesaposicin,nolaposicinensi.

    ES:[BX]IndicaalaposicinqueestaenelSegmentoDSyelOffsetBX.

    SS:[SP]IndicalaposicindearribadetododelStack,apuntadaporelSegmentoSSyelOffsetSP.

    NosiemprehacefaltaindicarelSegmentalqueseapunta.ComoelsegmentDSeseldestinadoparaponerlosdatos,lagentedeInteldecidiquesinoseespecificasegmentoparaunoffsetabsoluto(unnmerocomoelprimercaso),oparalosregistrosBS,SIyDI,seasumeDS.ParalosregistrosSPyBP,seasumeSScomoSegmentopordefecto.Entonces:

    [1304h]IndicaelcontenidodeDS:[1304h][BX]ApuntaaDS:[BX],peroES:[BX]ApuntaaES:[BX],porqueseespecificaESES:[0017h]>aES:[0017h][SP]>aSS:[SP]CS:[SP]>aCS:[SP]CS:[DI]>aCS:[DI]SS:[SI]>aSS:[SI][SI]>aDS:[SI][DI]>aDS:[DI][BP]>aSS:[BP]ES:[BP]>aES:[BP]

    Esdecir,cualquiercombinacindeSegmentoyRegistrondiceoBaseoOffsetAbsolutopuedeserformada,peronosiemprehacefaltaaclararelSegmento.

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 8/16

    HastaahoravimosqueenlosmicroprocesadoreshayvariablesllamadasREGISTROS,quecadaunoestadestinadoaunafuncinespecial,peroqueengeneralsedividenendosgrandesgrupos,losregistrosdeusogeneral,pordecirlesdealgunaforma,ylosexclusivamenteparaserusadoscomosegmentos.VamosavercomoesunprogramaenAssembler,peroantes,quieroaclararqueesunAssembler.

    Assembler,propiamentedicho,eselprograma(TASM,MASM,A86,etc.)queseocupadetransformarloquenosotrosescribimos,enpalabras,sepodradecir,anmero,queesloquerealmenteentiendelamquina.Enrealidad,loconvierte,actualmente,enuncdigoobjeto,.OBJ,queesunaherramientaquesecreoparapoderuniroLinkearvariasrutinashechasendistintosmomentosy/olenguajes.LoquecompletaelprocesoeselLinker,TLINK,LINK,OPTLINK,BLINKER,etc.Loqueyouso,particularmente,sonelAssembleryLinkerdeBorland,elTASMyelTLINK,perobueno,sialguienquiereusaralgunomas,escosadedarsemaa,opreguntarquehayquecambiar.

    Primero,paracomenzarporalgofcil,yparaqueporfin,deunavezportodas,puedancomenzarahaceralgo,vamosahacerun.COM,eslomassimple,masrpido,ymasfcilderecordar.

    EnTASM,hacerun.COMsesimplificamucho,selimitaaponeralprincipiodelprograma:

    EJEMPLO.ASM:

    .MODELSMALL;Tipo.COM,estemodelodememoria;significaqueSS,DS,ESyCSsonigualesal;comenzarelprograma.Yquelosdatosyelstack;estnsobreelmismosegmentoperoclaro,en;distintooffset..CODE;ParadecirlealAssemblerqueaqu;comienzaelcdigo.Enotrosmodelos,como.HUGE;hayquedefinirlapartededatos,con.DATAy;lapartedeStack,con.STACK.ORG100h;Estaorden,paraelcompiladortambin;ledicequecomienceelprogramaeneloffset;100h.Todoslos.COMsdebencomenzarenel;offset100h.Masadelantevoyaexplicarbienel;funcionamientodeestaorden.

    ;Yluegocompletarelprogramaconloquesea.

    EJEMPLO:;Estaesunaetiqueta,esunnombreque;seledaaunaposicinpara,luego,poder;referirnosaellaporsunombre.Estaesuna;ayudaquenosdaelAssemblerparanotenerque;referirnosanmerostodoeltiempo.Achace;faltaparaqueelcompiladorsepaquetodo;comienzaall.Noesnecesarioqueseaelnombre;delprograma,puedesercualquierotracosapero;yoacostumbroesto.

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 9/16

    ;LaordenMOV(MOVE),llevadosparmetros.Lo;quehaceescopiarelcontenidodelsegundo;parmetroalprimero

    movdi,offsetmensaje;Estaorden,significaponerenDIeloffsetde;laposicinquerepresentamensaje.(mirarmas;abajoparavermensaje).;DI=OffsetMensaje

    Repetir:;Pongoun'label'oetiqueta,para;usarloluego.

    moval,byteptr[di];PongoenALelcontenidodelaposicinque;indica[DI].;Recordemosque[DI]solo,significaDS:[DI],;porqueelsegmentoporomisinparaDIesDS.;Con'byteptr'indicoqueDS:[DI]esun;punteroaunBYTE.AL=DS:[DI]

    addal,40h;lesumoaAL40h.;AL+=40h(AL=AL+40h)

    movbyteptr[di],al;PongoenDS:[DI](loqueapuntaDS:DI)el;contenidodeAL.DS:[DI]=AL

    incdi;IncrementaDIen1.;DI++(DI=DI+1)

    cmpal,'$';!!!ComparaALcon'$',esdecir;conelvalorASCIIde'$'.Elresultadodela;comparacinesguardadoenlosflagsdelmicro.;AL??'$'

    jneRepetir;Saltasielresultadodelaltima;comparacinfuequesoniguales.;JumpifNotEqual.Sinoeranigualessaltaa;Repetir,ellabelquehabamospuestoal;principio.AL=='$'?GoRepetir

    movah,09h;PongoenAHun09h;AH=09h

    movdx,offsetmensaje;DX=OffsetMensaje

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 10/16

    int21h;!!!EjecutolaInterrupcin21h

    movax,4c00h;AX=4C00h

    int21h;INT21h

    Mensajedb08h,2Fh,2Ch,21h,0E1h,0E1h,0E1h;Acaestoydefiniendounalistadenmeros,;cadaunoesunbyte.(DB=DefineByte).El;primerbytedelalistaestabajoelnombre;mensaje.Tambinpodrahaberpuesto:;Mensajedb'Eldaestalindo!';Setomacadacaractercomounbyte.

    db0CDh,0CAh,0E4h;Estalneaeslacontinuacindelaanterior.;EsnecesariovolveraponerDB.

    ENDEJEMPLO;Conestaorden,ledigoal;assemblerquemiprogramaterminaac.;ElnombredespusdeENDtienequeserel;mismodelprincipio.

    Dentrodeestecdigohay,fundamentalmente,dostiposderdenes:LasordenespropiamentedeAssembler.(MOV,CMP,JNE,INT,ADD,INC)Ylasrdenesalcompilador,queledicencomotratarelarchivo.(.MODEL,.CODE,END)

    Porotrolado,estnlasvariablesylabels,quesonayudasquenosdaelcompilador.Siestonoexistieratendramosquerecordar,envezdelnombredeunavariable,suposicin,yademstendramosquecalcularlaamano.Detodoestoseocupaelcompilador(ensamblador).Esteprograma,funcionayhacealgo,pero,claro,notodoestansimple.Tratendeanalizarloantesdeejecutarlo,paraesovananecesitarunalistadeinterrupciones.Sinolatienen,vayanconsiguindola,casitodoprogramaenassemblerseaprovechadelasinterrupciones.Tenganencuentaqueenun.COM,alcomienzo,DS,ES,CSySStienenelmismovalor,yclaroqueloconservananosserqueselocambiemosnosotros.

    Conestosbsicosconocimientosyasepuedenirdandomaaparahacerotrascosas,tratendeversilessalealgo.Piensenquequierenhacerycomo,sihayalgoquenoselesocurre,tratenotravez,queesaeslamejorformadeaprender,tratarhastaquesalga,sinolessale,pregunten,queporestavezpuedepasar...:)

    Acestaloquevananecesitar,sobrelasinterrupcionesqueusaelprograma.

    INT21DOS1+WRITESTRINGTOSTANDARDOUTPUTAH=09hDS:DX>'$'terminatedstring_______________________________________________________

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 11/16

    INT21DOS2+"EXIT"TERMINATEWITHRETURNCODEAH=4ChAL=returncode_______________________________________________________

    Interprtenlocomolesparezca,paraquesevayanacostumbrando,vio?

    AnteriormentehicimosunCOM.EnAssembler,entrehacerunCOMounEXE,casinohaydiferencia,yaquetodolotenemosquehacernosotrosexplcitamente,elcompiladorseocupasolamentedelobsico.Lesdijequeparahacerun.COM(siempreenTASM),lomasfcilesponer:

    .MODELTINY

    .CODEORG100h

    NomProg:ENDNomProg

    EntreelLabel"NomProg:"yelfindelarchivo"ENDNomProg",hayqueponertodoelcdigodelprogramaensi.Masadelantevamosaverquesignificacadaunadeestascosas,ycomocambiarlasparacrearEXEsdedistintostipos,porahora,recurdenlasparapoderprobarsuscositas.

    Comoentodolenguaje,ademsdesabercomoprogramarhayquesaberlasrdenes,parapoderdecirlequehaceralamquina.Yovoyairexplicandodeapocotodaslasrdenesquesemeocurran,perocomobuenaguadeconsultasugierolaNortonGuidedeAssembler,(SaliunaversinnuevaqueestaenKansasCity).EstaNGesunabuenaguayexplicabastantebienquehacecadaorden,igualmente,meofrezcoparaquesialguienquierehaceralgoenAssembler,ylesurgealgunaduda,melopregunteahoratenemoselreaAssembler.

    Formatogeneraldeunaorden:

    mnemnico[Param1[,Param2]]

    Donde:Mnemnicoeslaordenensimisma,esllamadamnemnicoporqueseutilizanestasletras,paranotenerquerecordarelnmerodelaorden.Sonletrasqueparecennotenersignificado,perosilotienen,yunavezqueseloconoce,nosoloserecuerdan,tambinseaciertanalgunosquenoseconocanantes...

    Param1,nosiempreseutiliza,hayMnemnicosquenorequierenparmetros.Esteparmetro,cuandounaordenllevados[parmetros],esllamadoDestination,esdondeseguardanlosresultadosdelasoperaciones,claroquepuedenohacerfalta,pero,digamos,quecomosiempre,estassonlasexcepcionesalasreglas...

    Param2,muchasveces,esteparmetronoexiste,peronormalmente,cuandoesnecesario,esllamadoSource,yeselorigendelasoperacionesenlasqueinterviene.Otravez,tenemosquedecir,quehayexcepcionesaestaregla...

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 12/16

    Ahorasi,algunasrdenesconcretas:

    MOVParam1,Param2

    Estaorden,MOVe,mueve,omejordicho,copiaelcontenidodeParam2aParam1.Porejemplo,MOVAX,BXeselequivalenteadecirAX=BX,elvalordeBXnocambia,yeldeAXsetransformaeneldeBX.Param1,puedesertanto,unregistrocomounaposicindememoria.Param2puedeserunaconstante,unregistroounaposicindememoria.Perohayciertasrestricciones,aunaposicindememorianoselepuedeasignarelcontenidodeotraposicindememoria,esdecir

    MOVDS:[1200],ES:[3020]

    NOesunaordenvalida.Sisedeseahaceresto,hayquedesdoblarloendosordenes:

    MOVAX,ES:[3020]MOVDS:[1200],AX

    Siloquesequeramovereraunword.OcambiandoporAL(envezdeAX)sisequeramoverunbyte.(AXyALsonejemplos,podrahabersidocualquierregistro).HayotrasformasdehacerlosindestruirelcontenidodeAX,yalovamosaver.Hayotralimitacinmas,aunregistrodesegmento,noselepuedeasignardirectamenteunvalor,sloestapermitidoasignarleelcontenidodeotroregistro,peroquetampocoseadesegmento,esdecir,parahacer:

    DS=CS

    hayquehacer,otravez:

    MOVAX,CSMOVDS,AX

    Yotravezhaymasformas,ytambin,yalasvamosaver.

    Otraordenmuyutilizada,eslaorden:

    INTIntNum

    Estaordenllamaaunainterrupcin,esdecir,buscaenelreadememoriadondeestnlospunterosalassubrutinasdeinterrupciones(ISR),yllamaadondeapuntaelnmerodeinterrupcinespecificado.(Unpuntero,esunadireccindememoria,queapuntaaalgo,enestecasoalaposicindondecomienzacadaISR.Lasinterrupcionessonrutinasqueestnadisposicinnuestra,paraquelasutilicemoscuandonosseannecesarias.Sonrutinasquenosfacilitanmucholatareadeprogramar.Hayvariostiposdeinterrupciones:

    InterrupcionesdeBIOS:estasinterrupcionessonlasqueinstalanlasPlaquetasqueponemosenelmotherboard,tambinestaelBIOSpropiodelamquina.LosBIOS,sonejecutadosalencenderselacomputadora,primeroseejecutaelBIOSpropiodelmother(son,normalmentedoschipsconetiquetas,quesepuedenveralabrirlamquina),esteBIOS

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 13/16

    "principal"seocupadeinstalarsusinterrupcionesydeverificarsihayotrosBIOSagregadosenplaquetas,siloshay,losejecutayellosseencargandeinstalarsuspropiasinterrupciones.LasinterrupcionesdeBIOS,sonlasquenosfacilitanelaccesoalosdistintosperifricos,yaqueseencargande"hablar"directamenteconelHardWare,cosabastantepesadadehacer,yqueporotrolado,puedecambiardeHardenHard.GraciasalBIOS,podemosaccederalmonitorsinquenosimportelamarcanielmodelo,solamentellamamosalasinterrupcionesnecesarias.

    LasInterrupcionesdeDOS,sonelsistemaoperativoensi,unamquinaescompletamentefuncionalsinBIOS,peroclaro,tendramosqueestarhacindonosnosotroslasrutinasnecesariasparaquenuestrosprogramasfuncionenentodaslasmquinas(seriantodosenormes!!!),bueno,elsistemaoperativo,eslainterfaseentreelusuarioyelBIOS,elsistemaoperativoeselquenosdalafacilidaddemanejararchivos,dereservarmemoria,enfin,deadministrarlosrecursosdelamquina,deunaformaquenocreeconflictosentrelosprogramasdedistintosprogramadores.Eselqueponelasreglasdecomoutilizarlamquina.Noescomplicado,sipesado,manejararchivossinDOS,dehechovariosprogramas,comoelDiskExplorerdeNorton,lohacen,pero,otravez,quesentidotienetenerqueponerunsistemaoperativoencadaprogramaquehacemos...*Entonces,lasinterrupcionesdeDOS,sonlasquenospermitenmanejarlosdistintosrecursosdelamquina,esdecir,losarchivos,losdirectorios.Lamemoriayelflujodeprogramasensi.Eselquenosfacilitalaentradadetecladoodisco(hacindolaindistinguible),etc.

    LuegoestnlasIRQ(InterruptRequest),estasinterrupcionessoninterrupcionespropiamentedichas,nosonnormalmentellamadasporunprograma.EstasIRQssonllamadasdirectamenteporelHardWare,paraindicaralgunasituacinespecial.Porejemplo,elMousellamaaunaIRQparaavisarquesurgialgncambiodeestadoenelpropioMouse.ElTeclado,llamaaunaIRQparadecirquehayalgnmensajeprovenientedeelhacialaCPU,etc.Normalmente,loquesehaceconlasIRQsesreemplazarlarutinaalaqueapuntalatabladepunterosyentoncescuandosucedeunaIRQ,nuestrarutinaesllamadadirectamenteporelmicroprocesador,desdeallseleeelMouseoelTeclado,oloquecorresponda.Muyextraamente,porestasrazones,nuestroprogramallamaaunaIRQ.

    Bueno,entoncestenemosquelasInterrupcionessonrutinasquenosfacilitanlaprogramacin,sonrutinasyainstaladasenlamquina,quehacentareascomplejaspornosotros.Ycomotalesrutinas,llevanparmetros,perodonde?silaordenes:INTIntNumLasInterrupcionestomanlosparmetrosdelosregistros,ysuresultadotambinvuelveenregistros...

    LasInterrupcionesBIOS,porejemplosonlas13h,10h,11h,12h,16h,17h,19h,etc...LasDOS,sonlas20h,22h,23h,24h,25h,26h,27h,28h,29h.

    PerolafundamentaleslaINT21h,pormediodeellaesposiblehacercasitodolonecesarioparallevarunprogramaalamarcha...PerocomopuedeserqueconunasolaINTseaposiblehacertantascosas?Muysimple,muchasINTstienenfuncionesysubfunciones,lascualesseidentificansegnelvalordelosregistros,normalmenteAXoAHsonutilizadosparadeciraquenmerodefuncin/subfuncinqueremosacceder.As,porejemplo,laINT21hsiAH=09h,sirveparamostrarunStringenpantalla,perosiAH=39hsirveparahacerundirectorio.Comoven,lautilidaddeunaINTnosoloestalimitadaaunafuncin,sinoquepuedetenermltiplesusos.

    AlgofundamentalenlautilizacindeunAssembler,eslaposibilidadquenosdadeponerlenombresalasposicionesdememoria,esdecir,podemosponerunacadenaenmemoria,y

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 14/16

    asignarleunnombre,talcomosifueraunavariable,ydehecho,loes.Laformadereservarlugarparaunavariable,dentrodeunprograma,noescomplicada:

    NombreXXValor

    Nombreeselnombreconelquenosvamosareferir,mastardeaesaposicindememoria,eselnombredelavariable.XX,esladefinicindeltipodelavariable:

    DB Paradefinirunbyte,dicequelavariableesunbyte,ounarraydeBytes,esdecir,unbyteatrasdeotro.DW ParadefinirunWordounarraydeWord.DD ParadefinirunDWord,ounarraydeDWord.DQ ParadefinirunQWord(QuadWord,uochobytes).DT ParadefinirTenBytes(diez).

    Valoreselvalorinicial,nopuedefaltarnunca,claroquesinoselequieredarningnvalorinicial,esfactibleponer,enellugardelvalor,u'?',quesignificaquereserveespaciosinimportarquevalorlede.

    Definicionesvalidas,podranser:

    Letra_ADB'A'Uncaracter**Number_1DW1UnNumero1,peroWord.PointerDD0B000h:8000hPunteroalapantalladevideo.StringDB'Hola,Comoestas!'Cadenadefinidacomoarraydebytes.ArrayDB1,2,4,8,16,32,64,128ArraydeBytes...

    etc...

    Lavezpasadamepaseconelprograma,quizseraunpococomplicado,peroeraparaquetenganunaideadecomoesunprogramaenAssembler,quizsmuchosleencontraronlavueltayanimaronalargarseaprogramar.Sugiero,quetratendeentenderprogramitasenAssembler,noesningunacienciaestelenguaje,esunodelosmassimples,perollevasutiempoencontrarlelavuelta...Acvaotroprogramita,tambinrebuscado,pero,yosequesinoentiendenvanapreguntar...Ono?(:

    .modeltiny

    .codeorg100hEjemplo_2:jmpComienzo;Salteoelreadedatos,sise;ejecutara(nohaydiferenciaentredatosy;programas)seriaunacolgadamas...MatchingDB'*.*',0;Array:Unacadenamasunnmero.Comienzo:

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 15/16

    movah,4ehmovcx,0movdx,offsetMatching;DX=OffsetdeMatching;DS,alentraraun.COMesigualaCS.int21h;Quehace?jcError;SiestaprendidoelCarryFlag,saltomovah,2fhint21h;Yesta?movbyteptres:[bx+1eh+13],'$';Byteptrparadecirlequealoqueapunta;[bx+13]esunbyte,podraserunwordptr,o;undwordptr.El'$'eselfindeunacadena;aimprimirporelDOS.movdx,esmovds,dxleadx,[bx+1eh];PoneenDXelOffsetalqueapunta;BX+13,esdecirDX=BX+13

    movah,9int21h;Imprimeunacadena.Error:movax,4c00hint21hENDEjemplo_2

    *Fueradetema,perointeresantequizs,eselhechodeampliarcadavezmasesteconceptodereutilizacindecdigohastallegaralWindows,dondeningnprogramatraelasrutinasparahacermens,botonesoventanas,perotodoslasutilizan.TambincrearonlasDLL(DinamicLinkLibraries)quepuedenserreutilizadasporvariosprogramas,peroclaro,hayquesaberaprovecharlo...

    **Desdeel''hastaelfinaldelalnea,esconsideradocomentarioporelcompilador.

    Bueno,esperoqueentiendanalgo,porquelaverdad,queaunquelolevariasveces,tengomisdudas,todava...

    Acontinuacinlaltimaentregadeinterrupcionestiles...

    INT21/AH=4EhFindFirstMatchingFileEntrada:AH=4EhCX=Attributoabuscar.DS:DX>punteroaunASCIIZ(Cadenaterminadaen0)conelnombreabuscar,wildcardspermitidos.

    Devuelve:AX=CodigodeError,siElCarryFlag(CF)estaenuno.

  • 8/2/2015 CursodeAssembler

    http://www.pablin.com.ar/computer/cursos/varios/introasm.htm 16/16

    DTA=Contienelainformacionderetorno.

    DTA=OffsetTamaoSignificado00ByteAtributodelabsqueda

    [...]

    1E13bytesASCIIZdelnombredelarchivoencontrado.

    INT21/AH=2FhGetDiskTransferAddress(DTA)Entrada:AH=2Fh

    Devuelve:ES:BX>PunteroconladireccindelaDTAactual.