tema 1

105
TEMA 1 1.- Qué es el ensamblador: El sistema alfanumérico para escribir código máquina mediante expresiones abreviadas (mnemotécnicos). La compilación es más complicada porque incluye la conversión de operaciones matemáticas complejas, comandos de lenguaje natural o tipos de comandos complejos. Cada ordenador tiene su propio lenguaje ensamblador, exclusivo de su CPU; un lenguaje de alto nivel (LAN) puede ser compilado en distintas máquinas. 2.- Para qué se usa: Porque hay aplicaciones o programas que deben tratar directamente con los registros de la máquina, la memoria, dispositivos de E/S, etc. Un programa ensamblador "bien hecho" produce un ejecutable más rápido y corto. El proceso de traducción se realiza en dos pasos: * Primero: se recorre el programa fuente; por cada instrucción implementa el contador según el código de la instrucción. Comprueba si tiene o no etiqueta, y si la tiene coloca su símbolo y su dirección en la tabla de símbolos. Después compara el símbolo del código de operación con una tabla de símbolos posibles; si es válido sustituye el código real y si no emite un mensaje real; a continuación comprueba la síntasis. * Segundo: recorre las instrucciones del módulo fuente reemplazando los símbolos por sus direcciones reales tomadas de la tabla. 3.- Herramientas de programación: Editor: programa con el que construímos los módulos fuente. Ensamblador: convierte el código fuente en el código objeto. Módulo LST: código máquina asociado a cada instrucción; la posición en la que se encuentra y una tabla en la que se indica la dirección que corresponde a cada nombre simbólico. Módulo OBJ: módulo objeto. Módulo CRF: listado de referencias cruzadas; contiene información referente a cada símbolo y las sentencias donde se hace referencia al mismo. Montador: realiza dos tareas: combina varios módulos objetos realizando las conexiones necesarias entre ellos, y convierte los módulos objeto en ejecutable.

Upload: lupitha-duran

Post on 24-Sep-2015

5 views

Category:

Documents


2 download

DESCRIPTION

le

TRANSCRIPT

TEMA 11.- Qu es el ensamblador:El sistema alfanumrico para escribir cdigo mquina mediante expresiones abreviadas (mnemotcnicos).La compilacin es ms complicada porque incluye la conversin de operaciones matemticas complejas, comandos de lenguaje natural o tipos de comandos complejos.Cada ordenador tiene su propio lenguaje ensamblador, exclusivo de su CPU; un lenguaje de alto nivel (LAN) puede ser compilado en distintas mquinas.2.- Para qu se usa:Porque hay aplicaciones o programas que deben tratar directamente con los registros de la mquina, la memoria, dispositivos de E/S, etc.Un programa ensamblador "bien hecho" produce un ejecutable ms rpido y corto.El proceso de traduccin se realiza en dos pasos:* Primero:se recorre el programa fuente; por cada instruccin implementa el contador segn el cdigo de la instruccin. Comprueba si tiene o no etiqueta, y si la tiene coloca su smbolo y su direccin en la tabla de smbolos. Despus compara el smbolo del cdigo de operacin con una tabla de smbolos posibles; si es vlido sustituye el cdigo real y si no emite un mensaje real; a continuacin comprueba la sntasis.* Segundo: recorre las instrucciones del mdulo fuente reemplazando los smbolos por sus direcciones reales tomadas de la tabla.3.- Herramientas de programacin:Editor:programa con el que construmos los mdulos fuente.Ensamblador:convierte el cdigo fuente en el cdigo objeto.Mdulo LST:cdigo mquina asociado a cada instruccin; la posicin en la que se encuentra y una tabla en la que se indica la direccin que corresponde a cada nombre simblico.Mdulo OBJ:mdulo objeto.Mdulo CRF:listado de referencias cruzadas; contiene informacin referente a cada smbolo y las sentencias donde se hace referencia al mismo.Montador:realiza dos tareas: combina varios mdulos objetos realizando las conexiones necesarias entre ellos, y convierte los mdulos objeto en ejecutable.4.- Sintaxis de un mdulo fuente ensamblador:* Instrucciones: son representaciones simblicas del juego de instrucciones de la CPU.[etiqueta] nombre_instruccion [operando(1)][comentario]La instruccin se especifica en una sola lnea y los campos se separan entre s por blancos o tabuladores.* Etiqueta:identificador simblico que se da a la instruccin. Puede tener hasta 31 caracteres; el primero no numrico; indiferente usar maysculas o minsculas. El ensamblador interpreta las etiquetas como direcciones de memoria. El ltimo carcter es ":".* Nombre_instruccin:de dos a seis letras y una instruccin se transformar en una nica instruccin de cdigo mquina.* Operando(s): especifican los datos que sern tratados por la instruccin. Puede haber 0, 1 2 operando. Si tenemos dos, el primero el "destino" y el segundo "fuente". Se separn por una coma. Existen tres tipos: inmediatos, registro y memoria; y adems se pueden modificar los operandos de memoria con los prefijos de segmento.* Comentario:cualquier cosa que comience por ";".* Directivas(pseudoinstrucciones): son partes del fichero fuente que indican al ensamblador cmo interpretar instrucciones o datos; slo se utilizan en tiempo de ensamblaje; no se traducen a cdigo mquina.[nombre] nombre_directiva [operandos] [comentario]*El nombre no termina en ":" e indica nombres de procedimientos y variables con las directivas apropiadas.5.- Datos del programa:El programa ensamblador traducir todos los datos tratados a nmeros binarios, pero por comodidad podemos expresar los datos en binario, decimal, hexadecimal, caracteres.Los nmeros son de cinco tipos:* Binarios: sufijo "b" 1001b* Decimales: sufijo "d" 9846d* Hexadecimales: sufijo "h"; no puede empezar por letra 32Ah* Octales: sufijo "o" o "q"* Caracteres o strings: se deben escribir entre ' ' o " ".Las directivas ms utilizadas para definir datos son:* DB: define bytes.* DW: define word.* DD: define dobles palabras.* DQ: define cudruples palabras.* DT: define grupos de 10 bytes.Un operador es un modificador que se utiliza en el campo de operandos para especificar un operando completo. Existen cinco tipos:* Aritmticos: +, -, *, /, mod, shl, shr.* Lgicos: and, or, xor y not.* Relacionales: FFFF(cierto), 0000(falso), EQ (equivalente).* Retorno de valores:SEG: devuelve el valor del segmento.OFFSET: devuelve el desplazamiento.TYPE : nos devuelve el tipo de operando.SIZE : devuelve el nmero de bytes reservados para dicha variable.* Atributos: modifican los atributos de la expresin cualificada.6.- Estructura del microprocesador:6.1.- Estructura del 8086 o 8088Constan de dos unidades interconectadas en el mismo chip de inicio. Una es BIU y la otra EU (unidad ejecucin).La BIU es la encargada de buscar instrucciones y acceder a datos del exterior.La EU es la encargada de ejecutar las instrucciones realizando las operaciones necesarias para ello.Cuando la BIU localiza en memoria un objeto de cdigo mquina, lo coloca en una lnea de espera llamada 'cola de instrucciones'. En el 8086 la cola tiene una longitud de seis octetos y al cdigo en memoria se accede de dos en dos octetos. En el 8088 tiene cuatro octetos y se accede de octeto en octeto.6.2.- Juegos de registros:* De la unidad de ejecucin:Propsito general:registros de 16 bits que pueden subdividirse y direccionarse separadamente. Nos quedaran 8 registros de 8 bits cada uno:AX: es el acumulador.BX: baseCX: contadorDX: datos.Otros 4 registros punteros y de ndice: no pueden subdividirse.SP: puntero de pila.BP: puntero base.SI, DI: indican los registros ndice y destino.* De indicadores: registros de 16 bits, contiene varios bits de estado del procesador.ZF: indicador de 0.SF: indicador de signo. Se pone a 1 si el signo es "-".PF: indicador de paridad.CF: indicador de acarreo.AF: indicador auxiliar para aritmtica decimal.DF: indicador de direccin. Controla la direccin en las operaciones con strings, incrementado o decrementando los registros ndices.IF: indicador de interrupcin. Indica si estn permitidas o no las interrupciones de dispositivos externos.TF: indicador de traza. Controla la operacin modo paso a paso.* Registro de la BIU: contiene 4 registros de segmento.CS: segmento de cdigo.DS: segmento de datos.SS: segmento de pila.ES: segmento extra.Un registro de instrucciones (IP) contiene la direccin lgica de la instruccin a ejecutar. Es decir, el desplazamiento dentro del segmento de cdigo cuya direccin de comienzo est en CS.6.3.- Uso de los registrosAX: se utiliza implcitamente en la * y la ":"; explcitamente en la E/S de palabras. Tambin se puede usar como registro general.AL: se usa igual que el AX pero al trabajar con bytes.AH: se usa como destino implcito en "*" y ":" a nivel de bytes.CX: controla bucles, iteracin de movimiento de cadenas, desplazamientos y rotaciones.DX: almacena datos de 16 bits y puede considerarse como una extensin de AX en "*" y ":" de 16 bits. Tambin se usa en E/S indirecta (direccin del puerto).BX: registro base para los direccionamientos.SI,DI, BP: partes de los modos de direccionamiento.IP y SP: control del flujo del programa.6.4.- Consecucin de una direccin real en memoria:El espacio de direccionamiento es 1 Mb lo que supondra tener direcciones de 20 bits. El esquema de segmentacin nos permite acceder correctamente a 1 Mb completo. Funciona de la siguiente forma:Direccin de comienzo de segmento y desplazamiento:conformaran cualquier direccin del 8086. La direccin de comienzo se almacena en uno de los cuatro registros de segmento (CS, SS, DS, ES). El desplazamiento se puede componer de varias partes.Decalage:es un nmero fijo.Una base:almacenada en registro base.Un ndice:almacenado en un registro ndice.DIRECCIN REAL = 10h * (@inicial del segmeto) + DESPLAZAMIENTOEl uso de diferentes registros de segmento significa que hay reas de trabajo separadas del programa, la pila, los datos. Cada rea de trabajo tiene 84 Kb como mximo. Como tenemos 4 registros de segmentacin, el rea de trabajo podr llegar a 4 * 64 = 256 Kb.El programador puede determinar la posicin de estos segmentos al principio del programa o mientras se ejecuta cambiando dinmicamente la direccin de estos segmentos.7.- Instrucciones bsicas del 8086 o 8088:7.1.- De transferencias de datos: MOV destino, fuente: transfiere un byte o una palabra desde el operando fuente al operando destino. El destino puede ser un registro o un elemento de memoria. El operando fuente puede ser un registro, un elemento de memoria o un valor inmediato. Ambos operandos deben ser del mismo tipo.No se pueden mover datos entre dos elementos de memoria.MOV AX, PEPE Juan y Pepe son dos elementos de mem. luego no lo podemosMOV JUAN, AX hacer directamente, as que utilizamos el auxiliar {AX}.No se puede mover un valor inmediato a un registro de segmento:MOV ES, 113 ES: registro de memoriaMOV AX,113 113: valor inmediato.MOV ES, AXNo se puede utilizar CS como operando destino.1. XCHG destino, fuente: intercambia los contenidos de las palabras fuente y destino.1. PUSH fuente: introduce el dato en la pila. No se puede utilizar CS como operando fuente. Equivale a decrementar el puntero de la pila SP en 2(equivale a una palabra) y luego transferir la palabra del operando fuente a lo alto de la pila.Queremos que la variable PEPE entre en la pila: PUSH (PEPE) SUB SP, 2MOVE AX,PEPEMOVE {SP}, AX POP destino:Extrae un dato de la pila y lo lleva al destino.POP AXMOV AX, {SP}ADD SP,2Queremos sacar de la pila la variable PEPE:POP PEPEMOVE AX,{SP}ADD SP, 2MOVE PEPE,AX1. IN acumulador, puerto:lee el contenido del puerto de E/S y lleva el dato al acumulador.1. OUT puerto, acumulador:enviar el dato al puerto de E/S1. LEA registro, fuente:carga la direccin efectiva de un dato en un registro. El operando fuente debe ser un operando de memoria y el destino es un registro de 16 bits.LEA AX, XX {SI}Si XX = 1234hSI = 0006hAX ser igual a 123Ah1. LDS registro, fuente:transfiere un puntero de 32 bits (direccin completa compuesta por desplazamiento y segmento) correspondiente al segundo operando (debe ser un operando de memoria de doble palabra). El registro de segmento es el DS.1. LES registro, fuente:igual al anterior pero utiliza el segmento ES.7.2.- De aritmtica binaria a entera:Las operaciones en aritmtica binaria a entera permiten a la CPU realizar clculos con nmeros enteros positivos y negativos con una representacin en complemento a 2.1. NEG operando:cambia el signo del operando. Equivaldra al NOT del nmero y le sumara 1.1. ADD destino, fuente:destino = destino + fuente.1. ADC destino, fuente:destino = destino + fuente + carry (acarreo).1. SUB destino, fuente: destino = destino - fuente.1. SBB destino, fuente: destino = destino - (fuente + acarreo).1. MUL operando:multiplica sin considerar el signo. Multiplica el acumulador {AL} o {AX}por el operando fuente. Si el operando fuente es de tipo byte, el resultado se almacena en AX y si es de tipo palabra el resultado se almacena en AX la parte inferior y en DX la palabra superior.Si tipo fuente = byte:AX = AL * fuente (multiplicacin sin signo)Si tipo fuente = palabra:DX, AX = AX * fuente (multiplicacin sin signo)Si mitad superior (CF: acarreo) del resultado = 0En CC CF = 11. IMUL operando:multiplica considerando el signo.1. DIV operando:divide sin considerar el signo, un nmero contenido en el acumulador entre el operando fuente. El cociente se almacena en el acumulador. El resto se almacena en la extensin del acumulador. Si la extensin de AX ser DX (que ocurrir cuando sea de tipo palabra), la operacin y la extensin de AL ser AH.AXAX ALDX1. IDIV operando:igual que el DIV pero considerando el signo.1. CBW:pasa de byte a palabra el contenido del acumulador.1. CWD:pasa de palabra a doble palabra el contenido del acumulador.1. INC destino:incrementa el destino.1. DEC destino:decrementa el destino.7.3.- Operaciones lgicas:Se usan para realizar operaciones a nivel de bits.1. NOT operando:cambia los bits 1 por 0 y viceversa y devuelve el resultado en el mismo operando.AL = F2h AL 1111 0010NOT AL; NOT AL 0000 1101 = Odh1. OR destino, fuente:operacino lgico inclusivo. El resultado se almacena en destino.AX = FEDC h = 1111 1110 1101 1100BX = 1234 h = 0001 0010 0011 0100OR AX, BX 1111 1110 1111 1100 = FEFC h1. AND destino, fuente:la operacinY lgicaentre 2 operandos, el resultado se deja en destino.AX = FEDC h 1111 1110 1101 1100BX = 1234 h 0001 0010 0011 0100ADD AX, BX 0001 0010 0001 0100 = 1214 h1. XOR destino, fuente:la operacino lgico exclusiva; el resultado se deja en destino.AX = FEDC h 1111 1110 1101 1100BX = 1234 h 0001 0010 0011 0100XOR AX, BX 1110 1100 1110 1000 = ECE8 h7.4.- Operaciones de desplazamiento y rotaciones:1. SAL destino, contadorySHL destino, contador:realizan la misma operacin y son lgicamente la misma instruccin. Desplaza a la izquierda los bits del operando destino, el nmero de bits indicado en el segundo operando. Si el nmero de bits a desplazar es 1, se puede especificar directamente. Si es mayor que 1, su valor debe cargarse en CL y especificar CL como segundo operando. Desplazar a la izquierda una vez equivale a multiplicar por dos.MOV CL, 2 AL = 1100 1100 b CF = 1SAL AL, CL AL = 0011 0000 b CF = 11. SAR destino, contador:desplazamiento aritmtico a la derecha. Desplaza a la derecha los bits del operando destino, el nmero de bits especificados por el segundo operando. Los bits de la izquierda se rellenan con el bit del signo del primer operando. Si es mayor que 1, su valor debe cargarse en CL y especificar CL como segundo operando. Desplazar a la derecha una vez es como dividir por 2.MOV CL, 2 AL = 1100 1100 b CF = 0SAR AL, CL AL = 1111 0011 b CF = 01. SHR destino, contador:desplazamiento lgico a la derecha. Desplaza a la derecha los bits del segundo operando destino, el nmero de bits que especifica en el 2 operando. Se rellena con 0.MOV CL, 2 AL = 0011 0011 b CF = 0SHR AL, CL AL = 0000 1100 b CF = 11. ROL destino, contador:rotar a la izquierda los bits del operando destino el nmero de bits como indique el segundo operando. Si el nmero de bits a desplazar es uno se puede especificar directamente y si es mayor debe cargarse en CL.MOV CL,2 AL = 1100 1100 CF= 0ROL AL, CL AL = 1001 1001 CF = 1AL = 0011 0011 CF= 11. ROR destino, contador:rotar a la derecha los bits del operando destino el nmero de bits como indique el segundo operando. Si el nmero de bits a desplazar es uno se puede especificar directamente y si es mayor debe cargarse en CL.1. RCL destino, contador:rotar a la izquierda a travs del acarreo. Lo de desplazar igual que lo anterior.1. RCR destino, contador:rota a la derecha a travs de acarreo. Lo de desplazar es igual a todo lo anterior.8.- Funcin de gestin de cadena:Una cadena es una serie de bytes o palabras de hasta 64 Kb. Por defecto estas instrucciones suponen que por un lado de la cadena fuente viene del segmento de datos(DS) y desplazamiento (SI) y la cadena destino viene del segmento extra (ES) y desplazamiento (DI).Los registros SI y DI se actualizan automticamente despus de cada operacin. Si l o los operandos son de tipo byte, el incremento es a 1 y si son de tipo palabra el incremento es 2. A su vez este incremento puede ser positivo o negativo segn el estado de la bandera de direccin (DF). Si DF est a 0 el incremento es positivo y si est a 1 el incremento es negativo.1. MOVS cadenadestino, cadenafuente:transfiere un byte o una palabra de la cadena fuente (direccionada por SI) en el segmento de datos a la cadena destino (direccionada por DI) en el segmento extra. Actualiza SI y DI para que apunten al siguiente elemento de la cadena. (MOVSB) La cadena est compuesta por bytes. DS : {SI} a ES : {DI}1. (MOVSW) La cadena est compuesta por palabras. DS : {SI} a ES : {DI}Los operandos especificados en MOVS los utiliza el ensamblador slo para verificar el tipo (si es byte o es palabra) y para ver si se ha especificado un registro de segmento. MOVS se puede reasignar el elemento fuente, pero no el destino.REP:repite la operacin de cadena y hace que se repita un determinado nmero de veces que vendr especificado en el registro contador. REPE: repite si igual1. REPNE: repite si no igual.1. REPZ: repite si cero.1. REPNZ: repite si no cero.Mover 100 bytes o palabras desde FUENTE (en el segmento de datos) a DESTINO (en el ES).CL DLEA SI, FUENTELEA SI, DESTINOMOV CX, 100REP MOVS{DI}, {SI}1

1.- SISTEMAS NUMERICOSComencemos por los sistemas de numeracin que ms utilizaremos alprogramar.El bsico va a ser el sistema hexadecimal, aunque debemos de explicarantes el binario, el sistema de numeracin que utiliza el ordenador.Los nmeros que conocemos estn escritos en base 10. Esto significa quetenemos, desde el 0 hasta el 9, diez smbolos para representar cada cifra.Es decir, cada cifra irde 0 a 9, y al superar el valor "9", cambiar a0 y sumar uno a su cifra de la izquierda: 9+1:10.El sistema binario utiliza tan slo dos smbolos, el "0" y el "1".Imaginemos que tenemos el nmero binario "0". Al sumarle una unidad,este nmero binario cambiar a "1". Sin embargo, si volvemos a aadirleotra unidad, este nmero en formato binario ser el "10" (aumenta lacifra a la izquierda, que era 0, y la anterior toma el valor mnimo).Sumemos ahora otra unidad: el aspecto del nmero ser "11" (tres endecimal). Y podramos seguir:Binario: 0 ; 1 ; 10 ; 11 ; 100 ; 101 ; 110; 111 ; 1000 ; 1001 ; 1010,...Decimal: 0 1 2 3 4 5 6 7 8 9 10Esto nos permite establecer un sistema bastante sencillo de conversindel binario al decimal;He aqu los valores siendo n el valor de la cifra:Cifra menos significativa:n*2^0 = 1 si n=1 o 0 si n=0Segunda cifra:n*2^1 = 2 si n=1 o 0 si n=0Tercera cifra:n*2^2 = 4 si n=1 o 0 si n=0Cuarta cifra:n*2^3 = 8 si n=1 o 0 si n=0Etc.,...Y as continuaramos, aumentando el nmero al que se eleva 2. Traduzcamosentonces el nmero binario '10110111'2^7+ 0 +2^5+2^4+ 0 +2^2+2^1+2^0 = 128 + 0 + 32 + 16 + 4 + 2 + 1 = 1831 0 1 1 0 1 1 1De todos modos, esta transformacin est expuesta simplemente para que secomprenda con ms claridad cmo funcionan los nmeros binarios. Es muchoms aconsejable el uso de una calculadora cientfica que permita realizarconversiones entre decimales, hexadecimales y binarios. Se hace su usoya casi imprescindible al programar.La razn del uso de los nmeros binarios es sencilla. Es lo que entiendeel ordenador, ya que interpreta diferencias de voltaje como activado ( 1 )o desactivado ( 0 ), aunque no lo detallar. Cada byte de informacin estcompuesto por ocho dgitos binarios, y a cada cifra se le llama bit. Elnmero utilizado en el ejemplo, el 10110111, sera un byte, y cada una desus ocho cifras, un bit.Y a partir de ahora, cuando escriba un nmero binario, lo har con lanotacin usual, con una "b" al final del nmero (ej.: 10010101b)Ahora pasamos al hexadecimal, muy utilizado en Ensamblador. Se trata deun sistema de numeracin en base diecisis. Por tanto, hay diecisissmbolos para cada cifra, y en vez de inventarse para ello nuevos smbolos,se decidi adoptar las primeras letras del abecedario. Por lo tanto,tendremos ahora:Hex Dec1 --> 12 --> 23 --> 34 --> 45 --> 56 --> 67 --> 78 --> 89 --> 9A --> 10B --> 11C --> 12D --> 13E --> 14F --> 1510 --> 1611 --> 17Etc.,...Como vemos, este sistema nos planteas bastantes problemas para laconversin. Repitiendo lo dicho, una calculadora cientfica nos ser imprescindible.Por qu utilizar este sistema?. Volvamos al byte, ytraduzcamos su valor ms alto, "11111111". Resulta ser 256. Ahora pasemosesta cifra al sistema hexadecimal, y nos resultar "FF". Obtenemos unnmero ms comprensible que el binario (difcil de recordar), y ante todomucho ms compacto, en el que dos cifras nos representarn cada byte.Podremos adems traducir fcilmente el binario a hexadecimal con estatabla; cada cuatro cifras binarias pueden traducirse al hexadecimal: Binario Hexadecimal 0000 00001 10010 20011 30100 40101 50110 60111 71000 81001 91010 A1011 B1100 C1101 D1110 E1111 FPor ejemplo, el nmero binario:1111001110101110En hexadecimal sera:1111 0011 1010 1110F 3 A EPara referirnos a un nmero hexadecimal sin especificarlo, usaremos lanotacin que se suele usar al programar, con un 0 al principio, (necesariocuando hay letras), y una h al final. Por ejemplo, el nmero anterior sera0F3AEh............................................................................................................................2.- OPERACIONES CON BYTESHay cuatro operaciones bsicas que se pueden realizar con un nmerobinario, y coinciden con operaciones de la lgica matemtica, con lo quecualquiera que la haya estudiado tendrcierta ventaja para entenderla.Para explicarlas, llamaremos al valor 0 resultado "falso", y al valor 1"verdadero". Las operaciones son AND, OR, XOR y NOT2.-1.- ANDEs un 'y' lgico. Se realiza entre dos cifras binarias confrontando cadacifra con su correspondiente, y el resultado ser "1" si las dos sonverdaderas (si las dos valen "1"), y "0" (falso) en el resto de loscasos.1.numero 2.numero Resultado1 1 11 0 00 1 00 0 0Volvemos a la lgica para explicarlo ms claramente: Imaginemos la frase:"El hombre es un mamfero y camina erguido". El hecho de que el hombre seaun mamfero es cierto ( 1 ), y el de que camine erguido, otro ( 1 ). Porlo tanto, al unirlos mediante una conjuncin ( 'y' o 'AND' ), resulta queya que se dan las dos, la oracin es verdadera.Pongamos un ejemplo ms complejo. Queremos realizar un AND lgico entredos bytes:11011000 AND 01101001Observemos lo que sucede:11011000 216AND 01101001 En sistema decimal sera: AND 105-------- (aunque en sistema decimal ---01001000 es ms complejo). 72Cuando coinciden dos valores de "verdad", el resultado es "verdad",si uno es falso, el resultado es "falso" (no es verdad que "El hombrees un mamfero y respira debajo del agua"), y si los dos son falsos, elresultado es falso (no es cierto que "El hombre es un ave y respiradebajo del agua" )2.-2.- OREl "o" lgico. El resultado es "verdadero" cuando al menos uno de losfactores es verdadero. O sea, es "1" cuando al menos uno de los dos factoreses "1".Sera como la frase "Voy a buscar el disco o el cd", dondeque uno sea cierto no significa que el otro no lo sea; es cierta la frase,es verdadera mientras uno de los trminos sean verdaderos.Operemos con los nmeros "10100110" y "01101100":10100110OR 0110110011101110Como hemos visto, el valor 1 ( verdadero ) queda en las cifras de lasque, confrontadas, al menos una es verdadera. Slo resulta 0 ( falso ) silos dos nmeros confrontados son 0 ( falsos ).2.-3.- XOR"Or" exclusivo. Se trata de una orden parecida al OR, tan slo quela verdad de una excluye la de la otra. El resultado, por tanto, es "1"(verdad) cuando uno y slo uno de los dos nmeros es verdadero (y elotro falso, claro). Sera como la oracin "O vivo o estoy muerto": paraque sea cierta se tiene que dar una de las dos, pero nunca las dos oninguna.10111001XOR 0101110111100100La orden XOR va a ser bastante til en encriptacin, como ya veremos ms adelante.2.-4.- NOTEsto se aplica sobre un solo nmero, y en trminos de lgica sera lanegacin de una oracin, o sea, si el nmero al que se aplica es 1, elresultado es 0, y viceversa. En trminos de lgica matemtica, aplicndoloa una oracin, sera por ejemplo "No es verdad que tenga ganas de estudiary de no dormir", negando las otras dos que en caso contrario seran verdad:NOT 1110011000011001Tan slo, por si alguien no lo conoce, quiero detallar el modo dealmacenamiento del ordenador, incluyendo lo ms temido por el iniciado enEnsamblador, y ms engorroso para el programador: Segments y Offsets.La unidad mnima de informacin es el bit. Su estado, como vimosanteriormente, puede ser 1 o 0.Un conjunto de ocho bits, forman un byte. De ellos, el de la derechaes el menos significativo (su valor es menor), y el de ms a la izquierdael ms significativo.Un Kbyte es un conjunto de 1024 (que no 1000) bytes. Igualmente, unMegaByte sern 1024 kbytes, o 1024*1024=1048576 bytes.Otro trmino que utilizaremos a menudo, es palabra, o "word". Una"palabra", es un conjunto de dos bytes, y se utiliza porque a menudo seopera con ellas en lugar de bytes.Y ahora, veamos los segments y offsets.Resulta que hubo un tiempo, cuando los dinosaurios dominaban la tierra,en el que a "alguien" se le ocurri que con 640K debera de bastarnos parahacerlo todo. Y bien, por aqu vienen los problemas.El ancho de bus de direcciones, para localizar un punto en memoria, esde 20 bits. Por lo tanto, el nmero mximo de direcciones de memoria a lasque podremos acceder ser 1 Mb. Pero como veremos, 20 bits no son ni 2 bytesni 3, sino algo as como 2 y medio. El problema es ordenarlos para que elprocesador conozca la direccin de memoria.Necesitaremos para conocer una posicin de memoria, cuatro bytescombinados de una curiosa manera.Imaginemos los dos bytes inferiores. Su mayor valor puede ser 0FFFFh(poner un cero delante es una convencin, para que lo entiendan losensambladores, al igual que la h al final indicando que es un nmerohexadecimal). Esto nos da acceso a 64Kb de memoria, que se considera unbloque. Tambin, a partir de ahora, llamaremos Offset a la direccinindicada por estos dos bytes.Ahora querremos ms memoria que 64 Kb. Y para eso tenemos losotros dos bytes. Para formar la direccin completa, se toman los 16 bitsdel registro de segmento y se sitan en los 16 bits superiores de ladireccin de 20 bits, dejando los otros cuatro a cero. Es como siaadisemos cuatro ceros a la derecha. Sumamos entonces a este valor de20 bits el Offset, resultando la direccin real de memoria.Veamos una explicacin ms grfica.Sea el valor de Segmento 0Ah (o sea, 10 decimal o 1010b, binario).Y el del Offset digamos que va a valer (en binario) 01011111 00001010.La suma para obtener la direccin de memoria sera:0000 0000 0000 1010 0000 (segmento multiplicado*16, con 4 ceros ms)+ 0101 1111 0000 1010 ( el offset )0000 0101 1111 1010 1010Y sta sera la direccin "real" de memoria ( 05FAAh o 24490 Dec ). ComoPuede observarse, y como curiosidad final, distintos segments y offsetsespecifican direcciones de memoria distintas; por ejemplo, los pares0040h:0000 (donde el primero es el Segment y el segundo el Offset, aslo tomaremos a partir de ahora), son iguales que 0000:0400h, y los dosse referiran a la misma posicin de memoria fsica, la 0400h o 1024d..........................................................................................................................3.- EL JUEGO DE REGISTROSHay algunas preguntas que podramos hacernos ahora: el Segment y Offset,dnde se guardan, que indica al ordenador esos sitiosen memoria, qu indica al ordenador en qu punto de la memoria est y qutiene que ejecutar? Pues bien, para esto y mucho ms sirven los registros.Se trata de una serie de "variables", que contienen informacin quepuede ser cambiada.Comenzaremos por los de segmento y offset actual: CS e IP.El registro CS es una variable de un tamao de dos bytes. Contiene elSegmento actual en que se encuentra el programa. IP, es la variable, dedos bytes tambin, que contiene el Offset actual. Esto significa que elordenador va interpretando las secuencias de bytes, pero necesita "algo"que le indique dnde tiene que leer. La combinacin CS:IP (tal y comome refer antes en lo de Segments&Offsets), contiene la direccin en laque el ordenador estinterpretando informacin "en el momento". O sea,indica la direccin de la prxima instruccin que se va a ejecutar.El registro DS y el registro ES tambin sirven para guardar direccionesde Segmentos, y tambin son variables de dos bytes; sern utilizados para,por ejemplo, mover datos en memoria, imprimir cadenas, etc.Digamos que son "punteros", que apuntan a cierta zona dememoria (siempre combinado con otro que haga de Offset).El registro SS apunta a la pila, y el SP es el que contiene el offsetde la pila, pero esto lo explicaremos ms adelante.Luego tenemos una serie de registros que utilizaremos ms comnmente:AX, BX, CX y DX.Todas ocupan dos bytes, y se pueden utilizar divididas en dos partes delongitud un byte, cambiando de nombre. AX se divide en AH y AL, BX enBH y BL, CX en CH y CL y DX en DH y DL. La 'H' se refiere a High en ingls,alto (de mayor valor), y la 'l' a Low (de menor valor). Veamos una ilustracin:AX11010110 10111000AH ALLas funciones de estos cuatro registros son diferentes: AX se sueleutilizar como propsito general; indica funcin a las interrupciones, etc.,y es el ms flexible, ya que ser el nico que permita multiplicacionesy divisiones. Se denomina a veces acumulador.BX nos servir mucho como "handler", para abrir/cerrar archivos, etc., ycomo registro de propsito general al igual que AX, CX y DX.CX se suele usar como contador.DX suele ser el puntero, sealando haciendo el papel de Offset lugaresen memoria (suele combinarse con DS en la forma DS:DX)Y nos quedan ya slo tres registros, BP, SI y DI, que son tambinpunteros. SI y DI los utilizaremos a menudo para copiar bytes de un ladoa otro, etc. Ni que decir que, como el resto de registros, contienen dosbytes. Igual sucede con BP, de otros dos bytes de tamao.............................................................................................................4.- COMENZAMOSPor fin vamos a empezar con rdenes en ensamblador. Y comenzaremos conla ms sencilla, pero curiosamente la ms utilizada en este lenguaje:La orden MOV.La funcin de la orden MOV es, como su nombre da a entender, "mover" unvalor. Pongamos un ejemplo:MOV AX,BXEsta orden en lenguaje Ensamblador, copiar el contenido de BX en AX,conservando el valor de BX. He aqu algn ejemplo ms:MOV AX,DSMOV ES,AXMOV DX,AXMOV AL,DHComo se ve, no se puede realizar MOV AL,BX, ya que en AL no cabe BXTambin se puede introducir un valor directamente en un registro. Serael caso de:MOV AX,0FEA2hMOV BL,255MOV DH,01110101bPongamos ejemplos de cmo se utiliza la numeracin. El primeroera un nmero hexadecimal, el segundo decimal, que no va acompaado pornada para indicarlo, y el tercero binario, con la b al final. A veces,para representar un nmero decimal, se pone una 'd' al final (p.ej., 10d)Ms utilidades de MOV. Podemos transferir bytes que estn en memoriaa un registro, o de un registro a memoria. Vayamos con los ejemplos:MOV AX,[BX]Y pongamos que en BX est 0EEEEh. En vez de transferir a AX el valor0EEEEh, le transferiremos el valor que haya en la posicin de memoriaCS:BX; si CS por ejemplo vale 0134h y BX 03215h, transferiramos el byteque hay en 0134:03215h y el siguiente a AX.Se puede hacer tambin al revs;MOV [AX],CXEscribiramos en la direccin de memoria CS:AX el valor de CX.Y tambin podremos usar valores numricos:MOV AX,[2325h] (lo que hay en CS:2325h)MOV AX,DS:[2325h] (el valor en DS:2325h)MOV AX,DS:DX (el valor en DS:DX)MOV DX,CS:CX (a DX, valor en CS:CX)MOV BX,CS:1241h (a BX, valor en CS:1241h)Muchas veces, se utiliza Word Ptr o Byte Ptr, que aclaran el tamao atransferir:MOV AL,BYTE PTR [BX+SI-30h]MOV AX,WORD PTR [BX+DI]Como acabamos de ver, es posible hacer "sumas" de valores al buscaruna direccin en memoria. Otros ejemplos seran:MOV AX,[BX+3]MOV [BP+SI],AHY para acabar este apartado, he aqu una tablilla de ejemplos sobre MOVs que se pueden hacer: Formatos de la instruccin MOV 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: registro mem:memoria inmed:nmero inmediatosegreg: registro de segmento reg16: registro de 16 bitsY vista la orden MOV, seguimos adelante...................................................................................................................5.- OPERACIONES5.-1.- Las instrucciones INC y DEC:Son las ms bsicas a la hora de hacer operaciones con registros: INCincrementa el valor de un registro,o de cualquier posicin enmemoria, en una unidad, y DEC lo decrementa. Veamos:INC AXIncrementa en uno el valor de AXINC WORD PTR [BX+4]Incrementa la palabra situada en CS:[BX+4] en uno.DEC AXDecrementa AX, le resta uno.DEC WORD PTR [BX+4]Decrementa la palabra situada en CS:[BX+4] en una unidad.Estas dos instrucciones, equivalentes a "a++" en C, nosservirn bastante como contadores para bucles.5.-2.- Las instrucciones ADD y SUBSe trata de dos operadores que contiene cualquier lenguaje deprogramacin: la suma y la resta. Tienen dos operandos, uno de destino yotro fuente. Para la suma, se suman los dos operandos y se almacena enel primero (destino), y para la resta, se resta al primero el segundo,almacenndose en destino, el primero. Aqu estn algunos formatos de estasinstrucciones:ADD AX,BX ; Sumara AX y BX y lo guardara en AXADD [AX],BX ; Suma el contenido de la direccin de AX a BX,;y se almacena en la direccin de AXADD AX,[BX] ; Se suman AX y el contenido de la direccin de;BX, y se almacena esta suma en AXADD AX,3 ; Lo mismo pero utilizando un valor inmediato;en vez de la BX sealada anteriormente.SUB CL,DL ; Resta de CL el valor de DL, y se almacena en CLSUB [CX],DX ; Se resta al contenido de la direccin de CX;el valor de DX, y se almacena en la dir. de CXSUB CX,23h ; Se resta de CX el valor 23h, y queda en CX el;resultadoY si el resultado excede lo que puede contener el byte, o la palabra?.Esto se puede saber mediante los flags, que trataremos ms adelante.Tambin es resaltable que separa con ; los comentarios. Bien,sta es la manera en Ensamblador de poner comentarios, como sera en Basicla orden "REM", o en C la convencin "/* [...] */"5.-3.- NEG, NOT y operaciones lgicasNeg pone el registro o el lugar al que apunta en memoria en negativosegn la aritmtica de complemento a dos tal que : NEG AX o NEG [AX]Not es la que, como vimos, "invierte" los valores de los bits. Y elresto de operaciones lgicas tambin las vimos anteriormente. Pondremos ahoratan slo su sintaxis:NOT SI ; (o Not AX, etc.,... o sea, con un registro)NOT Word ptr es:[ax] ; Lo realiza sobre la palabra ( 2 bytes );que se encuentra en es:[ax]AND AX,BX ; Efecta un AND entre AX y BX, almacenando;el resultado en AX ( siempre en el primer;trmino )AND [AX],BX ; Lo dicho, pero AX apunta a un lugar de;memoriaAND AX,[BX]AND Byte ptr [15],3 ; Un AND en la direccin :0015 con lo que;haya ah y el valor "3"OR AX,BXOR [AX],BXOR Byte ptr [15],3OR DH,55h ;Tambin podra hacerse en el AND, se;confrontan DH y 55h en un OR.Y todo lo dicho para OR y AND vale para XOR, de tal maneraque las operaciones son realizables entre:Registro y registro CX,DXLugar de memoria y registro [DX],BXRegistro y lugar de memoria AX,[SI]Lugar de memoria y nmero word ptr ES:[AX],0D533hRegistro y nmero AX,0CD32h5.-4.- Multiplicacin y divisin, MUL y DIVEstas operaciones multiplican al acumulador por el operando indicado.Si el operando es de 8 bits (1 byte), el acumulador es AL. Si eloperando es de 16 bits, el acumulador es AX. El resultado se almacenaen AX o en el par DX-AX respectivamente, si el operando es de 8 bits o16 bits.Tambin tendremos que diferenciar entre dos tipos de multiplicacionesy divisiones que entiende el procesador. Los que comienzan con una Ioperan con nmeros con signo, si queremos usar nmeros negativos,y los que no, con nmeros sin signo.Visto esto, podremos decir que:MUL Byte Ptr [CX]Va a multiplicar el byte que hay en la direccin que marca CX por elcontenido que hay en AL, y una vez hecho esto, va a almacenarlo en AX.MUL SIMultiplicara SI por el contenido de AX, almacenndose en el par AX-DX.La palabra superior, de ms valor, se devolvera en DX, y la inferioren AX.IMUL SIEsto y el ejemplo anterior sera lo mismo, slo que operando connmeros con signo.Para la divisin, el dividendo ha de estar en AX, y ser 16 bits portanto. El divisor se indica en el operando, por ejemplo en DIV BL; estedivisor estara en BL. Se dividira AX entre BL y el resultado quedara enAL, quedando el resto en AH. Vamos a ver algn ejemplo.En la divisin de un nmero de diecisis bits entre otro de 8 bits, elcociente y resto sern de 8 bits (1 byte). El dividendo ha de estar en AX,y el divisor es el operando de la instruccin, que puede ser un registro oun sitio en la memoria, y se necesita poner lo de byte ptr.O sea, sera tal que:DIV CL o IDIV BYTE PTR ES:[BP]El resultado se devuelve en AL, y el resto en AH. Si por ejemplo AXvaliese 501d y cl valiese 2, al hacer el DIV CL, en AL quedara 255 y en AHquedara 1.Se puede dividir tambin un nmero de 32 bits (4 bytes) entre otro de16 bits (2 bytes), con lo que cociente y resto seran de 16 bits. Eldividendo estara formado por el par DX/AX. Al hacer por ejemplo un:DIV SISe dividira DX-AX entre SI, almacenndose el resultado en AX, y el restoen DX. Por ejemplo:Si en DX est el valor 003Fh y en AX 5555h, el par sera 3F5555h, con loque al dividirlo por SI (que pongamos que vale 0CCC4h), se almacenara enAX el resultado y en DX el resto........................................................................................................................6.- FLAGSLa explicacin de los "flags" est relacionada con los saltos condicionales.Los que hayis visto un mnimo de otros lenguajes recordaris las sentenciasFOR y NEXT (en Basic), o el IF/THEN/ELSE tambin en estilo Basic pero quetambin se encuentran en otros lenguajes. Pues bien, los flags y las instruccionescondicionales va a ser lo que os encontris en este captulo.Veamos el registro de flags.A las flags, "banderas", las agrupa un solo registro de 16 bits, aunqueste no est utilizado por completo, ya que cada flag ocupa un solo bit.Qu son los flags?Se trata de varios bits, que, como siempre, pueden valer uno o cero, ydependiendo de su valor indican varias cosas. El registro de flags es comosigue: O D I T S Z A P C O: Overflow D: Direccin I: Interrupciones rehabilitadasT: Trampa S: Signo Z: CeroA: Acarreo auxiliar P: Paridad C: Acarreo : No utilizadoCada cuadro representa un bit como es fcil adivinar. Tambin est claro quecada bit que se utiliza tiene un nombre, y como se ver, tambinuna utilidad. Aqu explico el significado de losms importantes:EL FLAG DE ACARREOHay veces en la operaciones en las que el nmero se desborda, o sea, nocabe en el registro o en la posicin de memoria. Imaginemos que tenemos enAX el nmero 0FFFFh y le sumamos 0CCCCh. Como es lgico, el resultado no noscabren AX. Al realizar esta suma, tenemos que tener en cuenta que elsiguiente nmero a 0FFFFh es 0000h, con lo que podremos ver el resultado.Igual pasarsi a 0000h le restamos, por ejemplo, 1 (el resultado ser0FFFFh). Pero de alguna manera nos tenemos que DAR CUENTA de que esto hasucedido.Cuando se opera y hay acarreo en el ltimo bit sobre el que se haoperado, el flag de acarreo se pone a uno, es decir, cuando ese nmero se hadesbordado. Hay que recordar tambin que las instrucciones INC y DEC noafectan a este flag. Veamos los efectos de estas operaciones:MOV AX,0FFFFhINC AX ; AX vale ahora 0, el flag de acarreo tambinDEC AX ; AX vale 0FFFFh, y el flag sigue inalteradoADD AX,1 ; AX vale 0, y el flag de acarreo est a 1MOV BX,0000hADD BX,50h ; El flag de acarreo se pone a 0, no ha habido;acarreo en esta operacinSUB AX,1 ; Ahora AX vale otra vez 0FFFFh, y el flag de acarreo;se pone de nuevo a uno.En resumen, se activa cuando tras una operacin hay un paso del valormximo al mnimo o viceversa.Este flag nos va a ser tambin til al comprobar errores, etc. Porejemplo, si buscamos el primer archivo del directorio y no hay ninguno,este flag se activar, con lo que podremos usar los saltos condicionales,pero esto ya se explicar ms adelante.EL FLAG DE SIGNOA veces interesa conocer cundo un nmero con signo es negativo o positivo.Evidentemente, esto slo tiene efecto cuando estamos tratandocon nmeros enteros con signo, en complemento a dos. Indica cuando tras unaoperacin aritmtica (ADD, SUB, INC, DEC o NEG o lgica (AND, OR o XOR)el resultado es un nmero en complemento a dos. En realidad, es la copia delbit de mayor peso del byte, el que indica cundo el nmero es negativo.Por lo tanto, cuando vale 1 es que el nmero es negativo y si vale 0 esque es positivo.EL FLAG DE DESBORDAMIENTO ("Overflow")Se trata de un flag bastante parecido al de acarreo, pero que acta connmeros en complemento a dos y se activa cuando se pasa del mayor nmeropositivo (127 en un solo byte) al menor negativo (-128 en tamao de unbyte).Este flag, al contrario que el de acarreo, SI es afectado por lasinstrucciones de decremento e incremento.EL FLAG DE CEROEs de los ms sencillos de comprender. Simplemente se activa cuando elresultado de una operacin aritmtica o lgica es cero. Es evidente la gran utilidad del flag.Tenemos, por ejemplo, dos registros, AX y CX, que queremos comparar para saber si son iguales.Para saberlo, no tendramos ms que restar uno del otro, y si el resultadoes cero (o sea, si el flag de cero se pone en uno), podremos hacer unsalto condicional.O sea, de unSUB CX,AXSi son iguales, el flag de cero se pondr a uno.EL FLAG DE PARIDADSe utiliza especialmente en la transmisin de datos para la comprobacinde errores, ya que comprueba si el resultado de la ltima operacinaritmtica o lgica realizada tiene un nmero par o impar de bits puestosa uno. Se pondra uno cuando haya un nmero par de bits, y a cero cuandosea impar.RESTO DE FLAGSNo describir ms flags detalladamente, ya que su importancia es casinula; por ejemplo est el flag de interrupcin, que, cuando est activado,evita la posibilidad de interrupciones en secciones crticas de cdigo, oel de trampa, que cuando est activado provoca una INT 1h cada vez que seejecuta otra instruccin, pero creo que su inters es escaso, al menos porel momento.6.-1.- INSTRUCCIONES DE COMPARACIONNos van a servir para realizar las comparaciones, y son:CMP y TESTCMP compara dos registros, o un registro y una direccin de memoria.Tiene el mismo formato que el SUB (por ejemplo CMP AX,BX), tan slo queninguno de los registros es alterado. Si por ejemplo son iguales, el flagde cero se pondren uno. Es en realidad un SUB del que no se almacena elresultado.TEST, comprobar, se puede realizar con el mismo formato de AND, ya quees equivalente a ella, tan slo que no se guarda el resultado, aunque s semodifican los flags.Y en el prximo captulo veremos cmo se aplican estos flags, y cmorealizar los saltos comparativos........................................................................................................................7.- LAS INSTRUCCIONES DE SALTO7.-1.- SALTOS INCONDICIONALESEmpecemos por el salto sin condiciones, con el que podremos cambiarel control a cualquier punto del programa. Sera como el "Goto" del Basic,simplemente transferir el control a otro punto del programa. La orden esJMP (de Jump, salto)Si se recuerdan los registros CS:IP, se podr ver qu eslo que hace realmente la instruccin, y no es ms que incrementar odecrementar IP para llegar a la zona del programa a la que queremostransferir el control (IP es el Offset que indica la zona de memoriaque contiene la siguiente instruccin a ejecutar, y CS el segmento).El formato ms sencillo para el salto sera JMP 03424h, lo que saltaraa esa zona. Pero es algo complejo calcular en qu direccinva a estar esa instruccin, con lo que utilizaremos etiquetas. He aquun ejemplo:MOV AX,0CC34hMOV CL,22hJMP PALANTEVUELVE: CMP BX,AXJMP FINPALANTE: MOV BX,AXJMP VUELVEFIN: XOR CX,CXAhora comentaremos un poco el programa. Tras la primera instruccin,AX vale 0CC34h, y tras la segunda, CL vale 22h. Despus se realiza un saltoa la instruccin etiquetada con "PALANTE". La etiqueta ha de estarcontinuada por dos puntos ':', y puede ser llamada desde cualquier lugar delprograma. Tambin podremos hacer un MOV AX,[PALANTE], como hacamos antescon un MOV AX,[BX], pero asignando a AX el valor que haya en la direccinen la que est"PALANTE".El caso es que tras el salto a "PALANTE", se copia el valor del registro BXen AX, y se vuelve a "VUELVE". Se realiza una comparacin entre AX y BX, quepondr el flag de cero a 1 (recordemos la anterior leccin), se saltara "FIN", donde tan slo se realizar la orden Xor CX,CX cuyo resultado, porcierto, es poner CX a cero, tenga el valor que tenga.Volvamos con la sintaxis del JMP con algunos ejemplos de cmo utilizarlo:JMP 100hSalta a la direccin 100h. Un archivo .COM comienza normalmente en esadireccin, as que es posible verlo en algunos virus.JMP 542Ah:100hSalta a la direccin 100h pero del segmento 542Ah.JMP SHORT 223AhSalto corto a la direccin 223Ah.JMP NEAR 55AAhSalto cercano, es diferente al cortoJMP [100h]Salta a la direccin contenida en 100h. Sin embargo es un error, ya queno se especifica si es cercano, lejano, si se lee un solo byte,es decir,esta instruccin no es vlida.JMP WORD PTR [BX]Ahora s vale. Salta a la direccin contenida en la palabra (dosbytes) a la que apunta BX. O sea, si BX valiese 300h y en 300h los dosbytes fuesen 0CC33h, el JMP saltara a esta direccin.JMP DWORD PTR [BX+SI+5]Dword son 32 bits, o sea, un salto lejano. Y saltara al contenido enla direccin de memoria a la que apuntan la suma de BX,SI y 5.Veamos el significado de los saltos lejanos, cercanos y cortos. Elsalto corto se realiza entre el punto en el que se est y +127 o -128, osea, la cantidad que se puede contener en un byte con signo. A veceses necesario indicar que se trata de salto corto, cercano o lejano.El salto cercano se realiza contando como distancia el contenido de dosbytes, o sea, que el rango sera desde 32767 a -32768 bytes de distancia.Y el lejano se realiza contando como distancia el contenido de cuatroBytes.Por ejemplo, es incorrecto que haya en la direccin 100h una instruccinque diga JMP SHORT 500h, ya que la distancia no corresponde a un saltocorto. Adems, el salto dependiendo de que sea cercano, corto o largo secodifica de manera diferente en modo hexadecimal.7.-2.- SALTOS CONDICIONALESRecuerdan el IF-THEN-ELSE, o el FOR, o el WHILE-DO ?Bien, pues aqu est lo que suple a estas instrucciones en lenguajeEnsamblador. Se basan completamente en los flags, pero estn simplificados.Los saltos podran resumirse en un modo "Basic" de la manera IF-THEN-GOTOde forma que cuando se cumple una condicin se salta a un sitiodeterminado.He aqu los tipos de saltos condicionales (las letras en maysculas sonlas instrucciones):JO: Jump if overflow. Salta si el flag de desbordamiento esta unoJNO: Jump if not overflow. Salta si el flag de desbordamiento est acero.JC, JNAE, JB: Los tres sirven para lo mismo. Significan: Jump if Carry,Jump if Not Above or Equal y Jump if Below. Saltan por lo tanto si alhaber una comparacin el flag de acarreo se pone a 1; es entoncesequivalente a < en una operacin sin signo. Vamos, que se compara as:CMP 13h,18h, saltar, ya que 13h es menor que 18h. Tambin se suelen usarpara detectar si hubo fallo en la operacin, ya que muchas interrupcionesal acabar en fallo encienden el carry flag.JNC, JAE, JNB: Otros tres que valen exactamente para lo mismo. Jump ifnot Carry, Jump if Above or Equal y Jump if Not Below. Saltan por tanto sial haber una comparacin el flag de acarreo vale 0, o sea, es equivalenteal operador >=. En la comparacin CMP 0,0 o CMP 13h,12h saltar, ya que elsegundo operando es MAYOR O IGUAL que el primero.JZ o JE: Jump if Zero o Jump if Equal. Salta si el flag de cero esta1, o sea, si las dos instrucciones comparadas son iguales. Saltara en elcaso CMP 0,0JNZ o JNE: Jump if Not Zero o Jump if Not Equal. Salta si el flag de ceroest a 0, o sea, si las dos instrucciones comparadas no son iguales.JBE o JNA: Jump if Below or Equal o Jump if Not Above. Saltara si enresultado de la comparacin el primer miembro es menor o igual que elsegundo ( 100000011 ----> 301111111 ----> 12711111111 ----> -111111110 ----> -210000000 ----> -128Y visto esto, cul es la manera ms rpida de saber el valor de unnmero negativo? Es bien fcil; se da la vuelta a todos los bits del byte(o de la palabra), y se suma uno: ese ser el nmerorepresentado sin signo.Por ejemplo, el nmero 10111011, que sabemos que es negativo, (si estamostrabajando con nmeros negativos), por el 1 en el bit de mayor peso:Se le da la vuelta: 01000100, o sea, 68 decimal, y se le suma 1. Portanto, el nmero 10111011 cuando trabajemos con nmeros con signo es el -69