P. 1
unidad 2 ensamblador

unidad 2 ensamblador

4.38

|Views: 38.463|Likes:
Publicado porapi-3716700

More info:

Published by: api-3716700 on Oct 14, 2008
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

11/13/2015

pdf

text

original

Lenguaje Ensamblador

UNIDAD II ELEMENTOS DEL LENGUAJE
2.1 INSTRUCCIONES LINEALES.
2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 Movimientos. Pila. Matemáticos. Ajustes. Comparación.

2.2

SALTOS.
2.2.1 2.2.2 Incondicionales. Condicionales.

2.3

TIPOS DE CICLOS.

2.4 OPERADORES LÓGICOS. 2.5 DESPLAZAMIENTO.
2.5.1 2.5.2 Lineal. Circular.

2.6 PROCESOS DE CONTROL.
2.6.1 2.6.2 Banderas. Cadenas.

M. D. O. H. Sonia Alvarado Mares

77

Lenguaje Ensamblador

2.1 INSTRUCCIONES LINEALES.
2.1.1 Movimientos.
MOV (transferencia).
Sintaxis: Indicadores: MOV destino, origen OF DF IF TF SF ZF AF PF CF - - - - - - - -

La instrucción de transferencia de datos por excelencia es MOV. Transfiere datos de longitud byte o palabra del operando origen al operando destino. Pueden ser operando origen y operando destino cualquier registro o posición de memoria direccionada de las formas ya vistas, con la única condición de que origen y destino tengan la misma dimensión. Con la instrucción MOV diremos que se pueden realizar todo tipo de movimientos teniendo en cuenta las siguientes restricciones: 1. No se puede realizar una transferencia de datos entre dos posiciones de memoria directamente, por esta razón, siempre que queramos efectuarlas tendremos que utilizar un registro intermedio que haga de puente. Por ejemplo, para hacer la operación DATO1 ← DATO2 la instrucción MOV DATO2, DATO1 sería incorrecta. Lo que sí sería correcto sería utilizar el registro DX, u otro, como puente y hacer: MOV DX, DATO1 MOV DATO2, DX 2. Tampoco se puede hacer una transferencia directa entre dos registros de segmento. Por eso, como en el caso anterior, si fuera preciso se utilizaría un registro como puente. 3. Asimismo, tampoco se puede cargar en los registros de segmento un dato utilizando direccionamiento inmediato, es decir, una constante, por lo que también habrá que recurrir a un registro puente cuando sea preciso. Existen ciertas limitaciones, como que los registros de segmento no admiten el direccionamiento inmediato: es incorrecto MOV DS, 4000h; pero no lo es por ejemplo MOV DS, AX o MOV DS, VARIABLE. No es posible, así mismo, utilizar CS como destino (es incorrecto hacer MOV CS, AX aunque pueda admitirlo algún ensamblador). Al hacer

M. D. O. H. Sonia Alvarado Mares

78

Lenguaje Ensamblador
MOV hacia un registro de segmento, las interrupciones quedan inhibidas hasta después de ejecutarse la siguiente instrucción (8086/88 de 1983 y procesadores posteriores). Ejemplos: MOV MOV MOV DS, AX BX, ES:[SI] SI, OFFSET DATO

En el último ejemplo, no se coloca en SI el valor de la variable dato sino su dirección de memoria o desplazamiento respecto al segmento de datos. En otras palabras, SI es un puntero a DATO pero no es DATO. En el próximo capítulo se verá cómo se declaran las variables.

XCHG (intercambiar).
Sintaxis: Indicadores: XCHG destino, origen OF DF IF TF SF ZF AF PF CF - - - - - - - -

Una instrucción útil pero no imprescindible es XCHG. Intercambia el contenido de los operandos origen y destino. No pueden utilizarse registros de segmentos como operandos. Por ejemplo, si queremos intercambiar los contenidos de los registros AX y BX, podemos hacer: MOV AUX, AX MOV AX, BX MOV BX, AUX en donde AUX es una variable auxiliar que hace de puente, o simplemente utilizar: XCHG AX, BX Otro ejemplo: XCHG XCHG BL, CH MEM_PAL, BX

Las restricciones que presenta esta operación es que no se pueden efectuar intercambios directamente entre posiciones de memoria ni tampoco entre registros de segmento.

XLAT (traducción).
Sintaxis: Indicadores: XLAT tabla OF DF IF TF SF ZF AF PF CF - - - - - - - -

M. D. O. H. Sonia Alvarado Mares

79

Lenguaje Ensamblador
La instrucción XLAT tabla carga en el registro AL el contenido de la posición [BX][AL], en donde el registro BX ha de apuntar al comienzo de una tabla. Dicho de otra manera, AL hace de índice de la tabla y de almacén destino del contenido de la tabla. Por ejemplo, el siguiente programa: DATOS SEGMENT TABLA DB 2, 3, 5, 8, 16, 23 DATOS ENDS CODIGO SEGMENT MOVE BX, OFFSET TABLA ;Inicializa BX con la dirección donde comienza la tabla MOVE AL, 5 XLAT TABLA CODIGO ENDS hace que al final el contenido de AL sea 16 ya que es el quinto elemento de la tabla y AL antes de XLAT TABLA contenía el valor 5. Otro ejemplo: MOV MOV XLAT BX, OFFSET TABLA AL, 4 TABLA

Para finalizar con las instrucciones de transferencia veremos un grupo de tres instrucciones: LEA o cargar dirección efectiva LDS o cargar el puntero en DS LES o cargar el puntero en ES denominadas de transferencia de direcciones.

LEA (carga dirección efectiva).
Sintaxis: Indicadores: LEA destino, origen OF DF IF TF SF ZF AF PF CF - - - - - - -

Transfiere el desplazamiento del operando fuente al operando destino. Otras instrucciones pueden a continuación utilizar el registro como desplazamiento para acceder a los datos que constituyen el objetivo. El operando destino no puede ser un registro de segmento. En general, esta instrucción es equivalente a MOV destino, OFFSET fuente y de hecho los buenos ensambladores (TASM) la codifican como MOV para economizar un byte de memoria. Sin embargo, LEA es en algunos casos más potente que MOV al permitir indicar registros de índice y desplazamiento para calcular el offset:

M. D. O. H. Sonia Alvarado Mares

80

Lenguaje Ensamblador
LEA DX, DATOS [SI]

En el ejemplo de arriba, el valor depositado en DX es el OFFSET de la etiqueta DATOS más el registro SI. Esa sola instrucción es equivalente a estas dos: MOV ADD DX, OFFSET DATOS DX, SI

LDS (carga un puntero utilizando DS).
Sintaxis: Indicadores: LDS destino, origen OF DF IF TF SF ZF AF PF CF - - - - - - - -

Traslada un puntero de 32 bits (dirección completa de memoria compuesta por segmento y desplazamiento), al destino indicado y a DS. A partir de la dirección indicada por el operando origen, el procesador toma 4 bytes de la memoria: con los dos primeros forma una palabra que deposita en destino y, con los otros dos, otra en DS. Ejemplo: PUNT LDS DD 12345678H SI, PUNT

Como resultado de esta instrucción, en DS:SI se hace referencia a la posición de memoria 1234h:5678h; 'DD' sirve para definir una variable larga de 4 bytes (denominada PUNT en el ejemplo).

LES (carga un puntero utilizando ES).
Sintaxis: LES destino, origen

Esta instrucción es análoga a LDS, pero utilizando ES en lugar de DS.

INSTRUCCIONES DE ENTRADA SALIDA (E/S). IN (entrada).
Sintaxis: Indicadores: IN acumulador, puerto OF DF IF TF SF ZF AF PF CF - - - - - - - -

M. D. O. H. Sonia Alvarado Mares

81

Lenguaje Ensamblador
Transfiere datos desde el puerto indicado hasta el registro AL o AX, dependiendo de la longitud byte o palabra respectivamente. El puerto puede especificarse mediante una constante (0 a 255) o a través del valor contenido en DX (0 a 65535). Ejemplo: IN IN AX, 0FH AL, DX

OUT (salida).
Sintaxis: Indicadores: OUT puerto, acumulador OF DF IF TF SF ZF AF PF CF - - - - - - - -

Transfiere un byte o palabra del registro AL o AX a un puerto de salida. El puerto puede especificarse con un valor fijo entre 0 y 255 ó a través del valor contenido en el registro DX (de 0 a 65535). Ejemplo: OUT OUT 12H, AX DX, AL

M. D. O. H. Sonia Alvarado Mares

82

Lenguaje Ensamblador
2.1.2 Pila.
POP (Extraer de la pila).
Sintaxis: Indicadores: POP destino OF DF IF TF SF ZF AF PF CF - - - - - - - -

Transfiere el elemento palabra que se encuentra en lo alto de la pila (apuntado por SP) al operando destino que a de ser tipo palabra, e incrementa en dos el registro SP. La instrucción POP CS, poco útil, no funciona correctamente en los 286 y superiores. Ejemplos: POP POP AX PEPE

PUSH (Introduce en la pila).
Sintaxis: Indicadores: PUSH origen OF DF IF TF SF ZF AF PF CF - - - - - - - -

Decrementa el puntero de pila (SP) en 2 y luego transfiere la palabra especificada en el operando origen a la cima de la pila. El registro CS aquí sí se puede especificar como origen, al contrario de lo que afirman algunas publicaciones. Ejemplo: PUSH CS

POPF (extrae los indicadores de la pila).
Sintaxis: Indicadores: POPF OF DF IF TF SF ZF AF PF CF x x x x x x x x x

Traslada al registro de los indicadores la palabra almacenada en la cima de la pila; a continuación el puntero de pila SP se incrementa en dos.

PUSHF (introduce los indicadores en la pila)
Sintaxis: Indicadores: PUSHF OF DF IF TF SF ZF AF PF CF - - - - - - - -

Decrementa en dos el puntero de pila y traslada a la cima de la pila el contenido de los indicadores.

M. D. O. H. Sonia Alvarado Mares

83

Lenguaje Ensamblador
2.1.3 Matemáticos.
S U M A S. AAA (Ajuste ASCII para la suma).
Sintaxis: Indicadores: AAA OF DF IF TF SF ZF AF PF CF ? - - - ? ? x ? x

Convierte el contenido del registro AL en un número BCD no empaquetado. Si los cuatro bits menos significativos de AL son mayores que 9 ó si el indicador AF está a 1, se suma 6 a AL, 1 a AH, AF se pone a 1, CF se iguala a AF y AL pone sus cuatro bits más significativos a 0. Ejemplo: ADD AAA AL, BL

En el ejemplo, tras la suma de dos números BCD no empaquetados colocados en AL y BL, el resultado (por medio de AAA) sigue siendo un número BCD no empaquetado.

ADC (Suma con acarreo).
Sintaxis: Indicadores: ADC destino, origen OF DF IF TF SF ZF AF PF CF x - - - x x x x x

Suma los operandos origen, destino y el valor del indicador de acarreo (0 ó 1) y el resultado lo almacena en el operando destino. Se utiliza normalmente para sumar números grandes, de más de 16 bits, en varios pasos, considerando lo que nos llevamos (el acarreo) de la suma anterior. Ejemplo: ADC AX, BX

ADD (suma).
Sintaxis: Indicadores: ADD destino, origen OF DF IF TF SF ZF AF PF CF x - - - x x x x x

M. D. O. H. Sonia Alvarado Mares

84

Lenguaje Ensamblador
Suma los operandos origen y destino almacenando el resultado en el operando destino. Se activa el acarreo si se desborda el registro destino durante la suma. Ejemplos: ADD AX, BX ADD CL, DH

DAA (Ajuste decimal para la suma).
Sintaxis: Indicadores: DAA OF DF IF TF SF ZF AF PF CF ? - - - x x x x x

Convierte el contenido del registro AL en un par de valores BCD: si los cuatro bits menos significativos de AL son un número mayor que 9, el indicador AF se pone a 1 y se suma 6 a AL. De igual forma, si los cuatro bits más significativos de AL tras la operación anterior son un número mayor que 9, el indicador CF se pone a 1 y se suma 60h a AL. Ejemplo: ADD DAA AL, CL

En el ejemplo anterior, si AL y CL contenían dos números BCD empaquetados, DAA hace que el resultado de la suma (en AL) siga siendo también un BCD empaquetado.

INC (Incrementar).
Sintaxis: Indicadores: INC destino OF DF IF TF SF ZF AF PF CF x - - - x x x x -

Incrementa el operando destino. El operando destino puede ser byte o palabra. Obsérvese que esta instrucción no modifica el bit de acarreo (CF) y no es posible detectar un desbordamiento por este procedimiento (utilícese ZF). Ejemplos: INC INC INC INC AL ES: [DI] SS: [BP+4] WORD PTR CS: [BX+DI+7]

M. D. O. H. Sonia Alvarado Mares

85

Lenguaje Ensamblador
R E S T A S. AAS (Ajuste ASCII para la resta).
Sintaxis: Indicadores: AAS OF DF IF TF SF ZF AF PF CF ? - - - ? ? x ? x

Convierte el resultado de la sustracción de dos operandos BCD no empaquetados para que siga siendo un número BCD no empaquetado. Si el nibble inferior de AL tiene un valor mayor que 9, de AL se resta 6, se decrementa AH, AF se pone a 1 y CF se iguala a AF. El resultado se guarda en AL con los bits de 4 a 7 puestos a 0. Ejemplo: SUB AAS AL, BL

En el ejemplo, tras la resta de dos números BCD no empaquetados colocados en AL y BL, el resultado (por medio de AAS) sigue siendo un número BCD no empaquetado.

CMP (Comparación).
Sintaxis: Indicadores: CMP destino, origen OF DF IF TF SF ZF AF PF CF x - - - x x x x x

Resta origen de destino sin retornar ningún resultado. Los operandos quedan inalterados, paro los indicadores pueden ser consultados mediante instrucciones de bifurcación condicional. Los operandos pueden ser de tipo byte o palabra pero ambos de la misma dimensión. Ejemplo: CMP CMP BX, MEM_PAL CH, CL

DAS (Ajuste decimal para la resta).
Sintaxis: Indicadores: DAS OF DF IF TF SF ZF AF PF CF - - - - x x x x x

Corrige el resultado en AL de la resta de dos números BCD empaquetados, convirtiéndolo también en un valor BCD empaquetado. Si el nibble inferior tiene un valor mayor que 9 o

M. D. O. H. Sonia Alvarado Mares

86

Lenguaje Ensamblador
AF es 1, a AL se le resta 6, AF se pone a 1. Si el nibble mas significativo es mayor que 9 ó CF está a 1, entonces se resta 60h a AL y se activa después CF. Ejemplo: SUB DAS AL, BL

En el ejemplo anterior, si AL y BL contenían dos números BCD empaquetados, DAS hace que el resultado de la resta (en AL) siga siendo también un BCD empaquetado.

DEC (Decrementar).
Sintaxis: Indicadores: DEC destino OF DF IF TF SF ZF AF PF CF x - - x x x x -

Resta una unidad del operando destino. El operando puede ser byte o palabra. Obsérvese que esta instrucción no modifica el bit de acarreo (CF) y no es posible detectar un desbordamiento por este procedimiento (utilícese ZF). Ejemplo: DEC DEC AX MEM_BYTE

NEG (Negación).
Sintaxis: Indicadores: NEG destino OF DF IF TF SF ZF AF PF CF x - - x x x x x

Calcula el valor negativo en complemento a dos del operando y devuelve el resultado en el mismo operando. Ejemplo: NEG AL

SBB (resta con acarreo).
Sintaxis: SBB destino, origen Indicadores: OF DF IF TF SF ZF AF PF CF x - - x x x x x

Resta el operando origen del operando destino y el resultado lo almacena en el operando destino. Si está a 1 el indicador de acarreo además resta una unidad más. Los operandos pueden ser de tipo byte o palabra. Se utiliza normalmente para restar números grandes,

M. D. O. H. Sonia Alvarado Mares

87

Lenguaje Ensamblador
de más de 16 bits, en varios pasos, considerando lo que nos llevamos (el acarreo) de la resta anterior. Ejemplo: SBB SBB AX, AX CH, DH

SUB (Resta).
Sintaxis: Indicadores: SUB destino, origen OF DF IF TF SF ZF AF PF CF x - - - x x x x x

Resta el operando destino al operando origen, colocando el resultado en el operando destino. Los operandos pueden tener o no signo, siendo necesario que sean del mismo tipo, byte o palabra. Ejemplos: SUB SUB AL, BL DX, DX

M U L T I P L I C A C I O N E S.

AAM (Ajuste ASCII para la multiplicación).
Sintaxis: Indicadores: AAM OF DF IF TF SF ZF AF PF CF ? - - - x x ? x ?

Corrige el resultado en AX del producto de dos números BCD no empaquetados, convirtiéndolo en un valor BCD también no empaquetado. En AH sitúa el cociente de AL/10 quedando en AL el resto de dicha operación. Ejemplo: MUL AAM BL

En el ejemplo, tras el producto de dos números BCD no empaquetados colocados en AL y BL, el resultado (por medio de AAA) sigue siendo, en AX, un número BCD no empaquetado.

M. D. O. H. Sonia Alvarado Mares

88

Lenguaje Ensamblador
IMUL (multiplicación entera con signo).
Sintaxis: IMUL origen (origen no puede ser operando inmediato en 8086, sí en 286) Indicadores: OF DF IF TF SF ZF AF PF CF x - - - ? ? ? ? x

Multiplica un operando origen con signo de longitud byte o palabra por AL o AX respectivamente. Si origen es un byte el resultado se guarda en AH (byte más significativo) y en AL (menos significativo), si origen es una palabra el resultado es devuelto en DX (parte alta) y AX (parte baja). Si las mitades más significativas son distintas de cero, independientemente del signo, CF y OF son activados. Ejemplo: IMUL IMUL BX CH

MUL (multiplicación sin signo).
Sintaxis: Indicadores: MUL origen (origen no puede ser operando inmediato) OF DF IF TF SF ZF AF PF CF x - - - ? ? ? ? x

Multiplica el contenido sin signo del acumulador por el operando origen. Si el operando destino es un byte el acumulador es AL guardando el resultado en AH y AL, si el contenido de AH es distinto de 0 activa los indicadores CF y OF. Cuando el operando origen es de longitud palabra el acumulador es AX quedando el resultado sobre DX y AX, si el valor de DX es distinto de cero los indicadores CF y OF se activan. Ejemplo: MUL MUL MUL BYTE PTR DS: [DI] DX CL

Desbordamientos.
Este alerta con los desbordamientos en las operaciones aritméticas. Ya que un byte solo permite el uso de un bit de signo y siete de datos (desde -128 hasta +127), una operación aritmética puede exceder con facilidad la capacidad de un registro de un byte. Y una suma en el registro AL, que exceda su capacidad puede provocar resultados inesperados.

Byte por byte.
Para multiplicar dos números de un byte, el multiplicando esta en el registro AL y el multiplicador es un byte en memoria o en otro registro. Para la instrucción MUL DL, la operación multiplica el contenido del AL por el contenido del DL. El producto generado

M. D. O. H. Sonia Alvarado Mares

89

Lenguaje Ensamblador
esta en el registro AX. La operación ignora y borra cualquier información que pueda estar en el AH.

Palabra por palabra.
Para multiplicar dos números de una palabra, el multiplicando esta en el registro AX y el multiplicador es una palabra en memoria o en otro registro. Para la instrucción MUL DX, la operación multiplica el contenido del AX por el contenido del DX. El producto generado es una palabra doble que necesita dos registros: la parte de orden alto (mas a la izquierda) en el DX y la parte de orden bajo (mas a la derecha) en el AX. La operación ignora y borra cualquier información que puede estar en el DX.

Palabra doble por palabra doble.
Para multiplicar dos números de palabras dobles, el multiplicando esta en el registro EAX y el multiplicador es una palabra doble en memoria o en otro registro. El producto es generado en el par EDX:EAX. La operación ignora y borra cualquier información que ya este en el EDX.

En los ejemplos siguientes, el multiplicador esta en un registro, el cual especifica el tipo de operación:

M. D. O. H. Sonia Alvarado Mares

90

Lenguaje Ensamblador
INSTRUCCION MUL CL MUL BX MUL EBX MULTIPLICADOR byte palabra palabra doble MULTIPLICANDO AL AX EAX PRODUCTO AX DX:AX EDX:EAX

En los ejemplos siguientes, los multiplicadores están definidos en memoria: BYTE1 WORD1 DWORD1 OPERACION DB DW DD ? ? ? MULTIPLIANDO PRODUCTO

MULTIPLICADOR

MUL BYTE1 MUL WORD1 MUL DWORD1 DIVISIONES.

BYTE1 WORD1 DWORD1

AL AX EAX

AX DX:AX EDX:EAX

AAD (Ajuste ASCII para la división).
Sintaxis: Indicadores: AAD OF DF IF TF SF ZF AF PF CF ? - - - x x ? x ?

Convierte dos números BCD no empaquetados contenidos en AH y AL en un dividendo de un byte que queda almacenado en AL. Tras la operación AH queda a cero. Esta instrucción es necesaria ANTES de la operación de dividir, al contrario que AAM. Ejemplo: AAD DIV BL En el ejemplo, tras convertir los dos números BCD no empaquetados (en AX) en un dividendo válido, la instrucción de dividir genera un resultado correcto.

DIV (División sin signo).
Sintaxis: Indicadores: DIV origen (origen no puede ser operando inmediato). OF DF IF TF SF ZF AF PF CF ? - - - ? ? ? ? ?

M. D. O. H. Sonia Alvarado Mares

91

Lenguaje Ensamblador
Divide, sin considerar el signo, un número contenido en el acumulador y su extensión (AH, AL si el operando es de tipo byte o DX, AX si el operando es palabra) entre el operando fuente. El cociente se guarda en AL o AX y el resto en AH o DX según el operando sea byte o palabra respectivamente. DX o AH deben ser cero antes de la operación. Cuando el cociente es mayor que el resultado máximo que puede almacenar, cociente y resto quedan indefinidos produciéndose una interrupción 0. En caso de que las partes más significativas del cociente tengan un valor distinto de cero se activan los indicadores CF y OF. Ejemplo: DIV DIV BL MEM_PAL

IDIV (División entera).
Sintaxis: Indicadores: IDIV origen (origen no puede ser operando inmediato). OF DF IF TF SF ZF AF PF CF ? - - - ? ? ? ? ?

Divide, considerando el signo, un número contenido en el acumulador y su extensión entre el operando fuente. El cociente se almacena en AL o AX según el operando sea byte o palabra y de igual manera el resto en AH o DX. DX o AH deben ser cero antes de la operación. Cuando el cociente es positivo y superior al valor máximo que puede almacenarse (7fh ó 7fffh), o cuando el cociente es negativo e inferior al valor mínimo que puede almacenarse (81h u 8001h) entonces cociente y resto quedan indefinidos, generándose una interrupción 0, lo que también sucede si el divisor es 0. Ejemplo: IDIV IDIV BL BX

Las operaciones de división básicas son byte entre byte, palabra entre palabra y palabras dobles entre palabra dobles. Palabra entre palabra

Aquí el dividendo esta en el AX y el divisor es un byte en memoria o en otro registro. Después de la división, el residuo esta en el AH y el cociente esta en el AL. Ya que un cociente de un byte es muy pequeño -si es sin signo, un máximo de +255 (FFH) y con signo +127 (7FH)- esta operación tiene un uso limitado.

M. D. O. H. Sonia Alvarado Mares

92

Lenguaje Ensamblador
Palabra doble entre palabra. Para esta operación, el dividendo esta en el par DX:AX y el divisor es una palabra en memoria o en otro registro. Después de la división, el residuo esta en el DX y el cociente esta en el AX. El cociente de una palabra permite para datos sin signo un máximo de +32, 767 (FFFFH) y con signo +16, 383 (7FFFH). Tenemos:

Palabra cuádruple entre palabra doble. Al dividir una palabra cuádruple entre una palabra doble, el dividendo esta en el par EDX:EAX y el divisor esta en una palabra doble en memoria o en otro registro. Después de la división, el residuo esta en el EDX y el cociente en el AEX.

En los ejemplos siguientes, de DIV, los divisores están en un registro, que determina el tipo de operación: OPERACION DIV CL DIV CX DIV EBX DIVISOR byte palabra palabra doble DIVIDENDO AX DX:AX EDX:EAX COCIENTE AL AX EAX RESIDUO AH DX EDX

En los ejemplos siguientes de DIV, los divisores están definidos en memoria: BYTE1 DB ? WORD1 DW ? DWORD1 DD ? ... DIVISOR DIVIDENDO DIV BYTE1 BYTE1 DIV WORD1 WORD1 DIV DWORD1 DWORD1

COCIENTE AX DX:AX EDX:EAX

RESIDUO AL AX EAX AH DX EDX

M. D. O. H. Sonia Alvarado Mares

93

Lenguaje Ensamblador
Ejemplo de programa con instrucciones aritméticas. P13ADD (COM) Operaciones ADD y SUB .MODEL SMALL .CODE ORG 100H BEGIN: JMP SHORT MAIN ;---------------------------------------------------------------------------BYTEA DB 64H ;DATOS BYTEB DB 40H BYTEC DB 16H WORDA DW 4000H WORDB DW 2000H WORDC DW 1000H ;---------------------------------------------------------------------------MAIN PROC NEAR ;Procedimiento principal: CALL B10ADD ;Llama a la rutina ADD CALL C10SUB ;Llama a la rutina SUB INT 21H MAIN ENDP ; Ejemplos de suma (ADD) de bytes: ;---------------------------------------------------------------------------B10ADD PROC MOV AL, BYTEA MOV BL, BYTEB ADD AL, BL ;registro a registro ADD AL, BYTEC ;memoria a registro ADD BYTEA, BL ;registro a memoria ADD BL, 10H ;inmediato a registro ADD BYTEA, 25H ;inmediato a memoria RET B10ADD ENDP ; Ejemplos de resta (SUB) de palabras: ;---------------------------------------------------------C10SUB PROC MOV AX, WORDA MOV BX, WORDB SUB AX,BX ;Registro a registro SUB AX,WORDC ;Memora de registro SUB WORDA, BX ;Registro de memoria SUB BX, 1000H ;Inmediato de registro SUB WORDA, 256H ;Inmediato de memoria RET C10SUB ENDP END BEGIN TITLE

M. D. O. H. Sonia Alvarado Mares

94

Lenguaje Ensamblador
2.1.4 Ajustes.
CBW (Conversión de byte en palabra).
Sintaxis: Indicadores: CBW OF DF IF TF SF ZF AF PF CF - - - - - -

Copia el bit 7 del registro AL en todos los bits del registro AH, es decir, expande el signo de AL a AX como paso previo a una operación de 16 bits.

CWD (conversión de palabra a doble palabra).
Sintaxis: Indicadores: CWD OF DF IF TF SF ZF AF PF CF - - - - - -

Expande el signo del registro AX sobre el registro DX, copiando el bit más significativo de AH en todo DX.

M. D. O. H. Sonia Alvarado Mares

95

Lenguaje Ensamblador
2.1.5 Comparación.
CMP (Comparación).
Sintaxis: Indicadores: CMP destino, origen OF DF IF TF SF ZF AF PF CF x - - - x x x x x

Resta origen de destino sin retornar ningún resultado. Los operandos quedan inalterados, paro los indicadores pueden ser consultados mediante instrucciones de bifurcación condicional. Los operandos pueden ser de tipo byte o palabra pero ambos de la misma dimensión. Ejemplo: CMP CMP BX, MEM_PAL CH, CL

CMPS/CMPSB/CMPSW (Compara cadenas).
Sintaxis: CMPS cadena_destino, cadena_origen CMPSB (bytes) CMPSW (palabras) OF DF IF TF SF ZF AF PF CF x - - - x x x x x

Indicadores:

Compara dos cadenas restando al origen el destino. Ninguno de los operandos se alteran, pero los indicadores resultan afectados. La cadena origen se direcciona con registro SI sobre el segmento de datos DS y la cadena destino se direcciona con el registro DI sobre el segmento extra ES. Los registros DI y SI se autoincrementan o autodecrementan según el valor del indicador DF (véanse CLD y STD) en una o dos unidades, dependiendo de si se trabaja con bytes o con palabras. Cadena origen y cadena destino son dos operandos redundantes que sólo indican el tipo del dato (byte o palabra) a comparar, es más cómodo colocar CMPSB o CMPSW para indicar bytes/palabras. Si se indica un registro de segmento, éste sustituirá en la cadena origen al DS ordinario. Ejemplo: LEA SI, ORIGEN LEA DI, DESTINO CMPSB

M. D. O. H. Sonia Alvarado Mares

96

Lenguaje Ensamblador
A continuación se muestra la codificación del uso del CMPS y sus derivaciones:

TITLE

P12CMPST (COM) Uso de CMPS para operaciones en cadenas .MODEL .CODE SMALL

ORG 100H BEGIN: JMP SHORT MAIN ;------------------------------------------------------------------------------------NOM1 DB 'Assemblers' ;Elementos de datos NOM2 DB 'Assemblers' NOM3 DB 10 DUP (' ') ;------------------------------------------------------------------------------------MAIN PROC NEAR CLD ;Izquierda a derecha MOV CX, 10 LEA DI, NOM2 LEA SI, NOM1 REPE CMPSB JNE G20 MOV BH,01 MOV LEA LEA REPE JE MOV G30: MOV INT MAIN ENDP END AX, 4C00H 21H BEGIN ;Salir a DOS CX, 10 DI, NOM3 SI, NOM2 CMPSB G30 BL, 02 ;Procedimiento principal ;Iniciar para 10 bytes ;Compare NOM1:NOM2 ;No es igual, saltarlo ;Igual, fijar BH ;Iniciar para 10 bytes ;Compare NOM2:NOM3 ;Igual, salir ;No es igual, fijar BL

G20:

M. D. O. H. Sonia Alvarado Mares

97

Lenguaje Ensamblador

2 .2

SALTOS.

2.2.1 Incondicionales.
CALL (Llamada a subrutina). Sintaxis:
Indicadores:

CALL destino
OF DF IF TF SF ZF AF PF CF - - - - - - -

Transfiere el control del programa a un procedimiento, salvando previamente en la pila la dirección de la instrucción siguiente, para poder volver a ella una vez ejecutado el procedimiento. El procedimiento puede estar en el mismo segmento (tipo NEAR) o en otro segmento (tipo FAR). A su vez la llamada puede ser directa a una etiqueta (especificando el tipo de llamada NEAR -por defecto- o FAR) o indirecta, indicando la dirección donde se encuentra el puntero. Según la llamada sea cercana o lejana, se almacena en la pila una dirección de retorno de 16 bits o dos palabras de 16 bits indicando en este último caso tanto el offset (IP) como el segmento (CS) a donde volver.
Ejemplos: CALL DIR CALL PROC1 DD 0F000E987H DWORD PTR DIR

En el segundo ejemplo, la variable dir almacena la dirección a donde saltar. De esta última manera -conociendo su dirección- puede llamarse también a un vector de interrupción, guardando previamente los flags en la pila (PUSHF), porque la rutina de interrupción retornará (con IRET en vez de con RETF) sacándolos. JMP (Salto). Sintaxis:
Indicadores:

JMP dirección o JMP SHORT dirección
OF DF IF TF SF ZF AF PF CF - - - - - - - -

Transfiere el control incondicionalmente a la dirección indicada en el operando. La bifurcación puede ser también directa o indirecta como anteriormente vimos, pero además puede ser corta (tipo SHORT) con un desplazamiento comprendido entre -128 y 127; o larga, con un desplazamiento de dos bytes con signo. Si se hace un JMP SHORT y no llega el salto (porque está demasiado alejada esa etiqueta) el ensamblador dará error. Los buenos ensambladores (como TASM) cuando dan

M. D. O. H. Sonia Alvarado Mares

98

Lenguaje Ensamblador
dos pasadas colocan allí donde es posible un salto corto, para economizar memoria, sin que el programador tenga que ocuparse de poner short. Si el salto de dos bytes, que permite desplazamientos de 64 Kb en la memoria sigue siendo insuficiente, se puede indicar con far que es largo (salto a otro segmento).
Ejemplos: JMP JMP ETIQUETA FAR PTR ETIQUETA

RET / RETF (Retorno de subrutina).
Sintaxis:
Indicadores:

RET [valor] o RETF [valor]
OF DF IF TF SF ZF AF PF CF - - - - - - - - -

Retorna de un procedimiento extrayendo de la pila la dirección de la siguiente dirección. Se extraerá el registro de segmento y el desplazamiento en un procedimiento de tipo FAR (dos palabras) y solo el desplazamiento en un procedimiento NEAR (una palabra). si esta instrucción es colocada dentro de un bloque PROC-ENDP (como se verá en el siguiente capítulo) el ensamblador sabe el tipo de retorno que debe hacer, según el procedimiento sea NEAR o FAR. En cualquier caso, se puede forzar que el retorno sea de tipo FAR con la instrucción RETF. Valor, si es indicado permite sumar una cantidad valor en bytes a SP antes de retornar, lo que es frecuente en el código generado por los compiladores para retornar de una función con parámetros. También se puede retornar de una interrupción con RETF 2, para que devuelva el registro de estado sin restaurarlo de la pila.
TITLE P08JUMP (COM) Uso de JMP para iterar SMALL

.MODEL .CODE MAIN

ORG PROC MOV MOV MOV ADD ADD SHL JMP ENDP END

100H NEAR AX,01 BX,01 CX,01 AX, 01 BX, AX CX, 1 A20 MAIN

;Iniciación de AX, ;BX y ;CX a 01 ;Sumar 01 a AX ;Sumar AX a BX ;Multiplicar por dos a CX ;Saltar a la etiqueta A20

A20:

MAIN

M. D. O. H. Sonia Alvarado Mares

99

Lenguaje Ensamblador
2.2.2 Condicionales.
Las siguientes instrucciones son de transferencia condicional de control a la instrucción que se encuentra en la posición IP+desplazamiento (desplazamiento comprendido entre -128 y +127) si se cumple la condición. Algunas condiciones se pueden denotar de varias maneras. Todos los saltos son cortos y si no alcanza hay que apañárselas como sea. En negrita se realzan las condiciones más empleadas. Donde interviene SF se consideran con signo los operandos implicados en la última comparación u operación aritmetico-lógica, y se indican en la tabla como '±' (-128 a +127 ó -32768 a +32767); en los demás casos, indicados como '+', se consideran sin signo (0 a 255 ó 0 a 65535): JA/JNBE JAE/JNB JB/JNAE/JC JBE/JNA JCXZ JE/JZ JG/JNLE JGE/JNL JL/JNGE JLE/JNG JNC JNE/JNZ JNO JNP/JPO JNS JO JP/JPE JS
Salto si mayor (above), si no menor o igual (not below or equal), si CF=0 y ZF=0. Salto si mayor o igual (above or equal), si no menor (not below), si CF=0. Salto si menor (below), si no superior ni igual (not above or equal), si acarreo, si CF=1. Salto si menor o igual (not below or equal), si no mayor (not above), si CF=1 ó ZF=1. Salto si CX=0. Salto si igual (equal), si cero (zero), si ZF=1. Salto si mayor (greater), si no menor ni igual (not less or equal), si ZF=0 y SF=0. Salto si mayor o igual (greater or equal), si no menor (not less), si SF=0. Salto si menor (less), si no mayor ni igual (not greater or equal), si SF<>OF. Salto si menor o igual (less or equal), si no mayor (not greater), si ZF=0 y SF<>OF. Salto si no acarreo, si CF=0. Salto si no igual, si no cero, si ZF=0. Salto si no desbordamiento, si OF=0. Salto si no paridad, si paridad impar, si PF=0. Salto si no signo, si positivo, si SF=0. Salto si desbordamiento, si OF=1. Salto si paridad, si paridad par, si PF=1. Salto si signo, si SF=1.

+ + + +

± ± ± ±

M. D. O. H. Sonia Alvarado Mares

100

Lenguaje Ensamblador

2.3 TIPOS DE CICLOS.
LOOP (bucle).
Sintaxis: Indicadores: LOOP desplazamiento OF DF IF TF SF ZF AF PF CF - - - - - - -

Decrementa el registro contador CX; si CX es cero, ejecuta la siguiente instrucción, en caso contrario transfiere el control a la dirección resultante de sumar a IP + desplazamiento. El desplazamiento debe estar comprendido entre -128 y +127. Ejemplo: MOV CX,10 BUCLE: ....... ....... LOOP BUCLE Con las mismas características que la instrucción anterior:

LOOPE/LOOPZ

Bucle si igual, si cero. Z=1 y CX<>0

LOOPNE/LOOPNZ Bucle si no igual, si no cero. Z=0 y CX<>0

TITLE .MODEL .CODE MAIN

P08LOOP (COM) Ilustración de LOOP SMALL

ORG PROC MOV MOV MOV MOV ADD ADD SHL LOOP MOV ENDP END

100H NEAR AX,01 BX,01 CX,01 CX,10 AX, 01 BX, AX DX, 1 A20 AX, 4C00H MAIN

A20:

;Iniciación de AX, ;BX y ;CX a 01 ;Iniciar ;Número de iteraciones ;Sumar 01 a AX ;Sumar AX a BX ;Multiplicar por dos a DX ;Iterar si es diferente de cero ;Salida a DOS

MAIN

M. D. O. H. Sonia Alvarado Mares

101

Lenguaje Ensamblador

2.4 OPERADORES LÓGICOS.
AND (y lógico).
Sintaxis: Indicadores: AND destino, origen OF DF IF TF SF ZF AF PF CF 0 - - - x x ? x 0

Realiza una operación de Y lógico entre el operando origen y destino quedando el resultado en el destino. Son válidos operandos byte o palabra, pero ambos del mismo tipo. Ejemplos: AND AND AX, BX BL, BYTE PTR ES:[SI+10H]

NOT (No lógico).
Sintaxis: Indicadores: NOT destino OF DF IF TF SF ZF AF PF CF - - - - - - - -

Realiza el complemento a uno del operando destino, invirtiendo cada uno de sus bits. Los indicadores no resultan afectados. Ejemplo: NOT AX

OR (O lógico). Sintaxis:
Indicadores:

OR destino, origen
OF DF IF TF SF ZF AF PF CF 0 - - - x x ? x 0

Realiza una operación O lógico a nivel de bits entre los dos operandos, almacenándose después el resultado en el operando destino.
Ejemplo: OR AX, BX

M. D. O. H. Sonia Alvarado Mares

102

Lenguaje Ensamblador
TEST (Comparación lógica).
Sintaxis: Indicadores: TEST destino, origen OF DF IF TF SF ZF AF PF CF 0 - - - x x ? x 0

Realiza una operación Y lógica entre los dos operandos pero sin almacenar el resultado. Los indicadores son afectados con la operación. Ejemplo: TEST AL,BH

XOR (O exclusivo).
Sintaxis: Indicadores: XOR destino, origen OF DF IF TF SF ZF AF PF CF 0 - - - x x ? x 0

Operación OR exclusivo a nivel de bits entre los operandos origen y destino almacenándose el resultado en este último. Ejemplo: XOR DI, AX

M. D. O. H. Sonia Alvarado Mares

103

Lenguaje Ensamblador

2.5 DESPLAZAMIENTOS.
2.5.1 Lineal.
SAL/SHL (Desplazamiento aritmético a la izquierda).
Sintaxis: Indicadores: SAL/SHL destino, contador OF DF IF TF SF ZF AF PF CF x - - - x x ? x x

Desplaza a la izquierda los bits del operando el número de bits especificado en el segundo operando que debe ser CL si es mayor que 1 los bits desplazados.

SAR (Desplazamiento aritmético a la derecha).
Sintaxis: Indicadores: SAR destino, contador OF DF IF TF SF ZF AF PF CF x - - - x x ? x x

Desplaza a la derecha los bits del operando destino el número de bits especificado en el segundo operando. Los bits de la izquierda se rellenan con el bit de signo del primer operando. Si el número de bits a desplazar es 1 se puede especificar directamente, si es mayor se especifica a través de CL.

Ejemplos: SAR SAR AX, CL BP, 1

SHR (Desplazamiento lógico a la derecha).
Sintaxis: Indicadores: SHR destino, contador OF DF IF TF SF ZF AF PF CF x - - - x x ? x x

M. D. O. H. Sonia Alvarado Mares

104

Lenguaje Ensamblador
Desplaza a la derecha los bits del operando destino el número de los bits especificados en el segundo operando. Los bits de la izquierda se llena con cero. Si el número de bits a desplazar es 1 se puede especificar directamente en el caso en que no ocurra se pone el valor en CL:

Ejemplos: SHR SHR AX, CL CL, 1

M. D. O. H. Sonia Alvarado Mares

105

Lenguaje Ensamblador
2.5.2 Circular.
RCL (Rotación a la izquierda con acarreo).
Sintaxis: Indicadores: RCL destino, contador OF DF IF TF SF ZF AF PF CF x - - - - - - x

Rotar a la izquierda los bits del operando destino junto con el indicador de acarreo CF el número de bits especificado en el segundo operando. Si el número de bits a desplazar es 1, se puede especificar directamente, en caso contrario el valor debe cargarse en CL y especificar CL como segundo operando. No es conveniente que CL sea mayor de 7, en bytes; ó 15, en palabras.

Ejemplos: RCL RCL RCL AX, 1 AL, CL DI, 1

RCR (Rotación a la derecha con acarreo).
Sintaxis: Indicadores: RCR destino, contador OF DF IF TF SF ZF AF PF CF x - - - - - - x

Rotar a la derecha los bits del operando destino junto con el indicador de acarreo CF el número de bits especificado en el segundo operando. Si el número de bits es 1 se puede especificar directamente; en caso contrario su valor debe cargarse en CL y especificar CL como segundo operando:

Ejemplos: RCR RCR BX, CL BX, 1

M. D. O. H. Sonia Alvarado Mares

106

Lenguaje Ensamblador
ROL (Rotación a la izquierda).
Sintaxis: Indicadores: ROL destino, contador OF DF IF TF SF ZF AF PF CF x - - - - - - x

Rota a la izquierda los bits del operando destino el número de bits especificado en el segundo operando, que puede ser 1 ó CL previamente cargado con el valor del número de veces.

Ejemplos: ROL ROL DX, CL AH, 1

ROR (Rotación a la derecha).
Sintaxis: Indicadores: ROR destino, contador OF DF IF TF SF ZF AF PF CF x - - - - - x

Rota a la derecha los bits del operando destino el número de bits especificado en el segundo operando. Si el número de bits es 1 se puede poner directamente, en caso contrario debe ponerse a través de CL.

Ejemplos: ROR ROR CL, 1 AX, CL

M. D. O. H. Sonia Alvarado Mares

107

Lenguaje Ensamblador

2.6 PROCESOS DE CONTROL.
NOP (Operación nula).
Sintaxis: Indicadores: NOP OF DF IF TF SF ZF AF PF CF - - - - - - -

Realiza una operación nula, es decir, el microprocesador decodifica la instrucción y pasa a la siguiente. Realmente se trata de la instrucción XCHG AX,AX.

ESC (Salida a un coprocesador).
Sintaxis: Indicadores: ESC código_operación, origen OF DF IF TF SF ZF AF PF CF - - - - - - - -

Se utiliza en combinación con procesadores externos, tales como los coprocesadores de coma flotante o de E/S, y abre al dispositivo externo el acceso a las direcciones y operandos requeridos. Al mnemónico ESC le siguen los códigos de operación apropiados para el coprocesador así como la instrucción y la dirección del operando necesario. Ejemplo: ESC 21, AX

HLT (Parada hasta interrupción o reset). Sintaxis:
Indicadores:

HLT
OF DF IF TF SF ZF AF PF CF - - - - - - -

El procesador se detiene hasta que se restaura el sistema o se recibe una interrupción. Como en los PC se producen normalmente 18,2 interrupciones de tipo 8 por segundo (del temporizador) algunos programadores utilizan HLT para hacer pausas y bucles de retardo. Sin embargo, el método no es preciso y puede fallar con ciertos controladores de memoria.

M. D. O. H. Sonia Alvarado Mares

108

Lenguaje Ensamblador
LOCK (Bloquea los buses).
Sintaxis: Indicadores: LOCK OF DF IF TF SF ZF AF PF CF
-

Es una instrucción que se utiliza en aplicaciones de recursos compartidos para asegurar que no accede simultáneamente a la memoria más de un procesador. Cuando una instrucción va precedida por LOCK, el procesador bloquea inmediatamente el bus, introduciendo una señal por la patilla LOCK. WAIT (Espera).
Sintaxis: Indicadores: WAIT OF DF IF TF SF ZF AF PF CF - - - - - - - -

Provoca la espera del procesador hasta que se detecta una señal en la patilla TEST. Ocurre, por ejemplo, cuando el coprocesador ha terminado una operación e indica su finalización. Suele preceder a ESC para sincronizar las acciones del procesador y coprocesador.

M. D. O. H. Sonia Alvarado Mares

109

Lenguaje Ensamblador
2.6.1 Banderas.
LAHF (Carga AH con los indicadores). Sintaxis:
Indicadores:

LAHF
OF DF IF TF SF ZF AF PF CF - - - - - - - -

Carga los bits 7, 6, 4, 2 y 0 del registro AH con el contenido de los indicadores SF, ZF, AF, PF Y CF respectivamente. El contenido de los demás bits queda sin definir. SAHF (copia AH en los indicadores)
Sintaxis: Indicadores: SAHF OF DF IF TF SF ZF AF PF CF - - - - x x x x x

Transfiere el contenido de los bits 7, 6, 4, 2 y 0 a los indicadores SF, ZF, AF, PF y CF respectivamente.

CLC (Baja el indicador de acarreo).
Sintaxis: Indicadores: CLC OF DF IF TF SF ZF AF PF CF - - - - - 0

Borra el indicador de acarreo (CF) sin afectar a ninguno otro.

CLD (Baja el indicador de dirección). Sintaxis:
Indicadores:

CLD
OF DF IF TF SF ZF AF PF CF - 0 - - - - - -

Pone a 0 el indicador de dirección DF, por lo que los registros SI y/o DI se autoincrementan en las operaciones de cadenas, sin afectar al resto de los indicadores. Es NECESARIO colocarlo antes de las instrucciones de manejo de cadenas si no se conoce con seguridad el valor de DF. Véase STD.

M. D. O. H. Sonia Alvarado Mares

110

Lenguaje Ensamblador
CLI (Baja indicador de interrupción).
Sintaxis: Indicadores: CLI OF DF IF TF SF ZF AF PF CF - - 0 - - - - -

Borra el indicador de activación de interrupciones IF, lo que desactiva las interrupciones enmascarables. Es muy conveniente hacer esto antes de modificar la pareja SS:SP en los 8086/88 anteriores a 1983 (véase comentario en la instrucción MOV), o antes de cambiar un vector de interrupción sin el apoyo del DOS. Generalmente las interrupciones sólo se inhiben por breves instantes en momentos críticos. Véase también STI.

CMC (Complementa el indicador de acarreo).
Sintaxis: Indicadores: CMC OF DF IF TF SF ZF AF PF CF - - - - - - - x

Complementa el indicador de acarreo CF invirtiendo su estado.

STC (Pone a uno el indicador de acarreo).
Sintaxis: Indicadores: STC OF DF IF TF SF ZF AF PF CF - - - - - - 1

Pone a 1 el indicador de acarreo CF sin afectar a ningún otro indicador.

STD (Pone a uno el indicador de dirección).
Sintaxis: Indicadores: STD OF DF IF TF SF ZF AF PF CF - 1 - - - - - -

Pone a 1 el indicador de dirección DF, por lo que los registros SI y/o DI se autodecrementan en las operaciones de cadenas, sin afectar al resto de los indicadores. Es NECESARIO colocarlo antes de las instrucciones de manejo de cadenas si no se conoce con seguridad el estado de DF. Véase también CLD.

M. D. O. H. Sonia Alvarado Mares

111

Lenguaje Ensamblador
STI (Pone a uno el indicador de interrupción).
Sintaxis: Indicadores: STI OF DF IF TF SF ZF AF PF CF - - 1 - - - - -

Pone a 1 la bandera de desactivación de interrupciones IF y activa las interrupciones enmascarables. Una interrupción pendiente no es reconocida, sin embargo, hasta después de ejecutar la instrucción que sigue a STI. Véase también CLI.

INT (Interrupción).
Sintaxis: Indicadores: INT n (0 <= n <= 255) OF DF IF TF SF ZF AF PF CF - - 0 0 - - - -

Inicializa un procedimiento de interrupción de un tipo indicado en la instrucción. En la pila se introduce al llamar a una interrupción la dirección de retorno formada por los registros CS e IP y el estado de los indicadores. INT 3 es un caso especial de INT, al ensamblarla el ensamblador genera un sólo byte en vez de los dos habituales; esta interrupción se utiliza para poner puntos de ruptura en los programas. Véase también IRET y el apartado 1 del capítulo VII. Ejemplo: INT 21H

INTO (Interrupción por desbordamiento).
Sintaxis: Indicadores: INTO OF DF IF TF SF ZF AF PF CF - - 0 0 - - -

Genera una interrupción de tipo 4 (INT 4) si existe desbordamiento (OF=1). De lo contrario se continúa con la instrucción siguiente.

IRET (Retorno de interrupción.)
Sintaxis: Indicadores: IRET OF DF IF TF SF ZF AF PF CF x x x x x x x x x

Devuelve el control a la dirección de retorno salvada en la pila por una interrupción previa y restaura los indicadores que también se introdujeron en la pila. En total, se sacan las 3 palabras que fueron colocadas en la pila cuando se produjo la interrupción.

M. D. O. H. Sonia Alvarado Mares

112

Lenguaje Ensamblador
2.6.2 Cadenas.

CMPS/CMPSB/CMPSW (Compara cadenas).
Sintaxis: CMPS cadena_destino, cadena_origen CMPSB (bytes) CMPSW (palabras) OF DF IF TF SF ZF AF PF CF x - - - x x x x x

Indicadores:

Compara dos cadenas restando al origen el destino. Ninguno de los operandos se alteran, pero los indicadores resultan afectados. La cadena origen se direcciona con registro SI sobre el segmento de datos DS y la cadena destino se direcciona con el registro DI sobre el segmento extra ES. Los registros DI y SI se autoincrementan o autodecrementan según el valor del indicador DF (véanse CLD y STD) en una o dos unidades, dependiendo de si se trabaja con bytes o con palabras. Cadena origen y cadena destino son dos operandos redundantes que sólo indican el tipo del dato (byte o palabra) a comparar, es más cómodo colocar CMPSB o CMPSW para indicar bytes/palabras. Si se indica un registro de segmento, éste sustituirá en la cadena origen al DS ordinario. Ejemplo: LEA SI, ORIGEN LEA DI, DESTINO CMPSB

LODS/LODSB/LODSW (Cargar cadena).
LODS cadena_origen LODSB (bytes) LODSW (palabras) Indicadores: OF DF IF TF SF ZF AF PF CF - - - - - - - - Copia en AL o AX una cadena de longitud byte o palabra direccionada sobre el segmento de datos (DS) con el registro SI. Tras la transferencia, SI se incrementa o decrementa según el indicador DF (véanse CLD y STD) en una o dos unidades, según se estén manejando bytes o palabras. Cadena_origen es un operando redundante que sólo indica el tipo del dato (byte o palabra) a cargar, es más cómodo colocar LODSB o LODSW para indicar bytes/palabras. Ejemplo: CLD LEA SI, ORIGEN LODSB Sintaxis:

M. D. O. H. Sonia Alvarado Mares

113

Lenguaje Ensamblador
MOVS/MOVSB/MOVSW (Mover cadena).
Sintaxis: MOVS cadena_destino, cadena_origen MOVSB (bytes) MOVSW (palabras) OF DF IF TF SF ZF AF PF CF - - - - - - -

Indicadores:

Transfiere un byte o una palabra de la cadena origen direccionada por DS:SI a la cadena destino direccionada por ES:DI, incrementando o decrementando a continuación los registros SI y DI según el valor de DF (véanse CLD y STD) en una o dos unidades, dependiendo de si se trabaja con bytes o con palabras. Cadena origen y cadena destino son dos operandos redundantes que sólo indican el tipo del dato (byte o palabra) a comparar, es más cómodo colocar MOVSB o MOVSW para indicar bytes/palabras. Si se indica un registro de segmento, éste sustituirá en la cadena origen al DS ordinario. Ejemplo: LEA SI, ORIGEN LEA DI, DESTINO MOVSW

SCAS/SCASB/SCASW (Explorar cadena).
Sintaxis: SCAS cadena_destino SCASB (bytes) SCASW (palabras) OF DF IF TF SF ZF AF PF CF x - - - x x x x x

Indicadores:

Resta de AX o AL una cadena destino direccionada por el registro DI sobre el segmento extra. Ninguno de los valores es alterado pero los indicadores se ven afectados. DI se incrementa o decrementa según el valor de DF (véanse CLD y STD) en una o dos unidades -según se esté trabajando con bytes o palabras- para apuntar al siguiente elemento de la cadena. Cadena_destino es un operando redundante que sólo indica el tipo del dato (byte o palabra), es más cómodo colocar SCASB o SCASW para indicar bytes/palabras. Ejemplo: LEA DI, DESTINO MOV AL, 50 SCASB

M. D. O. H. Sonia Alvarado Mares

114

Lenguaje Ensamblador
STOS/STOSB/STOSW (Almacena cadena).
Sintaxis: Indicadores: STOS cadena_destino STOSB (bytes) STOSW (palabras) OF DF IF TF SF ZF AF PF CF - - - - - - -

Transfiere el operando origen almacenado en AX o AL, al destino direccionado por el registro DI sobre el segmento extra. Tras la operación, DI se incrementa o decrementa según el indicador DF (véanse CLD y STD) para apuntar al siguiente elemento de la cadena. Cadena_destino es un operando redundante que sólo indica el tipo del dato (byte o palabra) a cargar, es más cómodo colocar STOSB o STOSW para indicar bytes/palabras. Ejemplo: LEA DI, DESTINO MOV AX, 1991 STOSW

REP/REPE/REPZ/REPNE/REPNZ (Repetir).
REP repetir operación de cadena REPE/REPZ repetir operación de cadena si igual/si cero REPNE/REPNZ repetir operación de cadena si no igual (si no 0) Estas instrucciones se pueden colocar como prefijo de otra instrucción de manejo de cadenas, con objeto de que la misma se repita un número determinado de veces incondicionalmente o hasta que se verifique alguna condición. El número de veces se indica en CX. Por sentido común sólo deben utilizarse las siguientes combinaciones: Prefijo -------------------REP REPE/REPZ REPNE/REPNZ Ejemplos: 1) Buscar el byte 69 entre las 200 primeras posiciones de tabla (se supone tabla en el segmento ES): LEA MOV MOV
CLD REPNE JE

Función ------------------------------------------Repetir CX veces Repetir CX veces mientras ZF=1 Repetir CX veces mientras ZF=0

Instrucciones -----------------MOVS, STOS CMPS, SCAS CMPS, SCAS

DI, tabla CX, 200 AL, 69
SCASB ENCONTRADO

M. D. O. H. Sonia Alvarado Mares

115

Lenguaje Ensamblador
2) Rellenar de ceros 5000 bytes de una tabla colocada en datos (se supone datos en el segmento ES): LEA MOV MOV CLD REP DI, DATOS AX, 0 CX, 2500 STOSW

3) Copiar la memoria de pantalla de texto (adaptador de color) de un PC en un buffer (se supone buffer en el segmento ES): MOV MOV LEA MOV MOV CLD REP CX,0B800h DS,CX DI,buffer SI,0 CX,2000 MOVSW ; segmento de pantalla ; en DS ;destino en ES:DI ; copiar desde DS:0 ; 2000 palabras ; hacia adelante ; copiar CX palabras

M. D. O. H. Sonia Alvarado Mares

116

Lenguaje Ensamblador
RESUMEN ALFABÉTICO DE LAS INSTRUCCIONES Y BANDERINES. Nota: en el efecto de las instrucciones sobre el registro de estado se utilizará la siguiente notación: - bit no modificado ? desconocido o indefinido x modificado según el resultado de la operación 1 puesto siempre a 1 0 puesto siempre a 0
Instrucción ---------------AAA AAD AAM AAS ADC dst,fnt ADD dst,fnt AND dst,fnt CALL dsp CBW CLC CLD CLI CMC CMP dst,fnt CMPS/CMPSB CMPSW cdst,cfnt CWD DAA DAS DEC dst DIV fnt ESC opcode,fnt HLT IDIV fnt IMUL fnt IN acum,port INC dst INT interrup INTO IRET Jcc (JA, JBE...) JMP JCXZ dsp LAHF LDS dst,fnt LEA dst,fnt LES dst,fnt LOCK LODS/LODSB/ LODSW cfnt Sintaxis --------------------AAA AAD AAM AAS ADC ADD AND CALL CBW CLC CLD CLI CMC CMP CMPS CWD DAA DAS DEC DIV ESC HLT IDIV IMUL IN INC INT INTO IRET Jcc JMP JCXZ LAHF LDS LEA LES LOCK LODS Efecto sobre los flags -------------------------OF DF IF TF SF ZF AF PF CF ? - - - ? ? x ? x ? - - - x x ? x ? ? - - - x x ? x ? ? - - - ? ? x ? x x - - - x x x x x x - - - x x x x x 0 - - - x x ? x 0 - - - - - - - - - - - - - - - - - - - - - - - - 0 - 0 - - - - - - - - 0 - - - - - - - - - - - - - x x - - - x x x x x x ? x ? ? x x x x 0 0 x 0 0 x x x x x ? ? ? x x x x x x ? ? ? x x x x x x ? ? ? x x x x x x ? ? ? x x x x x ? ? x x -

dst,fnt dst,fnt dst,fnt dsp

dst,fnt cdst,cfnt

dst dst opcode,fnt fnt fnt acum,port dst interrup dsp dsp dsp dst,fnt dst,fnt dst,fnt mem

M. D. O. H. Sonia Alvarado Mares

117

Lenguaje Ensamblador
Instrucción ---------------LOOP LOOPcc (LOOPE...) MOV dst,fnt MOVS/MOVSB/ MOVSW cdst,cfnt MUL fnt NEG dst NOP NOT dst OR dst,fnt OUT port,acum POP dst POPF PUSH dst PUSHF RCL dst,cnt RCR dst,cnt REP/REPE/REPZ/ REPNE/REPNZ RET [val] RETF [val] ROL dst,cnt ROR dst,cnt SAHF SAL/SHL dst,cnt SAR dst,cnt SBB dst,fnt SCAS/SCASB/ SCASW cdst SHR dst,cnt STC STD STI STOS/STOSB/ STOSW cdst SUB dst,fnt TEST dst,fnt WAIT XCHG dst,fnt XLAT tfnt XOR dst,fnt Sintaxis --------------------LOOP dsp LOOPcc dsp MOV dst,fnt MOVS MUL NEG NOP NOT OR OUT POP POPF PUSH PUSHF RCL RCR REP RET RETF ROL ROR SAHF SAL SAR SBB SCAS SHR STC STD STI STOS SUB TEST WAIT XCHG XLAT XOR cdst,cfnt fnt fnt dst dst,fnt port,acum dst dst dst,cnt dst,cnt [val] [val] dst,cnt dst,cnt dst,cnt dst,cnt dst,fnt cdst dst,cnt Efecto sobre los flags -------------------------x x 0 x x x x x x x x x x x 0 0 x 1 x 1 x ? x x x x x x x x x x x x ? x x x x x x x x x x x x ? x ? x x ? ? x x ? x ? ? ? x x x x x x x x x x x x x x 0 x x x x x x x x x x x 1 x 0 0

cdst dst,fnt dst,fnt dst,fnt tfnt dst,fnt

M. D. O. H. Sonia Alvarado Mares

118

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->