Sei sulla pagina 1di 16

8/2/2015

CursodeAssembler

CursodeAssembler
By:GerardoRicharte
HolaGente!
Porfinmemandeaescribiralgosobreesto,quieroagradecerlesespecialmentea
ArielNardelli
MauricioTaslik
GastnSanchez
EduardoArias
LuisMamud
PabloRotzyld

FedericoJoselevich
DiegoPaz
NicolaiKuzminski
FernandoBardelli
JuanEsteva
FabinBenavidez

Porhaberseprendidodeentradaenestaidea,yporhaberhechosugerencias,yporhaberme
hechodecidirme.!!!
Bueno,Mmmm...
Vamosaempezarporalgoquequizsmuchosyasepan,perocomoesindispensable,igualse
lotengoquecontar:
LaMemoriadeLasPC:
Comoyasabrn,dehaberescuchadoporah,hayvariostiposdememoria,laMemoriaBase,
laMemoriaExpandida(EMS),MemoriaExtendida(XMS),UpperMemoryBlocks(UMB),High
MemoryArea(HMA)yunmontnmasdereferenciasadistintostiposdememoria,loqueles
voyacontaresquedireccindememorialecorrespondeaunBytedentrodelprimer
MegaByte,esdecir,dentrodelamemoriabase(0640K)yenlazonadondeestnlas
plaquetasdeexpansin,Monitor,BIOSROM,readelacontroladoradeDisco,etc...
TratemosdeacostumbrarnosaverlosnmerosenHexadecimal(base16).Losdgitosque
puedenformarunnumeroenestabase,son:0,1,2,3,4,5,6,7,8,9,A,B,C,D,EyF,
tomandovaloresenesemismoorden,el0vale0ylaFvale15.Deestaformaunnumero,por
ejemplo0FA3h(la'h'finalindicaqueestaen'Hexa'),expresadoendecimalvaldra(3)+
(Ah*16)+(Fh*16*16)+(0*16*16*16),oloqueeslomismo3+160+3840+0=4003,pongmonos
deacuerdoquecuandounnmeroloescribimosenHaxaleponemosla'h'alfinal,ysi
comienzaconunaletra,leagregamosun'0'adelanteparanoconfundirnosconunnombrede
variable.EstofueunabreveperonecesariaintroduccinalsistemaHexadecimalde
numeracin.
Ahorasi,veamoscomosedireccionalamemoriadeunaPC.
Tengamosencuentaquesiqueremosdireccionar1Mbnoshacenfalta5dgitos
hexadecimales,esdecir,poderescribir,dealgunaforma0FFFFFho100000h1quees
1*16^5=1Mb(1queseresta,correspondealbyte#0).Comolos80x86tienenregistrosde16
bits(8bits=1Byte,16bits=1Word)o4dgitoshexa,solopodramosllegaradireccionar
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

1/16

8/2/2015

CursodeAssembler

0FFFFhbytes,loquesignifican64Kbsolamente(deaqulalimitacindelos.COMs).Loque
sehaceesutilizardosregistrosalavezparaapuntaraunsolobyte,loquenosampliael
campoapoderdiferenciar0FFFFh:0FFFFhbyteso1MgdeMbmuchsimo!Entonces,Que
pasaquenosepuedetenertantamemoriasinhacercosasextraas?Claro,loquepasaes
queparadireccionarseusandosregistros,peronoubicadosunoalladodelotro,sino
desplazadosundgito.Que?Si,yasequeestaconfuso,ahoratecuento:
EnunRegistro,digamosquesellamaDS,esta0040h,yenotro,digamosBS,hay006Ch.La
direccinalaqueapuntaDS:BS(asseescribe)es0040:006C,peroestadireccin,en
nmerosde5cifrasseescribe0046C,laconversinessimplsima,loquehayquehaceres
sumarlosregistrosdelasiguienteforma:
BS>006C
DS>+0040

DS:BS>0046Ch
Deestasuma,unosepuededarcuentaqueparareferirseaunamismaposicindememoria
puedehabermuchasformasdistintas.
Porejemplo,parareferirsea0046C,sepuedehacer:
000C046C
+0046+0000

0046C=0046:000C0046C=0000:046C
023C005C
+0023+003F

0046C=0023:023C0046C=003F:005C
Esdecir,puedehabermuchasformasdenombrarelmismobyte,ytenemosquetratarde
acostumbrarnosadarnoscuentaque,porejemplo,0F000:1234y0F123:0004son
equivalentes.
Tenemosqueunadireccindememoriaseseparaendospartes,ladelaizquierdadel':'esel
famosoSEGMENTosegmentoylodeladerechaeselOFFSETodesplazamiento,deuna
direccin.
Conclusin:ParareferirnosacualquierPosicindeMemoriaesnecesarioconocersuSegment
ysuOffset,yaquesabiendounosolo,nospodemosestarrefiriendoamuchosbytesdistintos.
AlgunasPosicionesdeMemoriatiles:
de0000:0000a0040:0000latabladepunterosdeinterrupciones.Cadapunterotomados
Words(unDWord)elprimeroparaelOffsetyelsegundoparaelSegment.
en0040:0000WordElnumerodePortcorrespondientealCOM1
en0040:0002WordElnumerodePortcorrespondientealCOM2
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

2/16

8/2/2015

CursodeAssembler

en0040:0004WordElnumerodePortcorrespondientealCOM3
en0040:0006WordElnumerodePortcorrespondientealCOM4
en0040:0027ByteStatusdelasteclasespeciales.
en0040:0049ByteElmodoactualdevideo.
en0040:006CDWordLahoraactual,primeroelwordmenossignificativoyluego,en40:
(6C+2)elmassignificativo.Elnumeroes18.2veceslahora.
apartirdeB000:0000LamemoriadevideodelaHrcules(Texto&Grficos)
apartirdeB800:0000Lamemoriadevideodelasotras(Texto&AlgunosGrficos)
Muchasmasposicionesdememoriasepuedensacardevarioslugares,dondeyosiempre
buscoesenASM.NG(NortonGuidedeAssembler)yen2MchNfo2,(TooMuchInfoTwo)
comonopodaserdeotramanera.:)
Nota:SiunDWordesYYYYXXXX,elWordmenossignificativoesXXXX,yelmassignificativo
esYYYY.SiunWordesYYXX,elBytemassignificativoesYYyelmenossignificativoesXX.
Paraprobarlasposicionesdememoria,desdepascalpuedenhacer:
IfMem[$0040:$0049]=7Then{ModoTexto}paraleerunbyte(el'$'significaHexa)
Mem[$B800:(Columna+File*80)*2]:='A'Paralaletra
Mem[$B800:(Columna+File*80)*2+1]:=WhiteParaelatributo
MemW[$0040:0000](oMemW[$40:0])paraunWord
MemL[$40:$6C]paraunLongInt(oDWordSignado)
DesdeC:
if(peekb(0x0040,0x0017)==7){/*ModoTexto*/}paraunbyte(ochar)
pokeb(0xB800,(Columna+File*80)*2,'A')Paralaletra
pokeb[0xB800,(Columna+File*80)*2+1,WHITE)Paraelatributo
peek(0x40,2)ypoke(0x40,2)paraunint(WordSignado)
yparaunDWordhayquehacerun#defineporqueelCnotrae:
#definepeekpokel(seg,ofs)(*(unsignedlongfar*)(MK_FP(seg,ofs)))
ahorasi:
if(peekpokel(0x40,0x6C)==0x0F0342034){}y
peekpokel(0x40,0x6C)=0
paraunDWord
Muybien,ahorayasabemosquelamquinatienememoriaytambinsabemoscomoapuntar
aunaposicinenestamemoria,perobueno,estecursoesdeAssembler,nodememorias,
porlotanto,lointeresanteyapropiadoseraquelescomentara,ascomosidepasadafuera,
comosehaceenAssemblerparacargarograbaralgodesdeohacialamemoria.Pero,
primerohayquesaberotrascositas...Noestan
fcillacosa...Al"hablar"enAssembler,estamosdicindolealamquinaenlomascercanoa
suidiomaposible(yaquesuverdaderoidiomaesde"1"y"0"totalmente)loquetieneque
hacer.Estamoshablandodirectamente,nosotrosmismos,sinlaayudadeuntraductor
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

3/16

8/2/2015

CursodeAssembler

(compilador),conelcerebropropiamentedichodelamquina.Estamoshablandoconel
vendito80x86.Entoncesparadecirlealgotenemosqueconocerlounpocomas.Comoesmuy
probablequemuchostengan8086/88o80286
vamosaverespecialmente,laestructurainternadeestos"micros"(microprocesadores),por
arriba,sololonecesarioparaprogramarenassembler,obviamentetambinsirveparalos
iluminadosquetengan386o486,oquizs586oP5.Internamentetodoslosmicros(entiendo
quetodos),tieneunaspocasvariables,llamadasREGISTROSquesonendondeseprocesan
losdatos,sehacenoperacionessonporlascualessepuedeaccederamemoria,etc.Sirven
paratodo.Peronotodassirvenparalomismo,yaunquemuchassiseanintercambiables,
todasestndestinadasparaalgoenespecial,ytienenunaqueotrafuncinpropia.Los
registrosdelafamilia80x86son:
AX
BX
CX
DX
SI
DI
BP
SP
IP
CS
DS
ES
SS

AcumulatorRegister
BaseIndexRegister
CounterRegister
DataRegister
SourceIndex
DestinationIndex
BasePointer
StackPointer
InstructionPointer
CurrentSegment
DataSegment
ExtraSegment
StackSegment

Acumulador
IndiceBase
Contador
Dato
IndicedeOrigen
IndicedeDestino
PunteroBase
PunterodePila
PunterodeInstrucciones
SegmentoActualdelPrograma
SegmentodeDatos
SegmentoExtra
SegmentodePila

FlagsSealizadoresdeEstado:
Todosestosregistrossonde16bits,esdecirdeunWord.Perolosregistrosqueterminanen
X(AX,BX,CX,DX)puedensermanejados,tambin,comosifuerandosBytes(Queloson),
porseparado,susnombresson,AHparaelBytemassignificativodeAXyALparaelmenos
significativo,BHyBLparaBX,CHyCLparaCXyDHyDLparaDX(laHylaLhacen
referenciaa"Hi"y"Lo",esdecirAltoyBajo,altoessinnimodemassignificativoybajode
menos.Siporejemplo:
AX=437AhEntoncesAH=43hyAL=7Ah
BX=0145hBH=01hyBL=45h
CX=0AABBhCH=0AAhyCL=0BBh
DX=1hDH=00hyDL=01h
Deigualmanera,si:
AL=10hyAH=32hAX=3210h
BL=08hyBH=0CAhBX=0CA08h
CL=1hyCH=1hCX=0101h
DL=00yDX=00DX=0000h
Estoscuatrosonlosnicossegmentosquesepuedensepararenbytealtoybytebajo.
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

4/16

8/2/2015

CursodeAssembler

Funcionesespecificas:
AX,Acumulator:Sirveparahacertodaslasoperacionesaritmticas,yalgunas,como
MultiplicaryDividir,lesonexclusivas.AX(yALporsuversindeunsolobyte)sonlosnicos
registrosquepuedensermultiplicadosydivididosporotroregistro.LarestadeAXyAL,por
ejemplo,ocupanunbytemenosqueladecualquierotroregistro,peroestonoespara
preocuparse,unbyte,realmentenoesnada,pormasqueseacumule.
BX,BaseIndex:Sirveparaserusadocomoregistrodebaseparaunndiceoarray,esdecir,
unaposicindememoriapuedeserapuntadaporBX(suoffset),igualmentetambinselo
puedeusarparahacersumasrestasytodotipodeoperacioneslgicas.AX,CXyDXnosirven
paraapuntaramemoria.
CX,Counter:Eselregistroreservadoparacontar,comosunombreloindica.Paraeste
propsitohayrdenesespecialesquelodecrementanoincrementanyhacenalgosegnel
resultado.Tambinhayciertasrdenesrepetitivasquenecesitansabercuantorepetirse,por
mediodeCX(oCLensuversinByte)selesindica.
DX,Data:Esteregistronotienedefinidounuso,engeneralesutilizadoparapasarciertos
parmetros,perosicumpleunafuncin,porejemploenlamultiplicacin,sisemultiplica
AX=1000h(unWord)por,simplemente10h(unByte)elresultadoes00010000h(UnDWord),
entonces,elWordAltodelresultadodelamultiplicacinsedepositaenDX,yelBajoenAX.
SI,SourceIndex:Puedeserutilizadocomondiceaposicionesdememoria,esdecirsepuede
ponerunnmeroenSI(Offset)yleereldatodeestaposicin.Peroalaveztieneunafuncin
especfica,ladeRegistroFuenteparalasrdenesdetratamientodecadenas.Hayciertas
rdenesenAssemblerquesonpara,porejemplomovertodaunacadenadebytes,deunlugar
aotro,ladireccindelacualseleenlosbytesseponeenSIantesdedecirquelea.
DI,DestinationIndex:ComoSI,puedeserusadocomondice.Perosufuncinespecficaesla
deRegistrodeDestinoparalasoperacionesdecadena,loqueseleedeelcontenidodeSI(no
deSImismo,sinodelaposicindememoriaalaqueapuntaSI)esdepositadoenlaposicin
dememoriaalaqueapuntaDI,expresadapor[DI].Allavez,igualqueconSI,sepueden
haceroperacionesaritmticassimples(sumayresta),ytambintodotipodeoperaciones
lgicas(AND,OR,XOR).
BP,BasePointer:Punteroaunaposicindememoria,muyparecidoaBX,perogeneralmente
usadoparafacilitarelpasajedeparmetrosenfuncioneshechasconlenguajesdealtonivel,
porunacaractersticapropiaqueyavoyaexplicar.
SP,StackPointer:PunteroqueindicaenqueOffsetterminaelStack,opila.ElStack,esun
readelamemoriaprincipaldelamquina,(noestadentrodelMicro,nitampocoesfija)que
sirveparapreservarcosas,laestructuradelStack,queyaexplicaremasafondo,essimple,
estaestructuraesllamadaLIFO(LastInFirstOut)oloqueeslomismo,loltimoqueentra,es
loprimeroquesale,escomosituviramosunapiladecosas,loltimoqueapoyamosarriba
vaaserloprimeroquepodamossacardespus.Sinoestaclaro,nosepreocupen,yavoya
explicarlobien,yvoyadecirparaqueseusa,ycuando.
IP,InstructionPointer:ElpunterodeinstruccineselqueleindicaalMicrocualvaaserla
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

5/16

8/2/2015

CursodeAssembler

prximainstruccinquedebeejecutar(SoloelOffset).ElprogramaenAssemblertieneuna
estructuralgica,lacualsepuedeseguir.IPcomienzaalprincipiodelprograma(laprxima
ordenquesedebeejecutareslaprimeradelprograma),seejecutaesaordeneIPes
incrementadotantocomoBytesocupelaordenrecinejecutada(notodaslasrdenesocupan
unbyte)luegosigueconlaprximayassucesivamente.Sipudiramosdealgunaforma
cambiarelcontenidodeIPloqueestaramoshaciendoseriaunadesviacin,ounJump(salto)
aotroladodelprograma,yefectivamentesepuedehaceresto,peronodiciendoIP=1234h,
sinohaciendounsalto,queesequivalenteaestoltimo:JMP1234h.Yalovoyaexplicar,esto
tambin.
Sehabrndadocuenta,quesiemprequedijequeapuntabaaunaposicindememoria,hice
notarquesoloeraelOffsetloqueestabacomprendido,porejemploenDIoSI,BXoSP.Pero
entonces,comoesposiblequeconsolamenteeloffsetalcanceparaidentificarunaposicinde
memoria?siyomismodije:
"ParareferirnosacualquierposicindememoriaesnecesarioconocersuSegmentysu
Offset,yaquesabiendounosolo,nospodemosestarrefiriendoamuchosbytesdistintos."
Bueno,acestalacuestin:
CS,CurrentSegment:EselSegmentoactualdeejecucin,juntosCS:IPapuntanalaprxima
ordenqueelMicrodebeleerparaejecutar.Veamosalgo:
CS:IP=1000:FFFAhayunaordenentoncesIPseincrementa:
CS:IP=1000:FFFEQuepasasiahorahayotraorden,eIPseincrementadenuevo?
Fcil:FFFE+1=FFFFperoFFFF+1=10000!!!
Quepasaenestecaso?CSnoseincrementa,eIPnopuedecontenerunnumerode5cifras!
LoquepasaesqueIPvuelvea0000yelprogramasigueenCS:IPosea1000:0000,loquees
unaposicin64kmasbajadememoria,oseacualquierlado...Esteeselproblemaporloque
los.COMsnopuedentenermasde64kdelargosinhacernadararo(cambiarCScuandosea
necesario).
DS,DataSegment:EselsegmentodestinadoaserusadojuntoconBX,SIyDIparaapuntara
unadireccindememoria.TambinpuedeserusadoconBPySP,perohacefaltaexpresarlo
concretamente.(Masadelanteaclaroesto)
ES,ExtraSegment:EsunsegmentoExtraparaserutilizadocuandohagafalta.Tambintiene
unafuncinpropia:JuntoconDIindicaneldestinoenlas"rdenesdecadena"(eldatoledo
deDS:SIespuestoenES:DI,enlasordenesdemovimiento).
SS,StackSegment:ElsegmentodeStackjuntoconSPapuntanalaltimaposicinquefue
utilizadapara"depositar"datosenelStack.
Porultimo:
Flags:Esunregistroespecialenelcualseguardanlosresultadosdelaltimaoperacin
matemticaodecomparacin.Noseguardanlosresultadosnumricos,sololosdeestado,es
decir:
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

6/16

8/2/2015

CF
PF
AF
ZF
SF
TF
IF
DF
OF
IOPL
NT
RF
VM

CursodeAssembler

CarryFlag
ParityFlag
AuxiliaryFlag
ZeroFlag
SignFlag
TrapFlag
InterruptFlag
DirectionFlag
OverflowFlag
I/OPrivilegeLevel
NestedTaskFlag
ResumeFlag
VirtualModeFlag

BanderadeporAcarreo
BanderadeporParidad
BanderaAuxiliar
BanderaporCero
BanderadeSigno
BanderadePasoSimple
BanderadeInterrupcin
BanderadeDireccin
BanderaporSobreflujo
Soloen286osuperior
Soloen286osuperior
Soloen386osuperior
Soloen386osuperior

HastaaqulaexplicacindelosregistrosinternosdelMicro.
Paraapuntaraunaposicin,hacefaltaindicarsuOffsetysuSegment,estosehacemediante
unregistrodesegmento(DS,CS,SS,ES)yunOffset,quepuedeserunnmeroounregistro
comoBS,SI,DI,BP,SP:
DS:[3304h]ApuntaalSegmentDSyaloffset3304h.Loscorchetesindicanquelo
quesequiereeselcontenidodeesaposicin,nolaposicinensi.
ES:[BX]IndicaalaposicinqueestaenelSegmentoDSyelOffsetBX.
SS:[SP]IndicalaposicindearribadetododelStack,apuntadaporelSegmentoSSyel
OffsetSP.
NosiemprehacefaltaindicarelSegmentalqueseapunta.ComoelsegmentDSesel
destinadoparaponerlosdatos,lagentedeInteldecidiquesinoseespecificasegmentopara
unoffsetabsoluto(unnmerocomoelprimercaso),oparalosregistrosBS,SIyDI,seasume
DS.ParalosregistrosSPyBP,seasumeSScomoSegmentopordefecto.Entonces:
[1304h]IndicaelcontenidodeDS:[1304h]
[BX]ApuntaaDS:[BX],pero
ES:[BX]ApuntaaES:[BX],porqueseespecificaES
ES:[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,cualquiercombinacindeSegmentoyRegistrondiceoBaseoOffsetAbsoluto
puedeserformada,peronosiemprehacefaltaaclararelSegmento.
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

7/16

8/2/2015

CursodeAssembler

HastaahoravimosqueenlosmicroprocesadoreshayvariablesllamadasREGISTROS,que
cadaunoestadestinadoaunafuncinespecial,peroqueengeneralsedividenendos
grandesgrupos,losregistrosdeusogeneral,pordecirlesdealgunaforma,ylos
exclusivamenteparaserusadoscomosegmentos.Vamosavercomoesunprogramaen
Assembler,peroantes,quieroaclararqueesunAssembler.
Assembler,propiamentedicho,eselprograma(TASM,MASM,A86,etc.)queseocupade
transformarloquenosotrosescribimos,enpalabras,sepodradecir,anmero,queesloque
realmenteentiendelamquina.Enrealidad,loconvierte,actualmente,enuncdigoobjeto,
.OBJ,queesunaherramientaquesecreoparapoderuniroLinkearvariasrutinashechasen
distintosmomentosy/olenguajes.LoquecompletaelprocesoeselLinker,TLINK,LINK,
OPTLINK,BLINKER,etc.Loqueyouso,particularmente,sonelAssembleryLinkerde
Borland,elTASMyelTLINK,perobueno,sialguienquiereusaralgunomas,escosadedarse
maa,opreguntarquehayquecambiar.
Primero,paracomenzarporalgofcil,yparaqueporfin,deunavezportodas,puedan
comenzarahaceralgo,vamosahacerun.COM,eslomassimple,masrpido,ymasfcilde
recordar.
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.
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

8/16

8/2/2015

CursodeAssembler

;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
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

9/16

8/2/2015

CursodeAssembler

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:Lasordenespropiamente
deAssembler.(MOV,CMP,JNE,INT,ADD,INC)Ylasrdenesalcompilador,queledicen
comotratarelarchivo.(.MODEL,.CODE,END)
Porotrolado,estnlasvariablesylabels,quesonayudasquenosdaelcompilador.Siestono
existieratendramosquerecordar,envezdelnombredeunavariable,suposicin,yadems
tendramosquecalcularlaamano.Detodoestoseocupaelcompilador(ensamblador).Este
programa,funcionayhacealgo,pero,claro,notodoestansimple.Tratendeanalizarloantes
deejecutarlo,paraesovananecesitarunalistadeinterrupciones.Sinolatienen,vayan
consiguindola,casitodoprogramaenassemblerseaprovechadelasinterrupciones.Tengan
encuentaqueenun.COM,alcomienzo,DS,ES,CSySStienenelmismovalor,yclaroquelo
conservananosserqueselocambiemosnosotros.
Conestosbsicosconocimientosyasepuedenirdandomaaparahacerotrascosas,traten
deversilessalealgo.Piensenquequierenhacerycomo,sihayalgoquenoselesocurre,
tratenotravez,queesaeslamejorformadeaprender,tratarhastaquesalga,sinolessale,
pregunten,queporestavezpuedepasar...:)
Acestaloquevananecesitar,sobrelasinterrupcionesqueusaelprograma.
INT21DOS1+WRITESTRINGTOSTANDARDOUTPUT
AH=09h
DS:DX>'$'terminatedstring
_______________________________________________________
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

10/16

8/2/2015

CursodeAssembler

INT21DOS2+"EXIT"TERMINATEWITHRETURNCODE
AH=4Ch
AL=returncode
_______________________________________________________
Interprtenlocomolesparezca,paraquesevayanacostumbrando,vio?
AnteriormentehicimosunCOM.EnAssembler,entrehacerunCOMounEXE,casinohay
diferencia,yaquetodolotenemosquehacernosotrosexplcitamente,elcompiladorseocupa
solamentedelobsico.Lesdijequeparahacerun.COM(siempreenTASM),lomasfciles
poner:
.MODELTINY
.CODE
ORG100h
NomProg:
ENDNomProg
EntreelLabel"NomProg:"yelfindelarchivo"ENDNomProg",hayqueponertodoelcdigo
delprogramaensi.Masadelantevamosaverquesignificacadaunadeestas
cosas,ycomocambiarlasparacrearEXEsdedistintostipos,porahora,recurdenlaspara
poderprobarsuscositas.
Comoentodolenguaje,ademsdesabercomoprogramarhayquesaberlasrdenes,para
poderdecirlequehaceralamquina.Yovoyairexplicandodeapocotodaslas
rdenesquesemeocurran,perocomobuenaguadeconsultasugierolaNortonGuidede
Assembler,(SaliunaversinnuevaqueestaenKansasCity).EstaNGesunabuenaguay
explicabastantebienquehacecadaorden,igualmente,meofrezcoparaquesialguienquiere
haceralgoenAssembler,ylesurgealgunaduda,melopregunteahoratenemoselrea
Assembler.
Formatogeneraldeunaorden:
mnemnico[Param1[,Param2]]
Donde:
Mnemnicoeslaordenensimisma,esllamadamnemnicoporqueseutilizanestasletras,
paranotenerquerecordarelnmerodelaorden.Sonletrasqueparecen
notenersignificado,perosilotienen,yunavezqueseloconoce,nosoloserecuerdan,
tambinseaciertanalgunosquenoseconocanantes...
Param1,nosiempreseutiliza,hayMnemnicosquenorequierenparmetros.Esteparmetro,
cuandounaordenllevados[parmetros],esllamadoDestination,esdondeseguardanlos
resultadosdelasoperaciones,claroquepuedenohacerfalta,pero,digamos,quecomo
siempre,estassonlasexcepcionesalasreglas...
Param2,muchasveces,esteparmetronoexiste,peronormalmente,cuandoesnecesario,es
llamadoSource,yeselorigendelasoperacionesenlasqueinterviene.Otravez,tenemosque
decir,quehayexcepcionesaestaregla...
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

11/16

8/2/2015

CursodeAssembler

Ahorasi,algunasrdenesconcretas:
MOVParam1,Param2
Estaorden,MOVe,mueve,omejordicho,copiaelcontenidodeParam2aParam1.Por
ejemplo,MOVAX,BXeselequivalenteadecirAX=BX,elvalordeBXnocambia,yeldeAXse
transformaeneldeBX.Param1,puedesertanto,unregistrocomounaposicindememoria.
Param2puedeserunaconstante,unregistroounaposicindememoria.Perohayciertas
restricciones,aunaposicindememorianoselepuedeasignarelcontenidodeotraposicin
dememoria,esdecir
MOVDS:[1200],ES:[3020]
NOesunaordenvalida.Sisedeseahaceresto,hayquedesdoblarloendosordenes:
MOVAX,ES:[3020]
MOVDS:[1200],AX
Siloquesequeramovereraunword.OcambiandoporAL(envezdeAX)sisequeramover
unbyte.(AXyALsonejemplos,podrahabersidocualquierregistro).Hayotrasformasde
hacerlosindestruirelcontenidodeAX,yalovamosaver.Hayotralimitacinmas,aun
registrodesegmento,noselepuedeasignardirectamenteunvalor,sloestapermitido
asignarleelcontenidodeotroregistro,peroquetampocoseadesegmento,esdecir,para
hacer:
DS=CS
hayquehacer,otravez:
MOVAX,CS
MOVDS,AX
Yotravezhaymasformas,ytambin,yalasvamosaver.
Otraordenmuyutilizada,eslaorden:
INTIntNum
Estaordenllamaaunainterrupcin,esdecir,buscaenelreadememoriadondeestnlos
punterosalassubrutinasdeinterrupciones(ISR),yllamaadondeapuntaelnmerode
interrupcinespecificado.(Unpuntero,esunadireccindememoria,queapuntaaalgo,en
estecasoalaposicindondecomienzacadaISR.Lasinterrupcionessonrutinasqueestna
disposicinnuestra,paraquelasutilicemoscuandonosseannecesarias.Sonrutinasquenos
facilitanmucholatareadeprogramar.Hayvariostiposdeinterrupciones:
InterrupcionesdeBIOS:estasinterrupcionessonlasqueinstalanlasPlaquetasque
ponemosenelmotherboard,tambinestaelBIOSpropiodelamquina.LosBIOS,son
ejecutadosalencenderselacomputadora,primeroseejecutaelBIOSpropiodelmother(son,
normalmentedoschipsconetiquetas,quesepuedenveralabrirlamquina),esteBIOS
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

12/16

8/2/2015

CursodeAssembler

"principal"seocupadeinstalarsusinterrupcionesydeverificarsihayotrosBIOSagregados
enplaquetas,siloshay,losejecutayellosseencargandeinstalarsuspropiasinterrupciones.
LasinterrupcionesdeBIOS,sonlasquenosfacilitanelaccesoalosdistintosperifricos,ya
queseencargande"hablar"directamenteconelHardWare,cosabastantepesadadehacer,y
queporotrolado,puedecambiardeHardenHard.GraciasalBIOS,podemosaccederal
monitorsinquenosimportelamarcanielmodelo,solamentellamamosalasinterrupciones
necesarias.
LasInterrupcionesdeDOS,sonelsistemaoperativoensi,unamquinaescompletamente
funcionalsinBIOS,peroclaro,tendramosqueestarhacindonosnosotroslasrutinas
necesariasparaquenuestrosprogramasfuncionenentodaslasmquinas(seriantodos
enormes!!!),bueno,elsistemaoperativo,eslainterfaseentreelusuarioyelBIOS,elsistema
operativoeselquenosdalafacilidaddemanejararchivos,dereservarmemoria,enfin,de
administrarlosrecursosdelamquina,deunaformaquenocreeconflictosentrelos
programasdedistintosprogramadores.Eselqueponelasreglasdecomoutilizarlamquina.
Noescomplicado,sipesado,manejararchivossinDOS,dehechovariosprogramas,comoel
DiskExplorerdeNorton,lohacen,pero,otravez,quesentidotienetenerqueponerunsistema
operativoencadaprogramaquehacemos...*Entonces,lasinterrupcionesdeDOS,sonlas
quenospermitenmanejarlosdistintosrecursosdelamquina,esdecir,losarchivos,los
directorios.Lamemoriayelflujodeprogramasensi.Eselquenosfacilitalaentradade
tecladoodisco(hacindolaindistinguible),etc.
LuegoestnlasIRQ(InterruptRequest),estasinterrupcionessoninterrupcionespropiamente
dichas,nosonnormalmentellamadasporunprograma.EstasIRQssonllamadas
directamenteporelHardWare,paraindicaralgunasituacinespecial.Porejemplo,elMouse
llamaaunaIRQparaavisarquesurgialgncambiodeestadoenelpropioMouse.El
Teclado,llamaaunaIRQparadecirquehayalgnmensajeprovenientedeelhacialaCPU,
etc.Normalmente,loquesehaceconlasIRQsesreemplazarlarutinaalaqueapuntalatabla
depunterosyentoncescuandosucedeunaIRQ,nuestrarutinaesllamadadirectamenteporel
microprocesador,desdeallseleeelMouseoelTeclado,oloquecorresponda.Muy
extraamente,porestasrazones,nuestroprogramallamaaunaIRQ.
Bueno,entoncestenemosquelasInterrupcionessonrutinasquenosfacilitanlaprogramacin,
sonrutinasyainstaladasenlamquina,quehacentareascomplejaspornosotros.Ycomo
talesrutinas,llevanparmetros,perodonde?silaordenes:INTIntNumLasInterrupciones
tomanlosparmetrosdelosregistros,ysuresultadotambinvuelveenregistros...
LasInterrupcionesBIOS,porejemplosonlas13h,10h,11h,12h,16h,17h,19h,etc...
LasDOS,sonlas20h,22h,23h,24h,25h,26h,27h,28h,29h.
PerolafundamentaleslaINT21h,pormediodeellaesposiblehacercasitodolonecesario
parallevarunprogramaalamarcha...PerocomopuedeserqueconunasolaINTsea
posiblehacertantascosas?Muysimple,muchasINTstienenfuncionesysubfunciones,las
cualesseidentificansegnelvalordelosregistros,normalmenteAXoAHsonutilizadospara
deciraquenmerodefuncin/subfuncinqueremosacceder.As,porejemplo,laINT21hsi
AH=09h,sirveparamostrarunStringenpantalla,perosiAH=39hsirveparahacerun
directorio.Comoven,lautilidaddeunaINTnosoloestalimitadaaunafuncin,sinoque
puedetenermltiplesusos.
AlgofundamentalenlautilizacindeunAssembler,eslaposibilidadquenosdadeponerle
nombresalasposicionesdememoria,esdecir,podemosponerunacadenaenmemoria,y
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

13/16

8/2/2015

CursodeAssembler

asignarleunnombre,talcomosifueraunavariable,ydehecho,loes.Laformadereservar
lugarparaunavariable,dentrodeunprograma,noescomplicada:
NombreXXValor
Nombreeselnombreconelquenosvamosareferir,mastardeaesaposicindememoria,es
elnombredelavariable.XX,esladefinicindeltipodelavariable:
DB
DW
DD
DQ
DT

Paradefinirunbyte,dicequelavariableesunbyte,ounarraydeBytes,esdecir,un
byteatrasdeotro.
ParadefinirunWordounarraydeWord.
ParadefinirunDWord,ounarraydeDWord.
ParadefinirunQWord(QuadWord,uochobytes).
ParadefinirTenBytes(diez).

Valoreselvalorinicial,nopuedefaltarnunca,claroquesinoselequieredarningnvalor
inicial,esfactibleponer,enellugardelvalor,u'?',quesignificaquereserveespaciosin
importarquevalorlede.
Definicionesvalidas,podranser:
Letra_ADB'A'Uncaracter**
Number_1DW1UnNumero1,peroWord.
PointerDD0B000h:8000hPunteroalapantalladevideo.
StringDB'Hola,Comoestas!'
Cadenadefinidacomoarray
debytes.
ArrayDB1,2,4,8,16,32,64,128
ArraydeBytes...
etc...
Lavezpasadamepaseconelprograma,quizseraunpococomplicado,peroeraparaque
tenganunaideadecomoesunprogramaenAssembler,quizsmuchosleencontraronla
vueltayanimaronalargarseaprogramar.Sugiero,quetratendeentenderprogramitasen
Assembler,noesningunacienciaestelenguaje,esunodelosmassimples,perollevasu
tiempoencontrarlelavuelta...Acvaotroprogramita,tambinrebuscado,pero,yosequesi
noentiendenvanapreguntar...Ono?(:
.modeltiny
.code
org100h
Ejemplo_2:
jmpComienzo;Salteoelreadedatos,sise
;ejecutara(nohaydiferenciaentredatosy
;programas)seriaunacolgadamas...
MatchingDB'*.*',0
;Array:Unacadenamasunnmero.
Comienzo:
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

14/16

8/2/2015

CursodeAssembler

movah,4eh
movcx,0
movdx,offsetMatching;DX=OffsetdeMatching
;DS,alentraraun.COMesigualaCS.
int21h;Quehace?
jcError;SiestaprendidoelCarryFlag,salto
movah,2fh
int21h;Yesta?
movbyteptres:[bx+1eh+13],'$'
;Byteptrparadecirlequealoqueapunta
;[bx+13]esunbyte,podraserunwordptr,o
;undwordptr.El'$'eselfindeunacadena
;aimprimirporelDOS.
movdx,es
movds,dx
leadx,[bx+1eh]
;PoneenDXelOffsetalqueapunta
;BX+13,esdecirDX=BX+13
movah,9
int21h;Imprimeunacadena.
Error:
movax,4c00h
int21h
ENDEjemplo_2
*Fueradetema,perointeresantequizs,eselhechodeampliarcadavezmasesteconcepto
dereutilizacindecdigohastallegaralWindows,dondeningnprograma
traelasrutinasparahacermens,botonesoventanas,perotodoslasutilizan.Tambin
crearonlasDLL(DinamicLinkLibraries)quepuedenserreutilizadasporvariosprogramas,
peroclaro,hayquesaberaprovecharlo...
**Desdeel''hastaelfinaldelalnea,esconsideradocomentarioporelcompilador.
Bueno,esperoqueentiendanalgo,porquelaverdad,queaunquelolevariasveces,tengomis
dudas,todava...
Acontinuacinlaltimaentregadeinterrupcionestiles...

INT21/AH=4EhFindFirstMatchingFile
Entrada:
AH=4Eh
CX=Attributoabuscar.
DS:DX>punteroaunASCIIZ(Cadenaterminadaen0)conelnombreabuscar,wildcards
permitidos.
Devuelve:
AX=CodigodeError,siElCarryFlag(CF)estaenuno.
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm

15/16

8/2/2015

CursodeAssembler

DTA=Contienelainformacionderetorno.

DTA=OffsetTamaoSignificado
00ByteAtributodelabsqueda
[...]
1E13bytesASCIIZdelnombredelarchivoencontrado.

INT21/AH=2FhGetDiskTransferAddress(DTA)
Entrada:
AH=2Fh
Devuelve:
ES:BX>PunteroconladireccindelaDTAactual.

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

16/16

Potrebbero piacerti anche