Está en la página 1de 27

2.

1
Macro Assembler

El Macro Assembler (MASM), es un paquete del ensamblador principalmente destinado


a la plataforma de la compañía de las IBM PC y sus compatibles.

Fue la oferta de Microsoft en el mercado de herramientas de programación en el lenguaje


ensamblador para la familia de los microprocesadores x86.

El paquete d eeste lenguaje, trabaja bien con los compiladores de lenguajes de alto nivel
de Microsoft para las PC’s como Lenguaje C y el Lenguaje Pascal.

Junto con el resto de paquetes de lenguajes de programación Turbo, Turbo Assembler ya


no es mantenido por Borland.

El ensamblado de un programa se lleva a cabo invocando al MASM. Este puede ser


llamado, usando un alína de comando de la siguiente manera:

MASM nombre_archivo.asm [opciones]

Donde:

 Nombre_archivo: Corresponde al nombre que se asigna al programa fuente.


 Opciones: Es el modo en que se realizará el ensamble.

Las opciones pueden ser:

 /a: Orden a los segmentos en orden alfabético.


 /s: Ordena los segmentos en orden del fuente
 /c: Genera un archivo de referencias cruzadas.
 /iPATH: Busca el PATH para archivos incluidos.
 /l: Genera un listado de ensamble.
 /la: genera un listado expandido de ensamble.
 /z: despliega línea fuente con mensaje de error.
 /zi, /zd, /zn: Debug info: zi = completa, zd= números línea, zn= ninguna.

Turbo Linker
El paquete Turbo Aseembler incluye el enlazador Turbo Linker, y es interoperable con el
depurador Turbo Debugger.

Para la compatibilidad con el ensamblador Microsoft, Macro Assembler (MASM) de


Microsoft, TASM también ensambla los archivos de código fuente del MASM por medio de
su modo MASM.

Formato del comando:

TLINK archivo_objeto [opciones]

Donde:

 Archivo_objeto: Es el nombre del archivo objeto.


 Opciones: Es el modo en que se enlaza el programa objeto.

Opciones:

 /x: sin mapa


 /m: mapa incluyendo nombres públicos.
 /s: mapa más mapa detallado de segmentos.
 /l: mapa más números de línea de fuente.
 /i: inicializa todos los segmentos.
 /L: especifica las rutas de búsqueda de librerías.
 /v: información simbológica de debug completa.

Turbo Debugger

Turbo Debugger es un conjunto de herramientas diseñadas para ayudar a depurar


programas desarrollados con la líneas de compiladores y ensambladores de Borland.

Turbo Debugger ayuda a depurar los programas escritos para Win16, Win32 y DOS.

Al cargar el programa en Turbo Debugger se puede controlar la ejecución del programa y


visualizar diferentes aspectos de la ejecución del programa.

Al monitorear las salidas del programa, como el código de fuente, las estructuras de datos
y valores del programa, es posible localizar aún los errores más difíciles.

Dentro de las características de Turbo Debugger se encuentran las siguientes:


 Evaluación completa de expresiones en ensamblador, C, C++ y Pascal.
 Control total de la ejecución del programa, incluyendo animaciones.
 Acceso de bajo nivel a los registros del CPU y la memoria del sistema.
 Capacidad de inspección de datos completa.
 Facilidades para el manejo de ejecución paso a paso de los programas,
incluyendo puntos de ruptura (breakpoints).
 Soporte total de programación orientada a objetos.

Formato del comando:

TD archivo_ejecutable

Donde:

Archivo_ejecutable: Es el nombre del archivo en lazado.

Proceso de ensamble

El ensamblador (Assembler) convierte un archivo fuente simbólico en un archivo objeto


hexadecimal.

El archivo fuente debe tener una extensión .ASM parar que pueda ser reconocido por el
ensamblador.

Una de las tareas que realiza el ensamblador durante el proceso de ensamblaje, es


calcular el desplazamiento de cada elemento en el segmento de datos y de cada
instrucción en el segmento de código, para generar un programa con una extensión .obj.

El ensamblador también crea un encabezado al frente del módulo .OBJ generado, parte
de este encabezado tiene información acerca de las direcciones incompletas que
contenga dicho programa.

El módulo .OBJ generado aún no está en forma ejecutable.

Durante el proceso de enlace, el programa enlazador (linker) lee los archivos objeto
(extensión .OBJ) creados por el ensamblador, los enlaza con el conjunto de instrucciones
del procesador que componen el programa fuente, escrito en lenguaje ensamblador, y
genera un archivo ejecutable de salida (extensión .EXE).
El enlazador enlaza las instrucciones que componen un módulo para formar un solo
programa con todas las instrucciones.

Otra de las tareas del enlazador es combinar los programas ensamblados en forma
separada en un solo programa ejecutable.

Si un archivo tiene menos de 64K de longitud, se puede convertir de archivo ejecutable en


archivo de comandos (extensión .COM).

Este archivo se origina en la localidad 100H y tiene la ventaja de que requiere poco
espacio en disco y en memoria, además de que se ejecuta rápidamente.

El Sistema Operativo ofrece soporte a dos tipos de programas ejecutables:

.COM y .EXE

Un programa .COM consta de un solo segmento que contiene código, datos y pila.

Un programa .EXE consta de segmentos de código, programa y pila separados.

Cuando se llama un programa desde el disco para su ejecución, el cargador del sistema
operativo realiza las siguientes acciones:

Accede al programa .EXE en el disco.

Construye un prefijo de segmento de programa (PSP) de 256 bytes (100H) en un límite de


párrafo en la memoria interna disponible.

Almacena el programa en memoria inmediatamente después del PSP.

Carga la dirección del PSP en los registros DS y ES.

Carga la dirección del segmento de código en el CS y establece el IP al desplazamiento


de la primera instrucción (generalmente cero) en el segmento de código.

Carga la dirección del a pila en el SS y establece el SP al tamaño de la pila.

Transfiere el control al programa para ejecución, iniciando con la primera instrucción del
segmento de código.

En esta forma, el cargador del DOS inicializa los registros CS:IP y SS:SP.
Aunque se debe observar que el cargador almacena la dirección del PSP tanto en el
registro DS como en el ES, aunque normalmente se requiere la dirección del segmento de
datos en estos registros.

Como consecuencia, los programas tienen que inicializar el DS con la dirección del
segmento de datos.

Procedimiento de depuración

Una de las teorías en computación dice que el programa que funciona bien desde la
primera vez seguramente tiene errores.

El número de errores posibles en un programa es proporcional al número de líneas e


inversamente proporcional a la experiencia del programador.

El dominio de la arquitectura del sistema así como del lenguaje ensamblador facilitan la
escritura de programas sin errores.

La práctica de la programación en lenguaje ensamblador también ayuda a escribir


programas libres de errores o al menos con los mínimos errores posibles.

El propio ensamblador ayuda a encontrar errores ortográficos o de sintaxis durante el


proceso de ensamble.

El enlazador también participa en la localización de errores en tiempo de ejecución.

Aún con esa ayuda, es posible que en el momento de ejecutar un programa, surjan
problemas de diseño que lleven a resultados erróneos.

Por todo lo anterior se recomienda desarrollar un programa paso a paso evitando “pensar
y teclear” inmediatamente.

Se recomienda plantear el problema a resolver y las acciones a realizar.

Elaborar un algoritmo que establezca los pasos a seguir hasta terminar un procedimiento.

Elaborar un diagrama de flujo que defina claramente todas las rutas de ejecución del
programa, los procesos, entradas y salidas.

Definir las variables que se vayan a utilizar incluyendo los tipos y tamaños.
Codificar el programa utilizando correctamente la sintaxis del lenguaje, la arquitectura del
sistema, el conjunto de instrucciones, los modos de direccionamiento y el lenguaje
ensamblador.

Realizar una prueba de escritorio para evaluar todos los pasos anteriores, antes de
capturar el programa.

Capturar el programa utilizando el programa codificado ya corregido, si tiene muchas


líneas es conveniente que alguien más lo revise.

Si a pesar de todo lo anterior surgen problemas durante la ejecución, lo cual es altamente


probable, se recomienda utilizar el Turbo Debugger, herramienta de depuración que
facilita la prueba de programas así como la corrección de errores al permitir la ejecución
paso a paso de los programas

Además de que permite visualizar el estado de los registros del procesador y las banderas
que intervienen durante la ejecución del programa, también permite visualizar el contenido
de los segmentos en memoria.

Aprender a programar en un lenguaje de programación requiere de la dedicación para el


conocimiento previo de las instrucciones que maneja el mismo lenguaje.

Corresponde al programador la dedicación del tiempo necesario para hacerlo y poner en


práctica los conocimientos adquiriros para el dominio del lenguaje.

2.2 Ciclos numéricos


La mayoría de los programas constan de varios ciclos en los cuales una serie de pasos se
repite hasta alcanzar un requisito o una condición específica y varias pruebas para
determinar qué acción se debe realizar de entre varias posibles.

Una instrucción usada comúnmente para la transferencia de control es la instrucción JMP


(Jump, salto, bifurcación).

Un salto es incondicional, ya que la operación transfiere el control bajo cualquier


circunstancia.
La instrucción JMP vacía el resultado de la instrucción previamente procesada; por lo
que, un programa con muchas operaciones de salto puede perder la velocidad de
procesamiento.

La instrucción LOOP, requiere un valor inicial en el registro CX.

En cada iteración, LOOP de forma automática disminuye 1 de CX.

Si el valor en el registro CX es cero, el control pasa a la instrucción que sigue; si el valor


en CX no es cero, el control pasa a la dirección del operando.

La distancia debe ser un salto corto, desde –128 hasta + 128 bytes.

Para una operación que exceda ese límite, el ensamblador envía un mensaje como “salto
relativo fuera de rango”.

2.3. Tipos de ciclos

2.3.1. Ciclos Incondicionales


Los ciclos incondicionales utilizan la instrucción JMP.

Cuando se utiliza esta instrucción dentro de un programa afecta los registros de banderas
durante la ejecución del mismo, como se muestra a continuación.

JMP (salto)

Sintaxis: JMP dirección o JMP SHORT

Dirección

Indicadores: 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 se vio anteriormente, 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 dos pasadas, colocan donde es
posible un salto corto, para economizar memoria, sin que el programador tenga que
ocuparse de poner la instrucción short.

Si el salto de dos bytes, que permite los desplazamientos de 64 K en la memoria sigue


siendo insuficiente, se puede indicar con far que es largo (salto a otro segmento).

 Ejemplos: jmp etiqueta


Jmp far ptr etiqueta

OTRA: ;Fragmento del programa OPERA.ASM

Mov Dx, Offset Pregunta ;Despliega menú de opciones

Call Imprime

Call ObtenTecla ; espera que el usuario selecciones la función a realizar (1 a 5)

Cmp Al 49 ;La selección del suauairo es mayor o igual a 1?

Jae SIGUE

Mov DX, Offset Error ;NO, despliega mensaje de error.

Call Imprime

Jmp OTRA

SIGUE:

Cmp Al,53 ;la selección del usuario es igual o

Jbe TODOBIEN ;menor a 5?

Mov Dx, Offset Error ;NO, despliega mensaje de error

Call Imprime

Jmp OTRA
2.6. Ciclos Condicionales
Los ciclos inconcionales utilizan la instrucción LOOP para evaluar la condición que se
utilizará en el programa.

Cuando se utiliza esta instrucción dentro de un programa afecta los registros de banderas
durante la ejecución del mismo, como se muestra en el siguiente ejemplo:

Este tipo de transferencia de programa consiste en transferir el control del programa a


subrutinas, procedimientos, rutinas de interrupción o simplemente otro lugar del programa,
siempre y cuando se cumpla con alguna condición, o condiciones, en particular.

; Fragmento del programa HEXA.ASM

Mov Ck, 15 ; Contador de los números (van a ser 15).

Mov Bx, OFFSET Tabla

Itera: ; Etiqueta

Mov Al, Cl ; Pone en Al el número a traducir

Xlat ; (empezando desde 15) y lo traduce.

Mov Dl, Al ; Despliega el número usando la

Mov Ah, 2 ; función 2 de la int 21h. Dl tiene

Int 21h ; el carácter a ser desplegado.

Mov Dl,10 ; Salda una línea dando un efecto de

Int 21h ; escalera. De nuevo se usa la función 2.

Loop Itera ; Itera hasta llegar a 0 (de 15 a 0).

Otras instrucciones que se utilizan para los ciclos condicionales son las siguientes:

 LOOPE/LOOPZ; ciclo si igual, si cero. Z=1 y CX <> 0


 LOOPNE /LOOPNZ; ciclo si no igual, si no cero. Z=0 y CX <> 0.
2.4 Comparación y prueba
La instrucción CMP por lo común es utilizada para comparar dos campos de datos, uno
de los cuales están contenidos en un registro.

El formato general para la instrucción CMP es el siguiente:

| [etiqueta:] | CMP | {registro/memoria}, {registro/memoria/inmediato}|

El resultado de una operación realizada con la instrucción CMP afecta las siguientes
banderas AF, CF, OF, PF, SF y ZF, aunque no se tienen que probar estas banderas de
forma individual.

El código siguiente prueba el registro BX por un valor cero:

Este ejemplo se puede realizar con dos tipos de instrucciones diferentes de la siguiente
forma:

CMP BX, 00 ; Compara BX con cero

JZ B50 ; Si es cero salta a B50

 ; (Acción si es diferente de cero)



B50: … ; Destino del salto, si BX es cero

Si el BX tiene cero, CMP establece la bandera ZF a 1 y puede o no cambiar la


configuración de otras banderas.

La instrucción JZ (salta si es cero) solo prueba la bandera ZF.

Debido a que ZF tiene 1 (que significa una condición cero), JZ transfiere el control (salta)
a la dirección indicada por el operando B50.

Observe que la operación compara el primer operando con el segundo.

Por ejemplo, ¿el valor del primer operando es mayor que, igual o menor que el valor del
segundo operando?
2.5 Saltos
Los saltos que se definen en un programa se utilizan para cambiar el flujo durante la
ejecución.

Un salto puede ser evaluado utilizando una instrucción dependiendo de las necesidades
o condiciones que se vayan a evaluar.

Saltos condicionales para números sin signo.

JA/JNBE Jump

JAE/JNB Jumps above or equal to/ Jumps not bellow

JB/JNAE Jumps below / jumps not above or equal to

JBE/JNA Jumps below or equal to /Jumps not above

JC Jumps carry set

JE/JZ Jumps equal / Jumps 0

Saltos condicionales para números con signo

 JG/JNLE Jumps greater / Jumps not less than or equal to


 JGE/JNL Jumps
 JL/JNGE Jumps less than / Jumps not greater or equal to
 JLE/JNG Jumps less than or equal to / Jumps not greater than
 JNC Jumps not carry
 JNE/JNZ Jumps not equal to/ Jumps not o
 JNO Jumps no overflow
 JNP/JPO Jumps no parity / Jumps parity ocd
 JNS Jumps no sign (positive)

2.7 Incremento y decremento


El incremento y decremento en el lenguaje ensamblador se lleva a cabo con las
instrucciones INC y DEC.

Estas instrucciones son las más básicas a la hora de hacer operaciones con registros:
La instrucción INC incrementa el valor de un registro, o de cualquier posición en memoria,
en una unidad, y DEC lo decrementa.

La instrucción DEC decrementa el valor de un registro, o de cualquier posición en


memoria, en una unidad.

La instrucción INC AX, incrementa en uno el valor del registro AX.

INC WORD PTR [BX + 4], incrementa la palabra situada en CS: [BX +4] en uno.

La instrucción DEC AX, decrementa el registro AX en una unidad (le resta uno).

DEC WORD PTR [BX+4], decrementa la palabra situada en CS:[BX+4] en una unidad.

Estas dos instrucciones, son equivalentes a la instrucción “a++” o “a- -“ del lenguaje C.

2.9 Instrucciones aritméticas


El procesador 8086 incorpora instrucciones suficientes para efectuar operaciones básicas
de suma, resta, multiplicación y división.

Cada instrucción tiene capacidad para trabajar con operandos de 8 o 16 bits, con signo o
sin él.

Existen tres instrucciones que se pueden utilizar en las instrucciones de sumas:

ADD (suma)

ADC (suma con acarreo) requieren de dos operandos.

INC (incrementa) necesita sólo un operando.

ADD destino, fuente;

Suma el operando fuente al operando destino y deja el resultado en el registro destino.

MOV DX, 5
MOV DX, 6
ADD DX, CX
La instrucción ADD, también puede usarse con localidades de memoria como se muestra
en los siguientes ejemplos:

MOV AX, 5
MOV DX, 6
ADD AX, DX
ADD M1, AX

ADD destino, fuente: cuando se realiza esta operación se afecta el registro de banderas:

0 S Z A P C

Las instrucciones que se utilizan para llevar a cabo las operaciones aritméticas de suma
son:

ADD Adds bytes or words

ADC Adds bytes or words plus carry flag

AAA Adjusts ASCII after addition

DAA Adjusts BCD after addition

INC Add 1 to byte or word

Las instrucciones que se utilizan para llevar a cabo las operaciones aritméticas de resta
son:

SUB Subtracts bytes or words

SBB Subtracts bytes or words minus carry flag

ASS Adjusts ASCII after subtraction

DAS Adjusts BCD after subtraction

DEC Subtracts 1 from byte or word

NEG Changes sign of byte or word

CMP Compares bytes or word


Las instrucciones que se utilizan para llevar a cabo las operaciones aritméticas para la
multiplicación son:

MUL Multiplies unsigned byte or Word

IMUL multiplies signed byte or word

AAM Adjusts ACII after multiplication

Instrucciones que se utilizan para llevar a cabo las operaciones aritméticas para la división
son:

DIV Divides unsigned byte or Word

IDIV Divides signed byte or word

CBW Converts byte to word

CWD Converts word to double word

AAD Adjusts ASCII before division

Divide Proc Near

Mov AX, CantUnoR ;Carga el dividendo

Mov Bx, CantDosR ;Carga el divisor

Cmp bx, 9 ; evita error de

Jnz DIVIDE01 ;DIVISION POR CERO

AJUSTES

Las operaciones que se llevan a cabo entre los registros y la memoria se realizan en
formatos binarios; cuando se desea presentar datos numéricos o resultados en pantalla,
generalmente se hace en formatos codificados, como código ASCII o BCD.
Sin embargo, el procesador también permite la manipulación aritmética de números tanto
en código BCD como en ASCII.

Esto se logra por medio de instrucciones que ajustan los números para aritmética BCD o
aritmética ASCII.

A continuación se muestran las instrucciones para realizar estas operaciones.

AAA Adjusts ASCII after addition

DAA Adjust BCD after addition

AAS Adjust ASCII after subtraction

DAS Adjust BCD after subtraction

AAM Adjust ASCII after multiplication

AAD Adjust ASCII before division

DAA (ajuste incremental para la suma)

Sintaxis: DAA

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
al registro AL.

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 al registro AL.

Ejemplo: add al, cl


daa

En el ejemplo anterior, si los registros AL y CL contenían dos números en código BCD


empaquetados, la instrucción DAA hace que el resultado de la suma en el registro AL siga
siendo también un código BCD empaquetado.
0000 BA1234 mov dx, 1234H ;carga 1,234
0003 BB3099 mov bx,3099H ;carga 3,099
0006 8AC3 mov bl, dl ;Suma bl con dl
0008 02C2 add al, dl
000A 27 daa ;ajusta a BCD
000B 8AC8 mov cl, al ; resultado a cl
000D 8AC7 mov al, bh ;sum bh, dh y carry
000F 12C6 adc al, dh
0011 27 daa ; Ajustaa a BCD
0012 8AE8 mov ch, al ; resultado a ch, resultado en cx

2.10 Manipulación de la pila

La pila es una estructura de la memoria que utiliza el método LIF (último en entrar,
primero en salir) para manipular los datos.

La pila siempre está relacionada con los registros SS, SP y BP.

Cualquier cálculo de Memoria que se realice siempre estará en función de SS.

Los desplazamientos dentro del segmento SS se manejan a través de los registros SP y


BP.

La pila siempre crece de las localidades de memoria alta a las localidades de memoria
baja.

Para almacenar algún dato en la estructura de la pila, el CPU decrementa el apuntador de


pila en dos (SP=SP-2) y después almacena el dato en la localidad especificada por
SS:SP.

De manera similar, para sacar un dato de la pila, el CPU lo mueve de la localidad


especificada SS:SP al registro indicado, y después incrementa el apuntador en dos
(SP=SP+2).
La operación de decrementar o incrementar en dos se debe a que la pila solo trabaja con
palabras (una palabra tiene 16 bits o dos bytes).

Aunque se guarde sólo un byte, siempre se almacenarán dos.

La pila se utiliza por omisión con las instrucciones, CALL, INT, RET, e IRET para guardar
o restaurar la dirección de retorno antes de ejecutar las rutinas indicadas por dichas
instrucciones.

También puede usarse para pasar parámetros entre rutinas, o bien de un lenguaje de alto
nivel a ensamblador.

La pila es manipulada mediante dos instrucciones: PUSH (pone o almacenan la pila) y


POP (quita o saca de la pila).

Un concepto muy importante en el manejo de la pila es que los valores extraídos deben
estar en un orden inverso al que tenían cuando se guardaron (debido a que es una
estructura LIFO).

Ejemplo de rutina de interrupción

Procedimiento que activa TF


0000 TRON PROC NEAR
0000 50 PUSH AX ; Salva registros
0001 55 PUSH BP
0002 8B EC MOV BP, SP ; Toma SP
0004 8B 46 08 MOV AX, [BP+8] ; Toma banderas
0007 80 CC 01 OR AH, 1 ; Activa TF
000A 89 46 08 MOV [BP+8], AX ; Guarda bandera
000D 5D POP BP ; Restaura
000E 58 POP AX ; Registros
000F CF IRET ;

2.12. Instrucciones lógicas

El ensamblador tiene capacidad para ejecutar cuatro tipos diferentes de instrucciones


lógicas: AND, OR, NOT y XOR.

Las cuales efectúan sus operaciones bit por bit sobre sus operandos, la instrucción NOT
difiere de las demás instrucciones lógicas en que complementa todos los bits de su
operando.

AND (Y lógico),

Sintaxis; AND destino, origen

Indicadores: OF, DF, IF, TF, SF, ZF, AF, PF, CF

o - - - x x ? x o

Realiza una operación de Y lógico entre el operando origen y destino quedando el


resultado en el desino. Son válidos los operandos byte o palabra, pero ambos deben ser
del mismo tipo.

Ejemplos:

 And ax, bx
 And bl, byte ptr es:[si +10h]

OR (O Lógico):
Sintaxis: OR destino, origen

Indicadores: OF, DF, IF, TF, SF, ZF, AF, PF, CF

o - - - x x ? x o

Realiza una operación O lógico a nivel de bits ente los dos operandos, almacenándose
después el resultado en el operando destino

Ejemplo: OR ax,bx

NOT (no logico)

Sintaxis: Not destino

Indicadores: 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

XOR (O logicco)

Sintaxias: XOR destino, origen

Indicadores : OF, DF, IF, TF, SF, ZF, AF, PF, CF

0 - - - x x ? x 0

Operación OR exclusive a nivel de bits entre los operandos origen y destino


almacenándose el resultado en este ultimo

Ejemplo: XOR di,ax


Existen ocasiones en las cuales es importante tener la capacidad de probar un bit
específico dentro de un byte o palabra se encuentra encendido apagado

Es obvio que la instrucción CMP no sirve para ese propósito, puesto que trabaja sobre el
conjunto de bits que forman el byte o palabra

En estos casos se usa la instrucción TEST, a cual establece si el bits sometido a prueba
no se encuentra encendido, la bandera de cero se enciende de lo contrario se apaga

El principal uso de esta instrucción se presenta al trabajar con puerto para probar el
estado de algún bits en particular:

Mov Dx, 3FDh

Espera: In AL,DX

Test AL, 1

Jz Espera

TEST (comprobación lógica)

Sintaxis: TEST destino, origen

Indicadores:

Indicadores: 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


Desplazamiento y rotación

Las instrucciones de desplazamiento y rotación manipulan números binarios al nivel de


bits de la misma manera que as instrucciones : AND, OR,NOT, y XOR

Por lo general los desplazainentos y rotaciones encuentran sus aplicaciones mas


comunes en el …… falta

Las instrucciones de desplazamiento colocano mueven hacia la izquierda o derecha


dentro de un registro de localidad de memoria

También realiza operaciones aritméticas simples, como la multiplicación por potencia de 2


(desplazamiento hacia la izquierda) y a división entre potencias de 2 ( desplazamiento
derecho)

SAL/SHL (desplazamiento lógico a la izquiereda)

Sintaxis: SAL/SHL destino, contador

Indicadores

Indicadores: OF, DF, IF, TF, SF, ZF, AF, PF, CF

o - - - x x ? x x

dezplaza a la izquierda los bits del operando el numero de bits especificado en el segundo
operando que debe ser CL CL si es mayor que 1 los bits desplazados

CF  ALTO bajoo SAL/SHL

SHR (desplazamiento lógico a la derecha)


Sintaxis SHR destino, contador

Indicadores: OF, DF, IF, TF, SF, ZF, AF, PF, CF

o - - - x x ? x x

Desplaza a la derecha los bits del operando destino el numero de los bits especificados
en el segundo operando los bits de la izquierda se llenan con el valor de cero.

Si el numero de bits a desplazar es 1 se puede especificar directamente en el caso en


que no ocurra se pone el valor en CL

0 -->alto bajo -o SAL/SHL

SAR(desplazamiento aritmético a la dderecha)

Sintaxis: SAR destino contador

Indicadores: OF, DF, IF, TF, SF, ZF, AF, PF, CF

o - - - x x ? x x

desplaza a la derecha los bits del operando destino el numero de bits especificado en el
segundo operando.

Los bits de la izquierda se llenan con l bits de signo del primer operando

Si el numero de bits a desplazar es 1 se puede especificar directamente si es mayor se


especifica a través de CL
Alto bajo CF

HR ECX, 10 ; ECX el el desplazado lógicamente 10 lugares a la derecha

SAL DATA 1, CL ; el contenido de la localidad de memoria del segmento de datos1 es


desplazado aritméticamente a la izquierda el número especificado en CL

SAR SI, 2; , 14, ; SI es desplazado aritméticamente 2 lugares hacia la derecha

SAR EDX, 14, ; edx es desplazado aritméticamente 14 lugares hacia la derecha

DESPLAZAMIENTO CIRCULAR

Las instrucciones de rotación colocan datos binarios desplazando en forma circular a la


información en un registro o localidad de memoria, ya sea de un extremo a otro o por
medio de la bandera de acarreo

Una cuenta de rotación puede ser inmediata o colocarse en el registro CL


RCL (rotación a la izquierda con acarreo)

Sintaxis: RCL destino, contador

Indicadores: OF, DF, IF, TF, SF, ZF, AF, PF, CF

o - - - - - - - x

Rotar a la izquierda los bits del operando destino junto con el indicador de acarreo CF en
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 o 15 en palabras

CF Alto bajo
RCL

RCR ( rotación a la derecha con acarreo9

Sintaxis: RCR destino, contador

Ndicadores: OF DF IF TF SF ZF AF PF CF

X-------x

Rotar a la derecha los bi¿ts del opernndo destino no junto con el indicador de acarreo
CF en numero de birts especificado en el segundo operando
Si el numero de bits es 1 se puede especificar directamente, en caso contrario su valor
debe cargarse en CL y especificar CL como segundo operando

Alto bajo CF RCR

ROL 8rotacion a la izquierda)

Sintaxis : ROL destino, contador

incadores: OF DF IF TF SF ZF AF PF CF

X-------x

Rota a la izquiereda los bits del oprendo destino, el numero de bits especificando en el
Segundo operando, que puede ser 1 o CL peviamente cargado con el valor de numero de
veces

CF Alto bajo ROL


ROR ( rotación a la derecha )}

Sintaxis: ROR destino, contador

Indicadores: OF DF IF TF SF ZF AF PF CF

X-------x

Rota a ala derecha los bits del operando destino e numero de bits especificado en ele
Segundo operando

si el número de bits es 1 se puede poner directamente, en caso contrario debe ponerse a


través de CL

Alto bajo CF

EJEMPLOS

ROL SI, 14 ; rota 14 lugares a la izquierda

RCL BL, 6 ; rota a BL 6 lugares a la izquierda a través del acarreo

ROL ECX, 18 ; Rota a ECX 18 lugares a la izquiereda

RCR AH, CL ; Rota a AH hacia la derecha el número de lugares especificado por CL a


;través del acarreo.

También podría gustarte