Codigos
Codigos
Codigos
LOOPE/LOOPZ – Bucle si igual / Bucle si cero (Loop While Equal / Loop While Zero)
Uso: LOOPE label
LOOPZ label
Flags que modifica: Ninguno
Descripción: Decrementa el registro contador (CX). Si ZF = 1 y CX es distinto de cero, entonces IP = IP +
desplazamiento (expandiendo el signo del desplazamiento a 16 bits). Si ZF = 0 o CX = 0, entonces se ejecuta la
instrucción siguiente. El desplazamiento debe estar comprendido ente - 128 y +127 bytes de esta instrucción, es
decir, desplazamiento es un valor con signo de 8 bits (1 byte).
POPA – Quitar registros de la pila (Pop All Registers onto Stack) (80188+)
Uso: POPA
Flags que modifica: Ninguno
Descripción: Transdiere los 8 registros de propósito general desde la pila, en el siguiente orden: DI; SI; BP; SP, DX,
CX y AX.
PUSHA – Poner registros en la pila (Push All Registers onto Stack) (80188+)
Uso: PUSHA
Flags que modifica: Ninguno
Descripción: Transdiere a la pila los 8 registros de propósito general, en el siguiente orden: DI; SI; BP; SP, DX, CX
y AX.
PUSHF – Poner banderas en la pila (Push Flags onto Stack)
Uso: PUSHF
Flags que modifica: Ninguno
Descripción: Decrementa el puntero de la pila (SP) en 2 y luego transfiere los valores de las banderas a bits
específicos de la palabra de la pila direccionada por el registro SP:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
- - - - O D I T S Z - A - P - C
F F F F F F F F F
RCL – Rotar a la izquierda a través del acarreo (Rotate Through Carry Left)
Uso: RCL dest,count
Flags que modifica: CF OF
Descripción: Rotar a la izquierda los bits del operando destino junto con la bandera 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. Si es mayor que 1, su valor debe
cargarse en CL y especificar CL como segundo operando.
RCR – Rotar a la derecha a través del acarreo (Rotate Through Carry Right)
Uso: RCR dest,count
Flags que modifica: CF OF
Descripción: Rotar a la derecha los bits del operando destino junto con la bandera 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. Si es mayor que 1, su valor debe
cargarse en CL y especificar CL como segundo operando.
Las operaciones repetitivas con cadenas son interrrumpibles, es decir, el procesador reconocerá la interrupción
antes de procesar el siguiente elemento. Esta instrucción genera un byte prefijo. Otros bytes prefijos son:
-· LOCK.
-· especificación de registro de segmento.
Se pueden combinar diferentes prefijos, pero deben desactivarse las interrupciones, pues la interrupción devuelve
el control a la instrucción interrumpida o al prefijo anterior a esa instrucción.
XCHG – Intercambiar
(eXCHGange) Uso: XCHG
dest,src Flags
que modifica: Ninguno
Descripción: Intercambia el contenido entre los dos operandos (tipo byte o palabra).
No pueden utilizarse registros de segmento como operandos.
EJEMPLO
0000 0001 1010 0001 01 A1
ENSAMBLADORES Y MACROENSAMBLADORES:
Existen varios ensambladores disponibles para ambiente MS-DOS: el IBM Macro Assembler, el
Turbo Assembler de Borland, el Turbo Editassm de Speedware, por citar algunos. Una breve
descripción de cada uno se propociona a continuación.
Turbo Assembler.- De Borland Intl., es muy superior al Turbo Editassm. Trabaja de la misma
forma, pero proporciona una interfaz mucho más fácil de usar y un mayor conjunto de
utilerías y servicios.
En lo que se refiere a las presentes notas, nos enfocaremos al Microsoft Macro Assembler
v4.0. Los programas ejemplo han sido desarrollados con éste y está garantizado su
funcionamiento. Estos mismos programas posiblemente funcionen con otros ensambladores
sin cambios o con cambios mínimos cuando utilizan directivas o pseudoinstrucciones.
Los programas que componen el Macro Ensamblador Microsoft v4.0 son los siguientes:
Programa Descripción
was printed.
El Microsoft Macro Assembler v4.0 crea código ejecutable para procesadores 8086, 8088,
80186, 80188, 80286, 8087 y 80287. Además es capaz de aprovechar las instrucciones del
80286 en la creación de código protegido y no protegido.
Campo etiqueta: Una etiqueta debe comenzar con un carácter alfabético y puede contener
· Letras de la A a la Z
· Números del 0 al 9
Campo operando: Contiene la posición o posiciones donde están los datos que van a ser manipulados
por la instrucción.
Campo comentario: Se utiliza para documentar el código fuente del ensamblador. Debe separarse
Columna el carácter
DIRECTIVAS (Instrucciones para el ensamblador)
Definición de símbolos
EQU: Define nombres simbólicos que representan valores u otros valores simbólicos. Las dos formas
son:
nombre EQU expresión
nuevo_nombre EQU viejo_nombre
Una vez definido un nombre mediante EQU, no se puede volver a definir.
=: Es similar a EQU pero permite que el símbolo se pueda redefinir. Sólo admite la forma: nombre =
expresión.
Definición de datos
Ubica memoria para un ítem de datos y opcionalmente asocia un nombre simbólico con esa dirección
de memoria y/o genera el valor inicial para ese ítem.
sentencias
nombre_segm ENDS
Alineación: define el rango de direcciones de memoria para el cual puede elegirse el inicio del segmento.
Hay cinco posibles:
Combinación: define cómo combinar segmentos que tengan el mismo nombre. Hay cinco posibles:
1. PUBLIC: Concatena todos los segmentos que tienen el mismo nombre para formar un sólo
segmento. Todas las direcciones de datos e instrucciones se representan la distancia entre el inicio
del segmento y la dirección correspondiente. La longitud del segmento formado será la suma de
las longitudes de los segmentos con el mismo nombre.
2. STACK: Es similar a PUBLIC. La diferencia consiste que, al comenzar la ejecución del programa, el
registro SS apuntará a este segmento y SP se inicializará con la longitud en bytes de este
segmento.
3. COMMON: Pone el inicio de todos los segmentos teniendo el mismo nombre en la misma dirección
de memoria. La longitud del segmento será la del segmento más largo.
Si no se indica combinación, el segmento no se combinará con otros del mismo nombre (combinación
"privada").
Clase: Es una forma de asociar segmentos con diferentes nombres, pero con propósitos similares. Sirve
también para identificar el segmento de código. Debe estar encerrado entre comillas simples.
El linker pone los segmentos que tengan la misma clase uno a continuación de otro, si bien siguen
siendo segmentos diferentes. Además supone que los segmentos de código tiene clase CODE o un
nombre con el sufijo CODE.
DOSSEG: Esta directiva especifica que los segmentos deben ordenarse según la convención de DOS.
Esta es la convención usada por los compiladores de lenguajes de alto nivel.
GROUP: Sirve para definir grupos de segmentos. Un grupo es una colección de segmentos asociados
con la misma dirección inicial. De esta manera, aunque los datos estén en diferentes segmentos, todos
pueden accederse mediante el mismo registro de segmento. Los segmentos de un grupo no necesitan ser
contiguos.
Sintaxis: nombre_grupo GROUP segmento [, segmento...]
ASSUME: Sirve para indicar al ensamblador qué registro de segmento corresponde con un segmento
determinado. Cuando el ensamblador necesita referenciar una dirección debe saber en qué registro de
segmento lo apunta.
Sintaxis: ASSUME reg_segm:nombre [, reg_segm:nombre...]
donde el nombre puede ser de segmento o de grupo, una expresión utilizando el operador SEG o la
palabra NOTHING, que cancela la selección de registro de segmento hecha con un ASSUME anterior.
Control del ensamblador
ORG expresión: El offset del código o datos a continuación será la indicada por la expresión. Todos los
símbolos que forman la expresión deben conocerse en el primer paso de ensamblado.
EVEN: Hace que la próxima instrucción o dato se ensamble en la siguiente posición par.
END [etiqueta]: Debe ser la última sentencia del código fuente. La etiqueta indica dónde debe comenzar
la ejecución del programa. Si el programa se compone de varios módulos, sólo el módulo que contiene
la dirección de arranque del programa debe contener la directiva END etiqueta. Los demás módulos
deberán terminar con la directiva END (sin etiqueta).
Definición de procedimientos
Los procedimientos son secciones de código que se pueden llamar para su ejecución desde distintas
partes del programa.
sentencias
etiqueta ENDP
Ensamblado condicional
Verifican una condición determinada y si se cumple, ensambla una porción de código. Opcionalmente
puede ensamblarse otra porción de código si la condición no se cumple. Son los siguientes: IF, IF1, IF2,
IFB, IFDEF, IFDIF, IFE, IFIDN, IFNB, IFNDEF, ENDIF, ELSE.
{IF|IFE} condición
[ELSE
ENDIF
La directiva ELSE y sus sentencias son opcionales. ENDIF termina el bloque y es obligatorio. Se
pueden anidar directivas condicionales.
IF1 permite el ensamblado de las sentencias sólo en el primer paso, mientras que IF2 lo permite en el
segundo paso.
IFDEF nombre permite el ensamblado de las sentencias si el nombre está definido, mientras que
IFNDEF nombre lo permite si no está definido.
IFB <argumento> permite el ensamblado si el argumento en una macro es blanco (no se pasó el
argumento).
IFNB <argumento> permite el ensamblado si el argumento en una macro no es blanco (se pasó el
argumento).
IFIDN <argumento1>, <argumento2> permite el ensamblado si los dos parámetros pasados a la macro
son idénticos.
IFDIF <argumento1>,<argumento2> permite el ensamblado si los dos parámetros pasados a la macro
son diferentes.
Macros: Las macros asignan un nombre simbólico a un bloque de sentencias fuente. Luego se puede
usar dicho nombre para representar esas sentencias. Opcionalmente se pueden definir parámetros para
representar argumentos para la macro.
Definición de macros
nombre_macro MACRO [Parámetro [,parámetro...]]
[LOCAL nombre_local[,nombre_local...]
sentencias
ENDM
Los parámetros son opcionales. Si existen, entonces también aparecerán en algunas de las sentencias en
la definición de la macro. Al invocar la macro mediante:
nombre_macro [argumento [,argumento..]]
se ensamblarán las sentencias indicadas en la macro teniendo en cuenta que cada lugar donde aparezca
un parámetro se reemplazará por el argumento correspondiente.
El nombre_local de la directiva LOCAL es un nombre simbólico temporario que será reemplazado por
un único nombre simbólico (de la forma ??número) cuando la macro se invoque.
Todas las etiquetas dentro de la macro deberán estar indicadas en la directiva LOCAL para que el
ensamblador no genere un error indicando que un símbolo está definido varias veces.
La directiva EXITM (usada dentro de la definición de la macro) sirve para que no se ensamblen más
sentencias de la macro (se usa dentro de bloques condicionales).
PURGE nombre_macro [,nombre_macro...]: Borra las macros indicadas de la memoria para poder
utilizar este espacio para otros símbolos.
Definición de bloques de repetición
Son tres: REPT, IRP e IRPC. Como en el caso de la directiva MACRO, se puede incluir las sentencias
LOCAL y EXITM y deben terminarse con la directiva ENDM.
REPT expresión
sentencias
ENDM
La expresión debe poder ser evaluada en el primer paso del ensamblado y el resultado deberá estar entre
0 y 65535.
Esta expresión indica la cantidad de veces que debe repetirse el bloque.
IRP parámetro, <argumento [,argumento...]>
sentencias
ENDM
El parámetro se reemplaza por el primer argumento y se ensamblan las sentencias dentro del bloque.
Luego el parámetro se reemplaza por el segundo argumento y se ensamblan las sentencias y así
sucesivamente hasta agotar los argumentos.
IRPC parámetro, cadena
sentencias
ENDM
Es similar a IRP con la diferencia que el parámetro se reemplaza por cada carácter de la cadena. Si ésta
contiene comas, espacios u otros caracteres especiales deberá encerrarse con paréntesis angulares (<>).
Procesador: Indican el tipo de procesador y coprocesador en el que se va a ejecutar el programa. Los de
procesador son: .8086, .186, .286, .386, .486 y .586 para instrucciones en modo real, .286P, .386P, .
486P y .586P para instrucciones privilegiadas, .8087, .287 y .387 para coprocesadores. Deben ubicarse
al principio del código fuente. Habilitan las instrucciones correspondientes al procesador y coprocesador
indicado. Sin estas directivas, sólo se pueden ensamblar instrucciones del 8086 y 8087.
Referencias externas al módulo
Sirve para poder particionar un programa en varios archivos fuentes o módulos. Son imprescindibles si
se hace un programa en alto nivel con procedimientos en assembler. Hay tres: PUBLIC, EXTRN e
INCLUDE.
PUBLIC nombre[, nombre...]: Estos nombres simbólicos se escriben en el archivo objeto. Durante una
sesión con el linker, los símbolos en diferentes módulos pero con los mismos nombres tendrán la misma
dirección.
EXTRN nombre:tipo [,nombre:tipo...]: Define una variable externa con el nombre y tipo (NEAR, FAR,
BYTE, WORD, DWORD o ABS (número constante especificado con la directiva EQU o =))
especificado. El tipo debe ser el mismo que el del ítem indicado con la directiva PUBLIC en otro
módulo.
INCLUDE nombre_de_archivo: Ensambla las sentencias indicadas en dicho archivo.
Segmentos simplificados
Permite definir los segmentos sin necesidad de utilizar las directivas de segmentos que aparecen más
arriba.
.MODEL modelo: Debe estar ubicada antes de otra directiva de segmento. El modelo puede ser uno de
los siguientes:
1. TINY: Los datos y el código juntos ocupan menos de 64 KB por lo que entran en el mismo segmento.
Se utiliza para programas .COM. Algunos ensambladores no soportan este modelo.
2. SMALL: Los datos caben en un segmento de 64 KB y el código cabe en otro segmento de 64 KB. Por
lo tanto todo el código y los datos se pueden acceder como NEAR.
3. MEDIUM: Los datos entran en un sólo segmento de 64 KB, pero el código puede ser mayor de 64
KB. Por lo tanto, código es FAR, mientras que los datos se acceden como NEAR.
4. COMPACT: Todo el código entra en un segmento de 64 KB, pero los datos no (pero no pueden haber
matrices de más de 64 KB). Por lo tanto, código es NEAR, mientras que los datos se acceden como
FAR.
5. LARGE: Tanto el código como los datos pueden ocupar más de 64 KB (pero no pueden haber
matrices de más de 64 KB), por lo que ambos se acceden como FAR.
6. HUGE: Tanto el código como los datos pueden ocupar más de 64 KB (y las matrices también), por lo
que ambos se acceden como FAR y los punteros a los elementos de las matrices también son FAR.
Los siguientes símbolos están definidos cuando se usan las directivas anteriores:
@codesize: Vale 0 para los modelos SMALL y COMPACT (código NEAR), y vale 1 para los
modelos MEDIUM, LARGE y HUGE (código FAR).
@datasize: Vale 0 para los modelos SMALL y MEDIUM (datos NEAR), vale 1 para los modelos
COMPACT y LARGE (datos FAR) y vale 2 para el modelo HUGE (punteros a matrices FAR).
@data: Nombre del segmento definido con la directivas .DATA, .DATA?, .CONST y .STACK (los
cuatro están en el mismo segmento).
Un depurador también puede usarse para realizar ingeniería inversa o evitar protecciones de
copia. Mediante el uso del depurador se puede conocer el funcionamiento interno del
programa examinado, ayudando al proceso de ingeniería inversa o permitiendo desarrollar
técnicas para evadir las restricciones impuestas por el programa.
SoftICE
OllyDbg
Trw2000
Ida Pro
SIMULADOR :
12. BIBLIOGRAFÍA:
-
-
-
- http://vspm16.blogspot.com/2017/07/que-es-un-simulador-emulador-depurador.html
- http://arquitecturadelcomputadorsemestre6.blogspot.com/2014/10/lenguaje-maquina-y-
lenguaje-ensamblador.html
- http://ebadillo_computacion.tripod.com/ensamblador/8086_rep.pdf
- https://www.alpertron.com.ar/8088.HTM
-