curso de assembler
DESCRIPTION
Curso de programación en AseemblerTRANSCRIPT
-
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.