Está en la página 1de 101

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Indice 1. Fundamentos 1.1. Introduccin. 1.1.1.Uso y aplicaciones del lenguaje ensamblador. 1.1.2.Escalabilidad de los microprocesadores. 1.1.3.Tipos de lenguajes ensambladores. 1.1.4.Clasificacin de Memorias. 1.1.5.Unidades de entrada / salida. 1.2. El microprocesador. 1.2.1.Buses. 1.2.2.Registros. 1.2.3.Modos de direccionamiento. 1.3. Interrupciones. 1.3.1.Hardware. 1.3.2.Software. 1.4. Estructura de un programa en ensamblador. 1.4.1.Data segment. 1.4.2.Snack segment. 1.4.3.Code segment. 1.4.4.Instrucciones del programa. 1.4.5.Directivas. 1.5. Procedimiento de ensamble, enlace y ejecucin. 1.6. Entorno de programacin. 2. Elementos del lenguaje 2.1. Instrucciones lineales. 2.1.1. Movimiento. 2.1.2. Pila. 2.1.3. Matemticos. 2.1.4. Ajustes. 2.1.5. Comparacin. 2.2. Saltos. 2.2.1. Incondicional. 2.2.2. Condicional. 2.3. Tipos de ciclos. 2.4. Operadores Lgicos. 2.5. Desplazamiento. 2.5.1. Lineal. 2.5.2.Circular. 2.6. Procesos de control 2.6.1.Banderas 2.6.2.Cadenas 2.6.3.Carga 3. Modularizacin 3.1. Macros 1

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

3.1.1.Internas 3.1.2.Externas 3.2. Procedimientos 3.2.1.Internas 3.2.2.Externas 4. Programacin hbrida 4.1. Directivas para compilacin hbrida 4.2. Funciones en ensamblador 4.3. Bloques en ensamblador 4.4. Operadores 4.5. Integrar mdulos de ensamblador en lenguajes de alto nivel

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

1. Fundamentos 1.1. Introduccin Para que una computadora pueda realizar una serie de instrucciones es necesario indicarselo mediante algn lenguaje de programacin; pudiera decirse que los lenguajes de programacin es algn idioma mediante el cual el programador puede comunicarse con la computadora. En ese orden de ideas, pudiera decirse que la computadora slo entiende un solo idioma, que es el ensamblador, el cul es un idioma que no se parece a la forma de hablar de las personas; afortunadamente, existen otros lenguajes de programacin (idiomas) de ms alto nivel que son ms fciles para los seres humanos (programadores), slo que estos necesitan de algn interprete que nos convierta lo que decimos en alto nivel al idioma que la computadora entiende que es el lenguaje de bajo nivel. La clasificacin de los lenguajes de programacin es la siguiente: Java Lenguajes de Alto nivel .Net PHP Lenguajes de Programacin etc

Lenguaje de Bajo nivel

Ensamblador

Los lenguajes de programacin de alto nivel necesitan de un interprete para que se traduzca el cdigo de alto nivel a bajo nivel; dicho interprete puede ser un compilador que su funcin es traducir el cdigo fuente a un cdigo ejecutable, pasando por una fase de correccin de errores lxicos, sintcticos y/o gramaticales y; por otro parte, puede ser un interprete que su funcin radica en leer el cdigo fuente, interpretarlo y ejecutarlo. Algunos ejemplos de lenguajes de programacin segn el interprete que tienen: .Net Compilador Java C++ Lenguajes de Alto nivel HTML Interprete PHP Javascript
3

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Administracin de la informacin Cuando un usuario escribe en el teclado; cada tecla que se oprime, ste enva el cdigo ASCII de la tecla oprimida al CPU; cada tecla que se encuentra en el teclado tiene un cdigo ASCII asociado, esta tabla ASCII consta de 256 caracteres como a continuacin se muestra:

De lo anterior, podemos deducir que el cdigo ascii ms pequeo que el teclado puede enviar al CPU es el cero y, el cdigo ascii ms grande que el teclado puede enviar al CPU es el 255; si

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

convertimos dichos cdigos ascii al sistemas nmerico binario (qu es el sistema numrico que utiliza la computadora) obtenemos que: 0d 255d = = 0b 11111111b

La computadora slo necesita 8 bits de informacin como mximo, para que el teclado pueda enviar el cdigo ascii correspondiente de la tecla oprimida. Por ejemplo, si un usuario escribe en el teclado hola los cdigos enviados por el teclado al CPU son los siguientes: Caracteres: Sistema decimal: Sistema binario: hola 104 111 108 97 1101000110111111011001100001

Podemos observar que en una secuencia de bits no podemos distinguir en que bit empieza un carcter y donde inicia el otro, por lo tanto, lo que se hace para aquellos caracteres que su cdigo ascii convertido a binario no alcanza los 8 bits se rellenan con cero a la izquierda, por lo tanto, quedara la secuencia de bits de la siguiente manera: Caracteres: Sistema decimal: Sistema binario: hola 104 111 108 97 01101000011011110110110001100001
h o l a

De lo anterior podemos deducir una tabla que nos servir para medir la capacidad de almacenamiento de diferentes dispositivos. Bit 1 Byte 1 Kilobyte (Kb) 1 Megabyte (Mb) 1 Gigabyte (Gb) = = = = = 01 8 bits (es decir, un carcter) 1024 bytes 1024 Kb 1024 Mb (1024 caracteres) (1,048,576 caracteres) (1,073,741,824 caracteres)

Podemos poner algunos ejemplos para medir la capacidad de almacenamiento que tienen algunos dispositivos: a) CD de 750 Mb b) DVD de 4.7 Gb c) RAM de 3 Gb = = =
5

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

En lenguaje ensamblador se incluyen otras medidas de almacenamiento como las siguientes: Palabra Palabra doble Palabra cudruple Prrafo = = = = 2 bytes (8 bits) 4 bytes (32 bits) 8 bytes (64 bits) 16 bytes (128 bits)

Como hemos observado, nosotros manejamos la informacin en el sistema decimal (normalmente), pero la computadora utiliza el sistema binario; por lo tanto ser necesario dominar las conversiones entre estos dos sistemas numricos. Conversin de decimal a binario La conversin de un nmero decimal a binario es dividindolo entre 2 sucesivamente hasta que ya no podamos seguir dividindolo ms, por ejemplo: Numero decimal: 65

32 2 65 1 Numero binario:

16 2 32 0 1000001

8 2 16 0

4 2 8 0

2 2 4 0

1 2 2 0

Resolver los siguientes ejercicios: a) 129 b) 246 c) 83 d) 17 Conversin de binario a decimal La conversin de un nmero binario a decimal es que cada bit del nmero binario se eleve en base 2 segn la posicin del bit, normalmente se construye una tabla como la siguiente para convertir el nmero: Numero binario: 1000001

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

27 0

26 1

25 0

24 0

23 22 21 20 0 0 4 0 0 2 0 1 1 1
X

128 64 32 16 8 0 64 0 0 0

0 + 64 + 0 + 0 + 0 + 0 + 0 + 1 = 65 Numero decimal: 65

Resolver los siguientes ejercicios: a) 1100100 b) 101101 c) 11001110 Arirtmtica binaria Suma binaria La computador realiza las operaciones aritmticas en binario, ya que es el sistema numrico que utiliza; por lo tanto, es necesario que el programador entienda las operaciones bsicas que realiza la computadora. Las sumas bsicas en binario son las siguientes: 0
+ +

0
+

1
+

1 1 10
+

1 1 1 11

0 0

1 1

0 1

Para poder sumar dos nmero en binario se tienen que ir sumando cada bit por separado derecha a izquierda; basndose en las operaciones de sumas bsicas vistas anteriormente, cuidando que los acarreos influyen en el bit de la izquierda. Por ejemplo: Decimal 65
+ +

Binario 01000001 00101010 01101011

42 107

Para poder verificar que el numero binario que se obtuvo es el correcto, podemos convertir el numero decimal a binario y tiene que coincidir.
7

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Resolver los siguientes ejercicios: a) 120 + 76 b) 204 + 26 c) 83 + 149 Numeros negativos Para obtener el nmero negativo en binario, se debe primero de convertir el numero decimal en absoluto a binario, despus invertir los bits del numero binario obtenido y por ltimo sumarle un 1. Por ejemplo: Numero decimal: Numero absoluto: Numero absoluto en binario: Invertir los bits: Sumar 1: Numero negativo en binario:
+

-65 65 01000001 10111110 1 10111111

Para comprobar que el nmero efectivamente es el numero negativo, podra sumar el numero positivo con el negativo y el resultado debera ser 0. Numero positivo decimal: Numero positivo en binario:
+

65 01000001 10111111 00000000

Numero negativo en binario: Resultado:

Existe un bit a la izquierda que sobra, es decir, el acarreo de la suma del bit 8; en realidad este bit se va al registro de banderas. Resolver los siguientes ejercicios: a) -93 b) -175 c) -228

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Resta binaria Para resolver una resta binaria se deber obtener el nmero negativo correspondiente a la operacin y posteriormente realizar la suma en binario. Por ejemplo: Operacin: Resultado en binario: Numero positivo decimal: Numero negativo decimal: Numero positivo en binario: Numero negativo en binario: Resultado en binario:
+

65 42 23 65 -42 01000001 11010110 00010111

Para comprobar que la operacin es correcta convierta el resultado obtenido en decimal a binario y debe de coincidir con el numero encontrado en binario. Resolver los siguientes ejercicios: a) 248 130 b) 184 84 c) 97 - 21 1.2. El Microprocesador El CPU de una computadora contiene un gabinete donde se encuentra la fuente de poder, que regula el voltaje que se necesita para los diferentes dispositivos que contiene la CPU, una tarjeta madre donde se encuentran las ranuras de expansin para otras tarjetas adicionales para el sistema, el microprocesador, la memoria de solo lectura (ROM), la memoria de acceso aleatorio (RAM) y algunas otras cosas. El microprocesador es el cerebro de la computadora, ya que se encarga de la ejecucin de las instrucciones en el sistema; estos dispositivos varan en velocidad y capacidad de memoria, registros y bus de datos. Un bus de datos es el encargado de transferir la informacin entre el microprocesador y la memoria RAM y/o dispositivos externos. A continuacin se menciona una breve clasificacin de estos microprocesadores de Intel. 8088. Estos microprocesdores tienen registros de 16 bits y un bus de datos de 8 bits. 8086. Estos microprocesadores son similares a los 8088 pero tiene un registro de 16 bits y un bus de datos de 16 bits.
9

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

80286. Estos microprocesadores tiene el mismo tamao del registro y el bus de datos que los microprocesadores 8086, la diferencia radicaba en la velocidad de ejecucin de instrucciones. 80386. Estos microprocesadores tienen registros de 32 bits y un bus de datos de 32 bits. 80486. Estos microprocesadores tienen el mismo tamao del registro y el bus de datos que los microprocesadores 80386, pero la diferencia radicaba en la velocidad de ejecucin de instrucciones e incorporaron el modo protegido para lograr la multitarea. Pentium. Estos microprocesadores tienen registros de 32 bits y bus de datos de 64 bits. Memoria interna La computadora contiene dos tipos de memoria interna: la memoria de solo lectura, conocida como ROM (Read Only Memory) y la memoria de acceso aleatoria conocida como RAM (Read Access Memory). Memoria ROM. La ROM es un chip especial de memoria que solo puede ser leida las instrucciones y datos que le fueron grabados al momento del ensamble de la computadora. Este chip especial contiene entre otras cosas los controladores bsicos de Entrada/Salida para manejar los dispositivos correspondientes; tambin, contiene el autocargador de disco, la autoprueba de encendido que se ejecuta cada vez que es encendida la computadora. Al finalizar de realizar sus operaciones, la ROM proceder a dar el control al sistema operativo que se encuentre instalado en el sistema. Memoria RAM La RAM es la hoja de trabajo de la computadora, cada programa que es ejecutado se carga una copia de l a la memoria RAM, incluyendo el mismo sistema operativo. Se dice que la memoria RAM es voltil, ya que solo guarda los datos almacenados en ella mientras que la computadora este encendida, en el momento que la computadora no recibe energa elctrica todos los datos de la memoria RAM se pierden. Cada localidad de memoria tiene el tamao de 1 byte, suficiente para almacenar un carcter de la tabla ASCII como anteriormente se explico. Las localidades estn numerados iniciando desde la localidad 0 hasta el tamao fsico de la memoria RAM que tenga la computadora. Para entender mejor el funcionamiento de la memoria RAM, se mostrar a continuacin una memoria RAM de 1 Mb.
0 1 2 3 4 5 6 7 8 9 1048574 1048575

Por cuestiones de organizacin una memoria RAM es organizada por bloques de 64Kb, cada bloque tiene el nombre de prrafos, de tal manera que una memoria RAM se pudiera visualizar de la siguiente manera:

10

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

MEMORIA RAM 1 Mb
983040 a 1048575 917504 a 983039 851968 a 917503 786432 a 851967 720896 a 786431 655360 a 720895 589824 a 655359 524288 a 589823 458752 a 524287 393216 a 458751 327680 a 393215 262144 a 327679 196608 a 262143 131072 a 196607 65536 a 131071 0 a 65535 0 1 2 3 4 5 6 7 8 9

Localidad de memoria

Prrafo 64K
65535

Direccionamiento de localidades de memoria Supongamos que tenemos guardado en un registro el valor 0401H, recordando que los registros tienen un tamao de 16 bits para el microprocesador 80286; el dato se guardara de la siguiente manera:
Byte de orden ms alto 04 01 Byte de orden ms bajo

Si quisiramos guardar la informacin que tiene el registro en la memoria RAM, se guardara el byte de orden ms bajo en la localidad ms baja y el bye de orden ms alto en la localidad mas alta.
0 1 5612 01 5613 04 1048574 1048575

11

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Segmentos y Direccionamiento Un segmento es un rea especial en un programa que inicia en un lmite de un prrafo; el tamao de un segmento generalmente es de 64Kb. Los programas en lenguaje ensamblador contienen el segmento de la pila, el segmento de datos y el segmento de cdigo. a) El segmento de cdigo (CS) contiene las instrucciones de mquina que son ejecutadas. Si su rea de cdigo requiere ms de 64K, su programa puede definir ms de un segmento de cdigo. b) El segmento de datos (DS) contiene datos, constantes y reas de trabajo definidas por el programa. c) El segmento de la pila (SS) contiene los datos y direcciones que usted necesita guardar temporalmente o para uso de sus llamadas subrutinas. Al ejecutar un programa el sistema operativo, necesita almacenar cada uno de los segmentos del programa en un prrafo disponible de la memoria RAM. Al ubicarlos, el sistema operativo necesita guardar la direccin de memoria de inicio de cada segmento en unos registros que se llaman Registros de Segmentos, los cuales son: a) El registro del segmento de cdigo (Registro CS), que guarda la direccin de memoria de inicio del segmento de cdigo. b) El registro del segmento de datos (Registro DS), que guarda la direccin de memoria de inicio del segmento de datos. c) El registro del segmento de la pila (Registro SS), que guarda la direccin de memoria de inicio del segmento de la pila. Supongamos que se ejecuta un programa en lenguaje ensamblador, el sistema operativo ubicar cada segmento en prrafos en la memoria RAM (recordar, que para la ubicacin de los segmentos en la memoria RAM existen algoritmos para la administracin de la memoria, que estn fuera del alcance de dicha antologa) como se muestra a continuacin.

12

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

MEMORIA RAM
983040 a 1048575 917504 a 983039 851968 a 917503 786432 a 851967 720896 a 786431 655360 a 720895 589824 a 655359 524288 a 589823 458752 a 524287 393216 a 458751 327680 a 393215 262144 a 327679 196608 a 262143 131072 a 196607 65536 a 131071 0 a 65535 0 1 2 3 4 5 6 7 8 9 65535

S E G M E N T O

D E

D A T O S

S E G M E N T O

D E

P I L A

S E G M E N T O

D E

C O D I G O

Prrafo 64K

Registro SS 524288 Registro DS 851968 Registro CS 262144

Desplazamiento de segmentos Para encontrar la direccin de memoria de una localidad especfica, se debe de conocer el desplazamiento que existe desde el inicio del segmento hasta la localidad que deseamos utilizar. Pongamos un ejemplo, si en un programa se encuentra declarada en el segmento de datos una variable de tamao de un byte, la frmula a utilizar para calcular la direccin de memoria de la localidad donde se encuentra dicha variable es:
13

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

direccin de inicio del segmento


+

desplazamiento direccin de memoria de la localidad Tomando como ejemplo, la colocacin del segmento de datos en el esquema anterior, calcularemos la direccin de memoria de la siguiente variable:
851968 a 917503 35

Registro DS: Desplazamiento: Direccion de memoria de la localidad donde se encuentra almacenado el 35: Registros
+

851968 6 851974

Los registros del procesador se emplean para controlar instrucciones en ejecucin, manejar direccionamiento de memoria y proporcionar capacidad aritmtica. Los tipos de registros son los siguientes: a) Registros de segmentos. Sirven para guardar la direccin del registro del segmento, tiene 16 bits de longitud y facilita una rea de memoria para direccionamiento conocida como el segmento actual. Registro CS. El DOS almacena la direccin inicial del segmento de cdigo de un programa en el registro CS, esta direccin de segmento, ms un valor de desplazamiento en el registro de un apuntador de instruccin (IP) indica la direccin de una instruccin que es buscada para su ejecucin. Registro DS. La direccin inicial de un segmento de datos de programa es almacenada en el registro DS. Registro SS. Permite la colocacin en memoria de una pila, para almacenamiento temporal de direcciones y datos. El DOS almacena la direccin de inicio del segmento de pila de un programa, en el registro SS. Esta direccin de segmento, ms un valor de desplazamiento en el registro del apuntador de la pila (SP), indica la palabra actual que est siendo direccionada. Registros ES: Algunas operaciones con cadenas de caracteres , utilizan el registro extra de segmento para manejar el direccionamiento de memoria. En este contexto, el registro ES esta asociado, con el registro DI (ndice).
14

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

b) Registro de apuntador de instrucciones. El registro de apuntador de instrucciones de 16 bits contiene el desplazamiento de direccin de la siguiente instruccin que se ejecuta. El IP esta asociado con el registro CS en el sentido de que el IP indica la instruccin actual dentro del segmento de cdigo que se esta ejecutando actualmente. Supongamos que el registro CS contiene la direccin de memoria 25A40H y el desplazamiento de la instruccin que se ejecutar es de 412H almacenado en el registro IP. Registro CS:
+

25A40H 412H 25E52H

Desplazamiento (IP): Direccin de memoria de la siguiente instruccin a ejecutar

c) Registros apuntadores. Los registros SP (apuntador de pila) y BP (apuntador base) estn asociadas con el registro SS y permiten al sistema accesar datos en el segmento de la pila. Registro SP. El apuntador de la pila de 16 bits esta asociada con el registro SS y proporciona un valor de desplazamiento que se refiere a la palabra actual que esta siendo procesada en la pila. Registro SS:
+

27B30H 312H 27E42H

Desplazamiento (SP): Direccin de memoria del Ultimo dato almacenado en la pila Ejemplo:

Direccin de memoria: 27E42H

15 30 30 34 64 15 9

42

78

SS: 27B30H

Desplazamiento (SP): 312H

Registro BP. El BP de 16 bits, facilita la referencia de parmetros, los cuales son los datos y direcciones transmitidos va pila.

15

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

d) Registros de propsito general. Los registros de propsito general AX, BX, CX y DX son los caballos de batalla del sistema. Sn nicos porque pueden utilizarse como una palabra (2 bytes) como un byte. El byte de la izquierda es la parte alta y el byte de la derecha es la parte baja. Por ejemplo: El registro CX consta de dos partes CH (parte alta) y CL (parte baja), y se puede hacer referencia a cualquier parte por su nombre.
CX CH CL

Registro AX. El registro AX, el acumulador principal, es utilizado para operaciones que implican entrada/salida y la mayor parte de la aritmtica.
AX AH AL

Registro BX. El BX es conocido como el registro base ya que es el nico registro de propsito general que puede ser un ndice para direccionamiento indexado.
BX BH BL

Registro CX. El CX es conocido como el registro contador. Puede contener un valor para controlar el numero de veces que un ciclo se repite o un valor para corrimiento de bits, hacia la derecha o hacia la izquierda.
CX CH CL

Registro DX. El DX es conocido como el registro de datos. Algunas operaciones de entrada/salida requieren su uso.
DX DH DL

16

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

e) Registros ndice. Los registros SI y DI estn disponibles para direccionamiento indexado y para sumas y restas. Registro SI. El registro ndice fuente de 16 bits es requerido por algunas operaciones con cadenas. En este contexto, el SI esta asociado con el registro DS. Registro DI. El registro ndice destino tambin es requerido para algunas operaciones con cadenas de caracteres. En este contexto el DI esta asociado con el registro ES. f) Registro de banderas. De los 16 bits del registro de banderas , 9 son comunes o toda la familia de procesadores 8086, y sirven para indicar el estado actual de la maquina y el resultado del procesamiento. En resumen los bits de las banderas comunes son como siguen: OF (OVERFLOW, desbordamiento). Indica desbordamiento de un bit de orden alto (ms a la izquierda) despus de una operacin aritmtica. DF (Direccin). Designa la direccin hacia la izquierda o hacia la derecha para mover o comparar cadenas de caracteres. IF (Interrupcin). Indica que una interrupcin externa, como la entrada desde el teclado sea procesada o ignorada. TF (Trampa). Permite la operacin del procesador en modo de un paso. SF (Signo). Contiene el signo resultante de una operacin aritmtica (0=positivo y 1=negativo). ZF (Cero). Indica el resultado de una operacin aritmtica de operacin (0=resultado diferente de cero y 1=resultado igual a cero). AF (Acarreo auxiliar). Contiene un acarrreo externo del bit 3 en un dato de 8 bits , para aritmtica especializada. PF (Paridad). Indica paridad par o impar de una operacin en datos de 8 bits de bajo orden (ms a la derecha). CF (Acarreo). Contiene el acarreo de orden ms alto (ms a la izquierda) despus de una operacin aritmtica; tambin lleva el contenido del ltimo bit en una operacin de corrimiento o de rotacin.

15

14

13

12

11

10

OF

DF

IF

TF

SF

ZF

AF

PF

CF

17

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

1.4. Estructura de un programa en Ensamblador Un programa de lenguaje ensamblador consiste en un conjunto de enunciados. Los dos tipos de enunciados son: a) Instrucciones, tal como MOV Y ADD que el ensamblador traduce a cdigo objeto. b) Directivas, que indican al ensamblador que realice una accin especifica, como definir un elemento de dato. El formato general del enunciado es: [identificador] Ejemplos Directiva: Instruccin: contador db mov 1 ax,0 ;Declaracin de variable. ;Operacin, 2 operandos operacin [operandos(s)] [;comentarios]

Identificador. El termino nombre se aplica al nombre de un elemento o directiva definida, mientras que el termino de etiqueta se aplica al nombre de una X. Operacin. La operacin, debe ser codificada, es con mayor frecuencia usada para la definicin de reas de datos, una operacin tal como db o dw define un campo, rea de trabajo o constante. Para una instruccin como mov o add indica una accin a realizar. Operando. El operando proporciona informacin para la operacin que acta sobre sobre l, para un elemento de dato, el operando identifica su valor inicial, para una instruccin, un operando indica en donde realizara la accin. Un operando de una instruccin puede tener una, 2 tal vez ninguna entrada. Directivas en un programa a) Directiva PAGE. Designa el numero mximo de lneas para listar en una pgina y el nmero mximo de caracteres en una lnea. Su formato general es: PAGE [longitud] Ejemplo: PAGE 60,132 b) Directiva TITLE. Se puede emplear la directiva title para hacer que un titulo para un programa se imprima en la lnea 2 de cada pagina, en el listado del programa. Ejemplo:
18

[,ancho]

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

TITLE prog 01 mi primer programa c) Directiva SEGMENT. Un programa ensamblado consiste, en uno o ms segmentos. Un segmento de pila define el almacn de la pila, un segmento de datos define los elementos de datos y un segmento de cdigo proporciona un cdigo ejecutable. Las directivas para definir un segmento tienene el siguiente formato: [identificador] Nombre operacin SEGMENT Nombre ENDS ;fin del segmento [operandos(s)] [opciones] [;comentarios] ;inicio del segmento

El enunciado SEGMENT define el inicio de un segmento. El nombre del segmento debe estar presente, ser nico y cumplir las convenciones para nombres de lenguajes. El enunciado ENDS indica el final del segmento y contiene el mismo nombre del enunciado SEGMENT. El operando de un enunciado SEGMENT puede tener 3 tipos de opciones: Alineacin, combinar y clases, codificadas en el siguiente formato: [identificador] Nombre operacin SEGMENT Nombre ENDS ;fin del segmento [operandos(s)] alineacin combinar clase [;comentarios] ;inicio del segmento

Tipo alineacin. La entrada alineacin indica el limite en que inicia el segmento para el requerimiento tpico PARA, alinea el segmento con el limite de un prrafo, de manera que la direccin inicial es divisible entre 16 o 10H en ausencia de un operando hace que el ensamblador por omisin tome PARA. Tipo combinar. La entrada combinar indica si se combina el segmento con otro segmentos cuando son enlazados despus de ensamblar, los tipos combinar son STACK, COMMON, PUBLIC y la expresin AT. Por ejemplo, el segmento de la pila por lo comn es definido como: nombre segment para stack Tipo clase. La entrada a clase, encerrada entre apostrofo, es utilizada para agrupar segmentos cuando se enlazan. Se utiliza la clase entre apstrofos code para el segmento de cdigo, data para el segmentos de datos y stack para el segmento de la pila. Ejemplo:

19

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Pila segment para stack stack Pila ends d) Directiva PROC. El segmento de cdigo contiene el cdigo ejecutable de un programa. Tambin tiene uno ms procedimientos, definidos con la directiva PROC. Un segmento que tiene solo un procedimiento puede aparecer como sigue: [identificador] Nombre Nombre_proc operacin SEGMENT PROC Nombre_proc Nombre ENDP ENDS ;fin del segmento [operandos(s)] alineacin combinar clase FAR [;comentarios] ;inicio del segmento

El nombre del procedimiento debe de estar presente, ser nico y seguir las reglas para la formacin de nombres de lenguaje. El operando FAR en este caso esta relacionado con la ejecucin del programa. La directiva ENDP indica el final de un procedimiento y contiene el mismo nombre que el enunciado PROC para permitir que el ensamblador relacione a los dos. e) Directiva ASSUME. Un programa utiliza al registro SS para direccionar la pila, al registro DS para direccionar el segmento de datos y al registro CS para direccionar el segmento de cdigo. Para este punto, usted tiene que indicar al ensamblador el propsito de cada segmento en el programa. La directiva para este propsito es ASSUME codificada en el segmento de cdigo como sigue: ASSUME SS:nomsegpila, DS:nombsegdatos, CS:nombsegcodigo f) Directiva END. La directiva ENDS, finaliza un segmento y la directiva ENDP finaliza un procedimiento. Una directiva end finaliza todo el programa. Su formato general es: END nomproc g) Int 21H. Es una operacin de interrupcin comn del DOS que utiliza un cdigo de funcin en el registro AH para especificar una accin que ser realizada. Las diferentes funciones de INT 21H incluye entrada desde el teclado manejo de la pantalla, E/S de disco y salida a impresora la funcin que nos interesa aqu es la 4CH que INT 21H reconoce como una peticin para la terminacin de la ejecucin de un programa.
20

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Su formato general es: MOV AH,4CH MOV AL,00H INT 21H MOV AX, 4C00H INT 21H Estructura de un programa en lenguaje ensamblador PAGE 60,132 TITLE pro01 estructura de un programa Pilaseg SEGMENT PARA STACK `Stack` Pilaseg ENDS Datosseg SEGMENT PARA `data` .. Datosseg ENDS Codigoseg SEGMENT PARA `code` Inicio PROC FAR ASUME SS:Pilaseg, DS:Datosseg, CS:Codigoseg MOV AX,datosseg MOV DS, AX MOV AX, 4C00H INT 21H Inicio ENDP Cdigoseg ENDS END Inicio 1.5. Procedimiento de ensamble, enlace y ejecucin. El lenguaje ensamblador es un lenguaje de programacin compilado, es decir, que es necesario tener los programas con los que se compilar el archivo fuente y el programa que linkeara el archivo objeto. El archivo fuente de ensamblador debe de tener la extensin .ASM. Los nombre de los programas para compilar es TASM.EXE y para linkear es TLINK.EXE.

21

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

El procedimiento para ensamble, enlace y ejecucin de un programa en ensamblador es el siguiente: 1. Capturar el programa fuente en cualquier editor de texto, deber guardarse con la extensin .ASM 2. Desde el smbolo del sistema se compila el programa de la siguiente manera:

3. Una vez que compilemos el archivo fuente y no muestre ningn error, se crearn los siguientes archivos.

4. Teniendo el archivo .OBJ ya se puede realizar el proceso del linkeado de la siguiente manera:

22

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

5. El proceso de linkeado obtenemos los siguientes archivos:

6. Para ejecutar el programa, basta con poner el nombre del archivo y se visualizarn los resultados.

1.6. Entorno de programacin. El entorno de programacin que se utilizar se llama ASMEDIT, el cul es un IDE que para instalarlo basta con copiar la carpeta ASMEDIT en la unidad C; tambin es necesario copiar una carpeta llamada Tools que contiene los programas de TASM y TLINK en la unidad C. Para ejecutar el programa de doble clic sobre el archivo ASMSHELL que se encuentra en la carpeta ASMEDIT para visualizar el entorno de programacin.

23

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Archivo nuevo 1. Dar clic sobre la opcin File 2. Dar clic sobre la opcin New 3. Se visualizar una ventana nueva para escribir el cdigo del programa

4. Oprimir la tecla F2 para guardar el archivo

24

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

5. Escribir el nombre del programa junto con la extensin ASM 6. Oprimir la tecla Enter Compilar el programa fuente 1. Dar clic sobre la opcin Assemble 2. Dar clic sobre la opcin

3. Se visualizar la siguiente ventana:

4. Dar clic sobre la opcin .EXE program 5. Dar clic sobre el botn OK 6. Oprimir la tecla F9 para compilar y linkear el archivo fuente 7. Si el programa no tiene errores, se visualizar la siguiente ventana:

8. Dar clic sobre el botn OK 9. Se visualizar la siguiente ventana:

25

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

10. Dar clic sobre el botn OK Ejecutar el programa 1. Dar clic sobre la opcin File 2. Dar clic sobre la opcin Dos Shell 3. Se observar que se sale del editor y regresa al smbolo del sistema 4. Escribir el nombre del programa para ejecutar el programa y ver los resultados 5. Cuando desee regresar al editor, escribir la palabra EXIT y oprimir la tecla Enter 6. Se visualizar de nuevo el editor de ASMEDIT

26

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Unidad 2. Definicin de Datos El ensamblador permite la definicin de elementos de varias longitudes de acuerdo con el conjunto de directivas que defina datos. Por ejemplo, DB define 1 byte y DW define una palabra. Un elemento de dato puede contener un valor indefinido o una constante, definida como una cadena de caracteres o como un valor numrico. El formato general es : [identificador] Nombre Ejemplo: contador db 1 ;Declaracin de variable. operacin Dn [operandos(s)] expresin [;comentarios]

Nombre. Un programa que hace referencia a un elemento de dato lo hace por medio de un nombre. Directivas. Las directivas que definen elementos de datos son DB(byte), DW(palabra), DD(Palabra doble), DF(palabra larga), DQ(palabra cudruple) y DT(10 bytes), cada una indica de manera explicita la longitud del elemento definido. Expresin. La expresin es un operando que puede contener un signo de interrogacin para indicar un elemento no utilizado, por ejemplo: [identificador] Edad operacin db [operandos(s)] ? [;comentarios]

Tambin puede utilizar el operando para definir una constante , como: [identificador] Num1 operacin db [operandos(s)] 25 [;comentarios]

Una expresin puede contener varios valores constantes separados por comas y limitados solo por la longitud de la lnea, como sigue: [identificador] Num2 operacin db [operandos(s)] [;comentarios]

11 ,12, 13, 14 ,15 ,16 ,17

27

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

El ensamblador define esas constantes en bytes continuos. Una referencia a num2 es a la primera constante de 1 byte, el 11 (puede pensar en el primer byte como num2+0), y una referencia a num2+1 es a la segunda constante el 12. Por ejemplo, la instruccin: mov al, num2 + 3

Carga el valor 14 en el registro AL. Tambin la expresin permite duplicacin de constantes en un enunciado. Su formato general es: [identificador] [nombre] Ejemplo: Num3 Num4 Cadena de caracteres Son usadas para datos descriptivos como nombre de personas y titulos de paginas. La cadena esta definida dentro de apstrofos, como PC o dentro de comillas, como PC. DB es el nico formato que define una cadena de caracteres que excede a 2 caracteres y los almacena en la secuencia normal de izquierda a derecha. Por ejemplo: [identificador] cad1 cad2 cad3 operacin db db db [operandos(s)] ITSLV ITSLV Mis PCS son Intel [;comentarios] dw db 10 DUP(?) 5 DUP(4) operacin Dn [operandos(s)] [;comentarios]

contador repeticiones DUP (Expresion)

El conjunto de instrucciones del procesador La siguiente es una lista de las instrucciones para la familia de procesadores 8086, clasificados por categoras. Aunque la lista parece enorme, muchas de las instrucciones rara vez se necesitan. Aritmeticas ADC ADD DEC DIV Suma con acarreos. Suma nmeros binarios. Decrementa en 1. Division sin signo

28

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

IDIV

Divide con signo (enteros)

IMUL Multiplica con signo (enteros) INC MUL NEG SBB SUB Incrementa en 1. Multiplica sin signo. Negacin. Resta con el bit prestado. Resta valores binarios. Conversion ASCII-BCD AAA AAD Ajuste ASCII despus de sumar. Ajuste ASCII antes de dividir.

AAM Ajuste ASCII despus de multiplicacin. AAS DAA DAS Ajuste ASCII despus de restar. Ajuste decimal despus de sumar. Ajuste decimal despus de restar Corrimiento de bits RCL RCR ROL ROR SAL SAR SHL SHR Rota a la izquierda a travs del acarreo. Rota a la derecha a travs del acarreo. Rota a la izquierda. Rota a la derecha. Corrimiento algebraico a la izquierda. Corrimiento algebraico a la derecha. Corrimiento algebraico a la izquierda. Corrimiento lgico a la derecha. Corrimiento en doble precisin (80386 y posteriores)

SHLD/SHRD

29

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Comparacin BSF/BSR BT/BTC/BTR/BTS CMP CMPS TEST Exploracin de bit (80386 y posteriores) Prueba bit (80386 y posteriores) Compara cadenas de caracteres. Compara cadenas de caracteres Prueba bits. Transferencia de datos LDS LEA LES LODS LSS MOV MOVS MOVSX MOVZX STOS XCHG XLAT Carga el registro del segmento de datos. Carga una direccin efectiva. Carga el registro de segmento extra. Carga una cadena. Carga el registro del segmento de la pila. Mueve datos. Mueve cadenas. Mueve con signo-extendido. Mueve con cero-extendido. Almacena una cadena. Intercambia. Traduce. Operaciones con banderas CLC CLD CLI CMC LAHF POPF Limpia la bandera de acarreo. Limpia la bandera de direccin. Limpia la bandera de interrupcin. Complementa la bandera de acarreo. Carga AH de las bandera. Remueve bandera de la pila.
30

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

PUSHF SAHF STC STD STI

Agrega banderas a la pila. Almacena el contenido de AH en las banderas. Establece la bandera de acarreo. Establece la bandera de direccin. Establece la bandera de interrupcin. Entrada/Salida

IN OUT

Introduce un byte o una palabra. Saca un byte o una palabra. Operacin lgica

AND NOT OR XOR

Conjuncin lgica (y) Negacion lgica (no) Disyuncin lgica (o) Disyuncin exclusiva Ciclos

LOOP LOOPE/LOOPZ LOOPNE/LOOPNZ

Repetir el ciclo hasta que se complete. Repetir el ciclo mientras sea igual/mientras sea cero. Repetir el ciclo mientras no sea igual/mientras no sea cero Control del procesador

ESC HLT LOCK NOP WAIT

Escape Introduce un estado de detencin Bloquea el bus No operar Pone al procesador es estado de espera Operaciones con la pila

POP POPA

Remueve una palabra de la pila. Remueve todos los registros generales (80286 y posteriores)
31

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

PUSH PUSHA

Agrega a la pila. Agrega todos los registros generales (80286 y posteriores) Operaciones con cadena

CMPS LODS MOVS REP REPE/REPZ REPNE/REPNZ SCAS STOS

Compara cadenas. Carga cadena. Mueve cadena. Repite cadena. Repite mientras sea igual/mientras sea cero. Repite mientras no sea igual/mientras no sea cero Explora una cadena Almacena una cadena. Transferencia (condicional)

INTO JA/JNBE JAE/JNB JB/JNAE JBE/JNA JC/JNC JCXZ JE/JZ JG/JNLE JGE/JNL JL/JNGE JLE/JNG JNE/JNZ JNP/JPO

Interrumpe si hay desbordamiento. Bifurca (salta) si es mayor o igual) o salta si no es menor. Salta si es mayor o igual o salta si no es menor Salta si es menor o salta si no es mayor o igual Salta si es menor o igual o salta si no es mayor. Salta si no hay acarreo o salta si hay acarreo. Salta si CX es cero. Salta si es igual o salta si es cero. Salta si es mayor o salta si no es menor o igual. Salta si es mayor o igual o salta si no es menor. Salta si es menor o salta si no es mayor o igual. Salta si es menor o igual o salta si no es mayor. Salta si no es igual o salta si no es cero. Salta si no hay paridad o salta si la paridad es impar.
32

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

JO/JNO JP/JPE JS/JNS

Salta si hay desbordamiento o salta si no hay desbordamiento. Salta si hay paridad o salta si la paridad es par. Salta si el signo es negativo o salta si el signo es positivo. Transferencia (incondicional)

CALL INT IRET JMP RET RETN/RETF

Llama a un procedimiento. Interrupcion. Interrupcion de regreso. Salto incondicional. Regreso. Regreso cercano o regreso lejano. Conversin De Tipo

CBW CDQ CWD CWDE Operandos

Convierte byte o palabra. Convierte palabra doble a palabra cudruple (80386 y posteriores) Convierte una palabra a una palabra doble extendida. Convierte una palabra a una palabra doble extendida

Un operando es una fuente de datos para una instruccin. Algunas instrucciones como CLC Y RET, no necesitan un operando mientras que otras pueden tener 1 o 2 operandos. Donde existan 2 operandos, el segundo es el fuente, que contienen ya sea datos que sern entregados (inmediatos) o bien la direccin de los datos. El dato fuente no es cambiado por la operacin. El primer operando es el destino, que contiene datos en un registro o en memoria y que ser procesado. Por ejemplo: [identificador] operacin Operacin Ejemplo: RET INC MOV CX AX, MUN1 [operandos(s)] [;comentarios]

operando1, operando2

33

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

a) Operando registro. El registro proporciona el nombre de alguno de los registros de 8, 16 32 bits. Dependiendo de la instruccin, el registro puede condificarse en el primer o segundo operando, o en ambos. Por ejemplo: [identificador] Num1 operacin db mov mov mov cx, num1 num1, bx cl, ah [operandos(s)] 350 [;comentarios]

b) Operandos inmediatos. El segundo operando contiene un valor constante o una expresin constante. El campo destino en el primer operando define la longitud de los datos, y puede ser un registro o una localidad de memoria. Por ejemplo: [identificador] edad operacin db . mov add edad, 25 cx, 12 [operandos(s)] 20 [;comentarios]

c) Operando de memoria directa. En este formato, uno de los operandos hace referencia a una localidad de memoria y el otro a un registro. Note que no existen instrucciones que permite que ambos operandos sean direcciones de memoria. Para el direccionamiento de datos en memoria, el registro DS es el registro por omisin. Por ejemplo: [identificador] num1 num2 operacin db db . mov mov ax, num1 num2, cl [operandos(s)] 0 0 [;comentarios]

A continuacin, un elemento de dato acta como una direccin de desplazamiento en un operando de instruccin.
34

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

[identificador] Tabla

operacin db mov mov

[operandos(s)] 25 DUP(?)

[;comentarios]

cl, Tabla[4] al, Tabla + 4

d) Operando de memoria indirecta. El direccionamiento indirecto, es una tcnica sofisticada que hace uso de las capacidades de la computadora para el direccionamiento del segmento: desplazamiento. Los registros utilizados para este propsito son BX, DI, SI, y BP, codificados con corchetes como un operador de ndice. BX, DI y SI estn asociados con el registro DS, como DS:BX, DS:DI y DS:SI, para procesamiento de datos en el segmento de datos. El BP esta asociado con el registro SS, como SS:BP, para el manejo de datos en la pila. Cuando el primer operando contiene una direccin indirecta, el segundo se refiere a un registro o a un valor inmediato; cuando el segundo operando contiene una direccin indirecta , el primero se refiere a un registro. Por ejemplo: [identificador] Num1 operacin db . Mov Mov BX, OFFSET num1 [BX], 25 [operandos(s)] ? [;comentarios]

La instruccin OFFSET obtiene el desplazamiento a la variable num1 y se almacena en el registro bx, en la siguiente instruccin observamos al registro bx encerrado en corchetes, esto significa que se realizara una operacin de registro de segmento + el desplazamiento para obtener la direccin de memoria real de una localidad, que en este caso es, el de la variable num1; por lo tanto se desea guardar el valor inmediato 25 en la direccin de memoria a la que apunta bx. e) Desplazamiento de direccin. Este mtodo utiliza un desplazamiento de direccin para un operando. El cdigo siguiente mueve el contenido de CL a tablax (una tabla de 25 bytes); exactamente en donde tablax esta determinada por el contenido de DI cuando el programa est en ejecucin.

35

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

[identificador] Tablax

operacin db .. Mov

[operandos(s)] 25 Dup(?)

[;comentarios]

tablax[DI], CL

Instruccin MOV La instruccin mov transfiere (esto es, copia) los datos referenciados por la direccin del segundo operando a la direccin del primer operando. El campo que se enva permanece sin cambios. Los operandos que hacen referencia a memoria o registros deben coincidir en tamao. El formato general es : [etiqueta] Ejemplo: [identificador] Num1 Num2 operacin db dw .. Mov Mov Mov Mov Mov Mov Instrucciones para mover y llenar Una limitacin de la instruccin mov es que el destino debe ser de la misma longitud que el fuente tal como un byte a byte y una palabra a una palabra. Las instrucciones movsx y movzx facilita la transferencia de datos de un byte o palabra fuente a una palabra o palabra doble de destino. El formato general es: [etiqueta] movsx/movzx {registro/memoria} , {registro/memoria/inmediato} AX, 25 Num1, 25 AX, CX Num1, bh [SI], al bh, Num1 [operandos(s)] ? ? [;comentarios] mov {registro/memoria} {,registro/memoria/inmediato}

36

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Por ejemplo: Movsx Movzx 1111 1111 1011 0000 0000 0000 1011 0000

MOVSX (para uso con valores aritmticos con signo) mueve un byte o palabra a una palabra o palabra doble de destino y llena con el bit de signo (el ultimo bit a la izquierda del origen), los bits de ms a la izquierda de destino. MOVZX, para uso con valores numricos sin signo, mueve un byte o palabra a una palabra o palabra doble de destino y llena con bits cero los bits de ms a la izquierda del destino. Por ejemplo Instruccin MOVSX MOVZX Instruccion XCHG La instruccin XCHG realiza otro tipo de transferencia de datos, pero en lugar de copiar los datos de una localidad a otra, XCHG intercambia los datos. El formato general es: [Etiqueta] Ejemplos: [identificador] var1 operacin dw xchg xchg Instruccin LEA Es til para inicializar un registro con una direccin de desplazamiento. El formato general es: [etiqueta] LEA {memoria} al, ah ax, var1 [operandos(s)] ? [;comentarios] xchg {registro/memoria} , {registro/memoria} Origen 1011 0000 1011 0000 Destino 1111 1111 1011 0000 0000 0000 1011 0000

Un uso comn de LEA es para inicializar un desplazamiento en el registro BX, BI o SI para indexar una direccin de memoria.

37

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Ejemplo: [identificador] nombre caract operacin db db lea mov Instruccin INC Y DEC INC y DEC son instrucciones adecuadas para aumentar y disminuir en uno los contenidos de registros y localidades de memoria. El formato general es: [etiqueta] INC/DEC {registro/memoria} operacin Inc Dec [operandos(s)] ax contador [;comentarios] bx, nombre caract, [bx] [operandos(s)] LA VENTA ? [;comentarios]

[identificador]

38

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Programa ejemplo de los tipos de operandos e instrucciones


page 60,132 title primer programa en ensamblador .model small .stack 64 .data n1 dw 250 n2 dw 125 n3 dw 0 tablax db 25 dup(?) n4 db 10 .code begin proc far mov ax,@data mov ds,ax ;OPERANDOS ;Operandos de tipo registro mov cx,n1 ;registro en el primer operando mov n2,cx ;registro en el segundo operando mov ax,cx ;registro en ambos operandos ;Operandos inmediatos add cx,12 ;el operando inmediato en el segundo operando ;Operandos de memoria directa mov cx,n1 ;memoria directa en el segundo operando mov bx,ds:[38b0h] ;Mueve una palabra desde el desplazamiento 38b0h a bx mov al,tablax[4] ;Operandos de memoria indirecta mov bx, offset tablax ;se carga el desplazamiento de la variable mov [bx],0 ;se mueve una constante a la posicion calculada ;INSTRUCCION MOV .. Los operandos deben ser del mismo tamano ;Mueve datos inmediatos mov ax,25 ;Mueve registros mov ax,bx ;Mueve memoria directa mov ax,n1 ;Mueve registros de segmento mov ax,ds ;INSTRUCCIONES PARA MOVER Y LLENAR ;MOVSX 1111 1111 1011 0000 ;MOVZX 0000 0000 1011 0000 movsx ax,n4 ;OPERANDOS INMEDIATOS mov ax,0123h mov ax,291 mov ax,100100011B ;INSTRUCCION XCHG .. Intercambio de datos xchg al,ah

39

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

;INSTRUCCION LEA .. Calcula el desplazamiento de una variable lea bx,tablax mov [bx],50 ;INSTRUCCION DE INC Y DEC .. Incrementa y decrementa en uno el contenido inc cx dec cx mov ax,4c00h int 21h begin endp end begin

Ejercicio 1. Desarrolle un programa en ensamblador que pase el contenido de una variable a otra.
page 60,132 title prog02 Operaciones de movimiento pilasg segment para stack 'stack' dw 32 dup(0) pilasg ends datossg segment para 'data' cad1 db 'itslv' cad2 db 5 dup(?) datossg ends codigosg segment para 'code' inicio proc far assume ss:pilasg,ds:datossg,cs:codigosg mov ax,datossg mov ds,ax lea lea mov mov inc inc mov mov inc inc mov mov inc inc mov mov inc inc mov mov inc inc bx,cad1 di,cad2 al,[bx] [di],al ;mover la letra i bx di al,[bx] [di],al ;mover la letra t bx di al,[bx] [di],al ;mover la letra s bx di al,[bx] [di],al ;mover la letra l bx di al,[bx] [di],al ;mover la letra v bx di

40

Lenguaje Ensamblador mov ax,4c00h int 21h inicio endp codigosg ends end inicio

Ing. Faustino Vzquez Camporro

Ejercicio 2. Desarrolle un programa en ensamblador que tenga una variable para guardar el nombre de una persona, otra variable para guardar los apellidos de la persona y una ultima variable donde guardaremos todo el nombre completo. El programa deber pasar el contenido de la variable que tiene el nombre a la variable donde se guardara el nombre completo y posteriormente pasar el contenido de la variable que tiene los apellidos a la misma variable donde se tendr el nombre completo.
title page 60,132 p03asm (EXE) Operaciones de movimiento extendidos .model small .stack 64 .data db 'FAUSTINO','$' db 'VAZQUEZ','$' db 'ABCDEFGHIJKLMNO','$' .code proc far mov ax,@data mov ds,ax mov es,ax mov lea lea b20: mov mov inc inc dec jnz mov lea b21: mov mov inc inc dec jnz mov lea int al,[si] [di],al si di cx b21 ah,09h dx,nomcom 21h ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos al,[si] [di],al si di cx b20 cx,07 si,ape cx,08 si,nom di,nomcom

nom ape nomcom begin

begin

mov ax,4c00h int 21h endp end begin

41

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Logica y control de programas Los programas que hemos examindado han sido ejecutados en forma lineal, esto es, con una instruccin secuencialmente a continuacion una de otra. Sin embargo, rara vez un problema programable es tan sencillo. La mayoria de los programas constan de varios ciclos, en los que una serie de pasos se repiten hasta alcanzar un requisito especfico y varias pruebas para determinar que accin se realiza de entre varias posibles. Requisitos como stos implican la transferencia de control a la direccin de una instruccin que no sigue de inmediato de la que se est ejecutando actualmente. Una transferencia de control puede ser hacia adelante, para ejecutar una serie de pasos nuevos , o hacia atrs, para volver a ejecutar los mismos pasos. Operaciones de comparacin CMP TEST Jnnn LOOP Operaciones de transferencia CALL JMP OR XOR Operaciones lgicas AND NOT RCR/ROR RCL/ROL Corrimiento y rotacin SAR/SHR SAL/SHL

Direcciones corta, cercana y lejana Una operacion de salto alcanza una direccion corta por medio de un desplazameinto de un byte, limitada a una distanciade -128 a 127 bytes. Una operacion de salto alcanza una direccin cercana por medio de un desplazamiento de una palabra, limitado a una distancia de -32,768 a 32,767 bytes dentro del mismo segmento. Una direccin lejana puede estar en otro segmento y es alcanzada por medio de una direccin de segmento y un desplazamiento; CALL es la instruccion normal para este proposito. Corta Mismo segmento Instruccin JMP Jnnn LOOP CALL -128 a 127 SI SI SI N/A Cercana Mismo segmento -32768 a 32767 SI NO NO SI SI NO NO SI Lejana Otro segmento

42

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Etiquetas de instrucciones Las instrucciones JMP, Jnnn y Loop requieren un operando que se refiere a la etiqueta de una Instruccin. Por ejemplo: JMP A90 ... A90: MOV AH, 00 Instruccion JMP Una instruccion usada comnmente para la transferencia de control es la instruccion JMP(Jump, salto, bifurcacin). Un salto es incondicional, ya que la operacion transfiere el control bajo cualquier circunstancia. El formato general es: [etiqueta] Ejemplo: a) A50: ... JMP A50 b) ... JMP A60 ... A60: ... La instruccin LOOP La instruccion JMP provoca un ciclo infinito. Pero es mas probable que una rutina realize un ciclo un nmero especfico de veces o hasta que se alcanze una condicion particular. La instrucciom LOOP que sirve para este proposito requiere un valor inicial en el registro CX. En cada interacion, LOOP de forma automatica disminuye 1 de CX. Si el valor en el CX es cero, el control pasa a la instruccion que sigue, si el valor en el CX no es 0 , el control pasa a la direccion del operando. El formato es: [etiqueta] loop direccin_corta
43

JMP

direccin_corta, cercana o lejana

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Ejemplo:
page 60,132 title programa ejemplo del loop pilasg segment para stack 'stack' dw 32 dup(0) pilasg ends datosg segment para 'data' cad1 db 'itslv' cad2 db 5 dup(0) datosg ends codigosg segment para 'code' begin proc far assume ss:pilasg,ds:datosg,cs:codigosg mov ax,datosg mov ds,ax lea bx,cad1 lea si,cad2 mov cx,5 a10: mov ah,[bx] mov [si],ah inc bx inc si loop a10 mov ax,4c00h int 21h begin endp codigosg ends end begin

44

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

page 60,132 title programa ejemplo del loop pilasg segment para stack 'stack' dw 32 dup(0) pilasg ends datosg segment para 'data' cad1 db 'juan' cad2 db 'perez' cad3 db 10 dup(0) datosg ends codigosg segment para 'code' begin proc far assume ss:pilasg,ds:datosg,cs:codigosg mov ax,datosg mov ds,ax lea lea lea mov a10: mov ah,[bx] mov [di],ah inc bx inc di loop a10 inc di mov cx,5 a20: mov ah,[si] mov [di],ah inc si inc di loop a20 mov ax,4c00h int 21h begin endp codigosg ends end begin bx,cad1 si,cad2 di,cad3 cx,4

45

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

page 60,132 title programa que manipula vectores .model small .stack 64 .data vec1 db 10,30,50,70,80,90 vec2 db 5,35,40,75,70,95 vec3 db 6 dup(0) .code begin proc far mov ax,@data mov ds,ax lea bx,vec1 lea di,vec2 lea si,vec3 mov cx,6 a10: mov ah,[bx] cmp [di],ah ja a20 ;vec1 es mayor que vec2, entonces guardar vec1 mov [si],ah jmp a30 a20: ;vec2 es mayor que vec1, entonces guardar vec2 mov al,[di] mov [si],al a30: inc bx inc di inc si loop a10 mov ax,4c00h int 21h begin endp end begin

46

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Directivas simplificadas de segmentos Los ensambladores de Microsoft y de Boorland proporcionan algunas formas abreviadas para definir segmentos. Para usar estas abreviaturas, inicialice el modelo de memoria antes de definir algn segmento. El formato general es: .MODEL modelo_de_memoria El modelo de memoria puede ser: TINY, SMALL, MEDIUM, COMPACT o LARGE; los requisitos para cada modelo son: Modelo TINY SMALL MEDIUM COMPACT LARGE N de segmentos de cdigos * 1 Mas de 1 1 Ms de 1 N de segmento de datos * 1 1 Ms de 1 Ms de 1

El modelo TINY esta destinado para uso exclusivo de programas .com; los cuales tienen sus datos, cdigo y pila en un segmento. El modelo SMALL exige que el cdigo quepa en un segmento de 64k y los datos en otro segmento de 64k. La directiva .MODEL genera de forma automtica el enunciado ASSUME necesario. Los formatos generales para las directivas que define los segmentos de la pila de datos y de cdigo son: .STACK [tamao] .DATA .CODE [nombre] Cada una de estas directivas hace que el ensamblador genere el enunciado SEGMENT necesario y su correspondiente ENDS. Las instrucciones que ahora usa para inicializar la direccin del segmento de datos en el DS son: MOV AX,@data MOV DS,AX

47

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Ejemplo:
page 60,132 title operaciones de mover y sumar . model small .stack 64 .data a dw 250 b dw 125 c dw ? .code inicio proc far mov ax, @data mov ds, ax mov ax,a add ax, b mov c,ax mov ax,4c00h int 21h inicio endp end inicio

Instruccin CMP La instruccin CMP por lo comn es utilizada para comparar dos campos de datos, uno o ambos de los cuales estn contenidos en un registro. El formato general es: [etiqueta] CMP { registro/memoria} , {registro/memoria/inmediato}

El resultado de una operacin CMP afecta las banderas AF, CF, OF, PF, SF y ZF aunque no tiene que probar estas banderas de forma individual. Ejemplo: CMP BX,00 JZ B50 B50:

48

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Instrucciones de salto condicional El ensamblador permite usar una variedad de instrucciones de salto condicional que transfieren el control dependiendo de las configuraciones en el registro de banderas. Por ejemplo, puede comparar dos campos y despus saltar de acuerdo con los valores de las banderas que la comparacin establece. El formato general es: [etiqueta] Jnn direccin_corta

Datos con signo o sin signo El tipo de dato (con o sin signo) sobre los que se realizan las comparaciones o la aritmtica puede determinar cul es la instruccin a utilizar. Un dato sin signo trata todos los bits como bits de datos; ejemplo tpicos son las cadenas de caracteres, tal como nombres o direcciones, y valores numricos tal como numeros de clientes. Un dato con signo trata el bit de ms a la izquierda, como un signo en donde 0 es positivo y 1 es negativo. Muchos valores numricos pueden ser positivos o negativos. Saltos con base en datos sin signo Smbolo JE/JZ JNE/JNZ JA/JNBE JAE/JNB JB/JNAE JBE/JNA Descripcin salta si es igual o cero salta si no es igual o si no es cero salta si es mayor o si no es menor igual salta si es mayor igual o si no es menor salta si es menor o si no es mayor o igual salta si es menor igual o si no es menor Bandera examinada ZF ZF CP, ZF CF CF CF, AF

Saltos con base en datos con signo Smbolo JE/JZ JNE/JNZ JG/JNLE JGE/JNL JL/JNGE JLE/JNG Descripcin salta si es igual o salta si es cero salta si no es igual o salta si no es cero salta si es mayor o salta si no es mayor o igual salta si es mayor o igual o salta si no es menor salta si es menor o salta si no es mayor o igual salta si es menor o igual o salta si no es menor Bandera examinada ZF ZF ZF, SF,OF SF,OF SF,OF ZF,SF,OF
49

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Prueba aritmetica especiales Smbolo JS JNS JC JNC JO JNO JP/JPE JNP/JPO Ejemplo:
page 60,132 title programa que muestra salto condicionales .model small .stack 64 .data sexo db 'f' bono db ? .code begin proc far mov ax,@data mov ds,ax cmp sexo,102 jne a10 mov bono,200 jmp a20 a10: mov bono,100 a20: mov ax,4c00h int 21h begin endp end begin

Descripcin Salta si el signo es negativo Salta si el signo es positivo Salta si hay acarreo(=q JB) Salta si no hay acarreo Salta si hay desbordamiento Salta si no desbordamiento Salta si hay paridad o salta si la paridad es par Salta si no hay paridad o salta si la paridad es par

Bandera examinada SF SF CF CF OF OF PF PF

50

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Tabla de bifurcacin Un programa puede tener una rutina para probar varias condiciones relacionadas, de los que cada una necesita un salto a otra rutina. Ejemplo: CMP clave,0 Je a10 CMP clave,1 Je a20 CMP clave,2 Je a30 CMP clave,3 Je, a40 Jmp a50 a10: JMP a50 a20: JMP a50 a30: JMP a50 a40: a50: Cdigo de rastreo del teclado y codigo ASCII Letras ayA byB cyC dyD eyE fyF gyG hyH iyI jyJ kyK lyL myM nyN Normal 1E 61 30 62 2E 63 20 64 12 65 21 66 22 67 23 68 17 69 24 6 25 6B 26 6C 32 6D 31 6E Shift IE 30 2E 20 12 21 22 23 17 24 25 26 32 31 41 42 43 44 45 46 47 48 49 4 4B 0C 4D 4E Ctrl IE 30 2E 20 12 21 22 23 17 24 25 26 32 31 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E Alt 1E 30 2E 20 12 21 22 23 17 24 25 26 32 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00
51

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

oyO 18 pyP 19 qyQ 10 ryR 13 syS IF tyT 14 uyU 16 vyV 2F wyW 11 xyX 2D yyY 15 zyZ 2C Barra espaciadora

6F 70 71 72 73 74 75 76 77 78 79 7

18 19 10 13 IF 14 16 2F 11 2D 15 2C 39

4F 50 51 52 53 54 55 56 57 58 59 5C 20

18 19 10 13 IF 14 16 2F 11 2D 15 2C 39

0F 10 11 12 13 14 15 16 17 18 19 1A 20

18 19 10 13 IF 14 16 2F 11 2D 15 2C 39

00 00 00 00 00 00 00 00 00 00 00 00 20

Introduccin al procesamiento en pantalla y del teclado Hasta este punto, nuestros programas han definido datos ya sea en el area de datos o como datos inmediatos en un operando de instruccin. Sin embargo, la mayora de los programas necesitan entradas desde un teclado, disco, raton o modem y proporcionan salidas en un formato til, en la pantalla, impresora o disco. La pantalla La pantalla es una malla de posiciones direccionables, en cualquiera de las cuales se puede colocar el cursor. Un monitor comn de video tiene 25 renglones y 80 columnas. Ubicacin en pantalla Ubicacin en pantalla Esquina superior izquierda Esquina superior derecha Centro de la pantalla Esauina inferior izquierda Esquina inferior derecha Formato decimal Rengln Columna 00 00 12 24 24 00 79 39 00 79 Formato hexadecimal Rengln Columna 00h 00h 0Ch 18h 18h 00h 4fh 27h 00h 4Fh

52

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Colocacin del cursor La colocacin del cursor es un requisito comn en modo de texto, ya que su posicion determina en donde ser desplegado el siguiente carcter. El modo grfico no permite el uso del cursor. La INT 10h es la operacin del BIOS para manejo de la pantalla, y la funcin 02H en el AH, indica la operacin que coloca al cursor. mov mov mov mov int ah,02h bh,00 dh,05 dl,12 10h ;peticion para colocar el cursor ;numero de paginas 0 ;renglon 05 ;columna 12 ;interrupcion que llama al bios.

Limpiar la pantalla La funcin 06h de la Int 10h del bios maneja el borrado o recorrido de la pantalla. Puede limpiar todo o parte de un despliegue iniciando en cualquier localidad de la pantalla y terminando en cualquier localidad con numero mayor. mov mov mov mov int ax,0600h bh,71h cx,0000h dx,184fh 10h ;Ah 06(recorrido) ;atributo blanco(7) sobre azul (1) ;esquina superior izquierda rengln; columna ;esquina inferior derecha renglon; columna ;interrupcion que llama al bios.

Funcin 09h del DOS para despliegue en pantalla Requiere la definicin de una cadena de despliegue en el area de datos. La cadena es seguida inmediatamente, por un delimitador de signo de $, el cual utiliza la operacin para finalizar el despliegue. Ejemplo: cad db 'hola mundo...','$' ;cadena para despliegue

Coloque la funcin 09H en el registro AH, utilice LEA para cargar la direccin de la cadena de despliegue en el DX, y emita una interrupcin INT 21h. La operacin despliega los caracteres de izquierda a derecha y reconoce el final de los datos al encontrar el delimitador de signos de pesos. Ejemplo: ... mov lea int ah,09h dx,cad 21h
53

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Desarrolle un programa en lenguaje ensamblador que imprima Hola mundo en la pantalla de la computadora.
page 60,132 title programa Hola Mundo .model small .stack 64 .data cad db 'Hola mundo..','$' .code begin proc far mov ax,@data mov ds,ax ;limpiar pantalla mov ax,0600h mov bh,71h mov cx,0000h mov dx,184fh int 10h ;colocar cursor mov ah,02h mov bh,00h mov dh,10 mov dl,36 int 10h ;imprimir mov ah,09h lea dx,cad int 21h ;fin del programa mov ax,4c00h int 21h begin endp end begin

54

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

page 60,132 title programa que imprime un marco .model small .stack 64 .data car db '*','$' col db 0 ren db 0 .code begin proc far mov ax,@data mov ds,ax ;limpiar pantalla mov ax,0600h mov bh,71h mov cx,0000h mov dx,184fh int 10h ;imprimir lineas horizontales mov cx,80 a10: ;colocar cursor mov ah,02h mov bh,00 mov dh,0 ;renglon 0 mov dl,col ;columna int 10h ;imprimir * mov ah,09h lea dx,car int 21h ;colocar cursor mov ah,02h mov bh,00 mov dh,22 mov dl,col int 10h ;imprimir * mov ah,09h lea dx,car int 21h inc col loop a10 ;imprimir lineas verticales mov cx,23 a20: ;colocar cursor mov ah,02h mov bh,00 mov dh,ren mov dl,0

55

Lenguaje Ensamblador int 10h ;imprimir mov ah,09h lea dx,car int 21h ;colocar cursor mov ah,02h mov bh,00 mov dh,ren mov dl,79 int 10h ;imprimir mov ah,09h lea dx,car int 21h inc ren loop a20 mov ax,4c00h int 21h begin endp end begin

Ing. Faustino Vzquez Camporro

56

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

title

edad mayor menor begin

page 60,132 programa que imprime si es mayor de edad o no .model small .stack 64 .data db 15 db 'ERES MAYOR DE EDAD...','$' db 'ERES MENOR DE EDAD...','$' .code proc far mov ax,@data mov ds,ax mov es,ax cmp jae mov lea int jmp edad,18 b20 ah,09h dx,menor 21h b21 ah,09h dx,mayor 21h ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos ;salta a la etiqueta b21 para salir ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos

b20: mov lea int b21: mov ax,4c00h int 21h endp end begin

begin

57

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

page 60,132 title programa que imprime cuantas vocales a tiene una palabra .model small .stack 64 .data ca db 0 cad db 'ensamblador' men1 db 'No tiene la vocal a','$' men2 db 'Solo tiene una vocal a','$' men3 db 'Tiene varias veces la vocal a','$' .code begin proc far mov ax,@data mov ds,ax mov cx,11 lea bx,cad a10: mov cmp jne inc a20: inc bx loop a10 cmp ca,0 jne a30 ;imprimir no tiene a mov ah,09h lea dx,men1 int 21h jmp a50 a30: cmp ca,1 jne a40 ;imprimir tiene una vocal a mov ah,09h lea dx,men2 int 21h jmp a50 a40: ;imprimir tiene varias veces la vocal a mov ah,09h lea dx,men3 int 21h a50: mov ax,4c00h int 21h begin endp end begin ah,[bx] ah,97 a20 ca

58

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

title

horas normal doble triple error begin

page 60,132 Ilustracion de cmp, salto condicional-jae, salto incondicional-jmp .model small .stack 64 .data db 10 db 'HORAS NORMALES...','$' db 'HORAS EXTRAS DOBLES...','$' db 'HORAS EXTRAS TRIPLES...','$' db 'Error de horas...','$' .code proc far mov ax,@data mov ds,ax mov es,ax cmp ja mov lea int jmp horas,8 b10 ah,09h dx,normal 21h b50 horas,16 b20 ah,09h dx,doble 21h b50 horas,24 b30 ah,09h dx,triple 21h b50 ah,09h dx,error 21h ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos

b10: cmp ja mov lea int jmp b20: cmp ja mov lea int jmp b30: mov lea int b50: begin mov ax,4c00h int 21h endp end begin ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos

59

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

title

car cad1 cad2 cad3 cad4 juan maria pedro lin begin

page 60,132 programa que imprime una grafica de barras .model small .stack 64 .data db '','$' db 'Juan','$' db 'Maria','$' db 'Pedro','$' db 'Grafica de Ventas del Mes de Octubre','$' db 5 db 13 db 9 db ? .code proc far mov ax,@data mov ds,ax mov mov mov mov int mov mov ax,0600h bh,07 cx,0000 dx,184fh 10h cl,1 lin,20 dh,lin dl,40 ah,02h bh,00 10h ah,09h dx,car 21h dh,lin dl,41 ah,02h bh,00 10h ah,09h dx,car 21h dh,lin dl,42 ah,02h bh,00 10h ah,09h dx,car 21h dh,lin dl,43 ;recorrer toda la ;atributo: blanco ;posicion izquier ;posicion derecha pantalla sobre negro superior inferior

b10: mov mov mov mov int mov lea int mov mov mov mov int mov lea int mov mov mov mov int mov lea int mov mov ;peticion de fijar cursor ;pagina no. 0

;peticion de fijar cursor ;pagina no. 0

;peticion de fijar cursor ;pagina no. 0

60

Lenguaje Ensamblador mov mov int mov lea int mov mov mov mov int mov lea int inc dec cmp jbe mov mov b20: mov mov mov mov int mov lea int mov mov mov mov int mov lea int mov mov mov mov int mov lea int mov mov mov mov dh,lin dl,45 ah,02h bh,00 10h ah,09h dx,car 21h dh,lin dl,46 ah,02h bh,00 10h ah,09h dx,car 21h dh,lin dl,47 ah,02h bh,00 10h ah,09h dx,car 21h dh,lin dl,48 ah,02h bh,00 ;peticion de fijar cursor ;pagina no. 0 ah,02h bh,00 10h ah,09h dx,car 21h dh,lin dl,44 ah,02h bh,00 10h ah,09h dx,car 21h cl lin cl,juan b10 cl,1 lin,20 ;peticion de fijar cursor ;pagina no. 0

Ing. Faustino Vzquez Camporro

;peticion de fijar cursor ;pagina no. 0

;peticion de fijar cursor ;pagina no. 0

;peticion de fijar cursor ;pagina no. 0

;peticion de fijar cursor ;pagina no. 0

61

Lenguaje Ensamblador int mov lea int mov mov mov mov int mov lea int inc dec cmp jbe mov mov b30: mov mov mov mov int mov lea int mov mov mov mov int mov lea int mov mov mov mov int mov lea int mov mov mov mov int dh,lin dl,50 ah,02h bh,00 10h ah,09h dx,car 21h dh,lin dl,51 ah,02h bh,00 10h ah,09h dx,car 21h dh,lin dl,52 ah,02h bh,00 10h ah,09h dx,car 21h dh,lin dl,53 ah,02h bh,00 10h ;peticion de fijar cursor ;pagina no. 0 10h ah,09h dx,car 21h dh,lin dl,49 ah,02h bh,00 10h ah,09h dx,car 21h cl lin cl,maria b20 cl,1 lin,20

Ing. Faustino Vzquez Camporro

;peticion de fijar cursor ;pagina no. 0

;peticion de fijar cursor ;pagina no. 0

;peticion de fijar cursor ;pagina no. 0

;peticion de fijar cursor ;pagina no. 0

62

Lenguaje Ensamblador mov lea int mov mov mov mov int mov lea int inc dec cmp jbe mov mov mov mov int mov lea int mov mov mov mov int mov lea int mov mov mov mov int mov lea int mov mov mov mov int mov lea int ah,09h dx,car 21h dh,lin dl,54 ah,02h bh,00 10h ah,09h dx,car 21h cl lin cl,pedro b30 dh,21 dl,40 ah,02h bh,00 10h ah,09h dx,cad1 21h dh,21 dl,45 ah,02h bh,00 10h ah,09h dx,cad2 21h dh,21 dl,50 ah,02h bh,00 10h ah,09h dx,cad3 21h dh,2 dl,30 ah,02h bh,00 10h ah,09h dx,cad4 21h

Ing. Faustino Vzquez Camporro

;peticion de fijar cursor ;pagina no. 0

;peticion de fijar cursor ;pagina no. 0

;peticion de fijar cursor ;pagina no. 0

;peticion de fijar cursor ;pagina no. 0

;peticion de fijar cursor ;pagina no. 0

63

Lenguaje Ensamblador mov ax,4c00h int 21h endp end begin

Ing. Faustino Vzquez Camporro

begin

64

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

page 60,132 title programa que verifica las caractersticas para chica TEC .model small .stack 64 .data edad db 20 sexo db 'f' estat db 175 men1 db 'Estas seleccionada para chica TEC','$' men2 db 'Suerte para la proxima','$' .code begin proc far mov ax,@data mov ds,ax ;limpiar pantalla mov ax,0600h mov bh,71h mov cx,0000h mov dx,184fh int 10h ;colocar cursor mov ah,02h mov bh,00 mov dh,12 mov dl,30 int 10h ;comparar la edad cmp edad,18 jb a10 cmp sexo,102 jne a10 cmp estat,175 jb a10 ;imprimir eres seleccionada mov ah,09h lea dx,men1 int 21h jmp a20 a10: ;imprimir no eres seleccionada mov ah,09h lea dx,men2 int 21h a20: mov ax,4c00h int 21h begin endp end begin

65

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

page 60,132 title programa de 5 vocales .model small .stack 64 .data cad db 'itslv' men1 db 'La palabra si tiene las 5 vocales','$' men2 db 'La palabra no tiene las 5 vocales','$' ba db 0 be db 0 bi db 0 bo db 0 bu db 0 .code begin proc far mov ax,@data mov ds,ax ;limpiar la pantalla mov ah,06h mov al,00h mov bh,71h mov cx,0000h mov dx,184fh int 10h lea bx,cad mov cx,5 a10: mov cmp jne mov jmp a20: cmp jne mov jmp a30: cmp jne mov jmp a40: cmp jne mov jmp a50: cmp al,117 jne a60 mov bu,1 a60: al,111 a50 bo,1 a60 al,105 a40 bi,1 a60 al,101 a30 be,1 a60 al,[bx] al,97 a20 ba,1 a60

66

Lenguaje Ensamblador inc bx loop a10 cmp ba,0 je a70 cmp be,0 je a70 cmp bi,0 je a70 cmp bo,0 je a70 cmp bu,0 je a70 mov ah,09h lea dx,men1 int 21h jmp a80 a70: mov ah,09h lea dx,men2 int 21h a80: mov ax,4c00h int 21h begin endp end begin

Ing. Faustino Vzquez Camporro

67

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Funcin 0AH del DOS para entrada del teclado En particular, la funcin 0AH, de la INT 21H para aceptar datos desde el teclado es poderosa. El rea de entrada para los caracteres tecleados requiere de una lista de parmetros que contenga los campos especificados que la operacin INT va a procesar. Primero, la interrupcion necesita conocer la longitud mxima de los datos de entrada. El propsito es advertir a los usuarios que tecleen caracteres en demasa; la operacin enva sonidos por la bocina y no acepta caracteres adicionales. Segundo, la operacin enva a la lista de parmetros el numero de bytes que realmente se introdujeron. El cdigo que sigue define una lista de parmetros para un rea de entrada. Cadena Maxlen Caractint Campo ... Label es una directiva con el tipo de atributo de BYTE, que solo provoca alineacin en un limite de byte. El primer byte contiene su lmite del nmero mximo de caracteres de entrada. El segundo byte es para la operacin que almacena el nmero real de caracteres introducidos como un valor binario. El tercer byte inicia un campo que contiene los caracteres tecleados, de izquierda a derecha. Para solicitar una entrada establezca la funcin 0AH en AH, cargue la direccin de la lista de parmetros en el DX, y emita INT 21H. Por ejemplo: Mov Lea Int ah,0Ah dx,Cadena 21h label db db db byte 20 ? 20 dup(' ')

68

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

page 60,132 title programa ejemplo para lectura .model small .stack 64 .data nombre label byte maxlen db 20 carint db ? campo db 21 dup(' ') men1 men2 db 'Dame tu nombre: ','$' db 'Tu nombre es: ','$' .code begin proc far mov ax,@data mov ds,ax ;limpiar pantalla mov ax,0600h mov bh,71h mov cx,0000h mov dx,184fh int 10h ;posicion del cursor mov ah,02h mov bh,00 mov dh,10 mov dl,20 int 10h ;imprimir mov ah,09h lea dx,men1 int 21h ;leer del teclado mov ah,0ah lea dx,nombre int 21h ;cambiar el enter por $ mov bh,00 mov bl,carint mov campo[bx],'$' ;posicion del cursor mov ah,02h mov bh,00 mov dh,12 mov dl,20 int 10h ;imprimir mov ah,09h lea dx,men2 int 21h ;imprimir nombre introducido mov ah,09h

69

Lenguaje Ensamblador lea dx,campo int 21h ;terminar el programa mov ax,4c00h int 21h begin endp end begin

Ing. Faustino Vzquez Camporro

70

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

page 60,132 title programa que lee las votaciones de cada partido e imprime el ganador .model small .data voto label byte lonmax db 4 lonreal db ? num db 3 dup (' ') pri db 0 pan db 0 prd db 0 cad1 db 09,'VOTACIONES PARA PRESIDENTE MUNICIPAL',10,13,'$' cad2 db '1. PRI',10,13,'$' cad3 db '2. PAN',10,13,'$' cad4 db '3. PRD',10,13,'$' cad5 db '4. SALIR',10,13,'$' cad6 db 'PULSA EL NUMERO POR EL PARTIDO QUE VOTARAS:','$' cad7 db 'PRI GANO','$' cad8 db 'PAN GANO','$' cad9 db 'PRD GANO','$' .code begin proc far mov ax,@data mov ds,ax a10: ;limpiar la pantalla mov ax,0600h ;recorrer toda la pantalla mov bh,07 ;atributo: blanco sobre negro mov cx,0000 ;posicion izquier superior mov dx,184fh ;posicion derecha inferior int 10h ;ciclo para leer los votos mov ah,09h lea dx,cad1 int 21h mov ah,09h lea dx,cad2 int 21h mov ah,09h lea dx,cad3 int 21h mov ah,09h lea dx,cad4 int 21h mov ah,09h lea dx,cad5 int 21h mov ah,09h lea dx,cad6 int 21h mov ah,0Ah lea dx,voto int 21h ;se pregunta por el numero pulsado cmp num,49 ;num 1 jne a20 inc pri jmp a10 a20: cmp num,50 ;num 2 jne a30

71

Lenguaje Ensamblador inc pan jmp a10 a30: cmp jne inc jmp a40: cmp num,52 ;num 4 jne a10 ;comparar que partido mov ax,0600h mov bh,07 mov cx,0000 mov dx,184fh int 10h mov ah,pan cmp pri,ah jb a50 mov ah,prd cmp pri,ah jb a50 mov ah,09h lea dx,cad7 int 21h jmp a70 a50: mov cmp jb mov cmp jb mov lea int jmp a60: mov cmp jb mov cmp jb mov lea int a70: mov ax,4c00h int 21h begin endp end begin ah,pri prd,ah a70 ah,pan prd,ah a70 ah,09h dx,cad9 21h ah,pri pan,ah a60 ah,prd pan,ah a60 ah,09h dx,cad8 21h a70 gano ;recorrer toda la ;atributo: blanco ;posicion izquier ;posicion derecha num,51 a40 prd a10 ;num 3

Ing. Faustino Vzquez Camporro

pantalla sobre negro superior inferior

72

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

page 60,132 title programa que mueve un asterisco en la pantalla .model small .stack 64 .data car db '*','$' opc label byte maxlen db 2 carint db ? campo db 3 dup(' ') col db 40 ren db 12 .code begin proc far mov ax,@data mov ds,ax a10: ;limpiar pantalla mov ax,0600h mov bh,71h mov cx,0000h mov dx,184fh int 10h ;colocar cursor mov ah,02h mov bh,00 mov dh,ren mov dl,col int 10h ;imprimir mov ah,09h lea dx,car int 21h ;leer la tecla para el movimiento mov ah,0AH lea dx,opc int 21h lea bx,campo mov al,[bx] cmp al,65 jne a20 dec cmp jne mov jmp a20: cmp al,68 jne a30 inc col cmp col,79 ;D col col,0 a10 col,78 a10 ;A

73

Lenguaje Ensamblador jne a10 mov col,1 jmp a10 a30: cmp al,87 jne a40 dec cmp jne mov jmp a40: cmp al,88 jne a50 inc cmp jne mov jmp a50: cmp al,83 jne a60 jmp a70 a60: jmp a10 a70: mov ax,4c00h int 21h begin endp end begin ;S ren ren,24 a10 ren,1 a10 ;X ren ren,0 a10 ren,23 a10 ;W

Ing. Faustino Vzquez Camporro

74

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

page 60,132 title programa que imprime el eje x y eje y .model small .stack 64 .data cad1 db 'Primero: ','$' cad2 db 'Segundo: ','$' cad3 db 'Tercero: ','$' prom1 label byte lonmax1 db 3 lonrea1 db ? num1 db 4 dup(' ') prom2 label byte lonmax2 db 3 lonrea2 db ? num2 db 4 dup(' ') prom3 label byte lonmax3 db 3 lonrea3 db ? num3 db 4 dup(' ') cad4 db '1','$' cad5 db '2','$' cad6 db '3','$' cad7 db '4','$' cad8 db '5','$' cad9 db '6','$' cad10 db '7','$' cad11 db '8','$' cad12 db '9','$' cad13 db '10','$' cad14 db '','$' cad15 db 20 dup(''),'$' ;ASCII: 196 cad16 db '','$' ;ASCII: 219 cad17 db '','$' y1 db ? y2 db ? y3 db ? .code begin proc far mov ax,@data mov ds,ax ;limpiar la pantalla mov ah,06h mov al,00h mov bh,71h mov cx,0000h mov dx,184fh int 10h ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,5 ;renglon mov dl,10 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad1 int 21h ;leer del teclado mov ah,0Ah

75

Lenguaje Ensamblador lea dx,prom1 int 21h ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,6 ;renglon mov dl,10 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad2 int 21h ;leer del teclado mov ah,0Ah lea dx,prom2 int 21h ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,7 ;renglon mov dl,10 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad3 int 21h ;leer del teclado mov ah,0Ah lea dx,prom3 int 21h ;imprimir el eje X ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,20 ;renglon mov dl,20 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad15 int 21h ;imprimir el eje Y mov y1,10 a10: ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,y1 ;renglon mov dl,20 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad14 int 21h inc y1 cmp y1,20 jb a10 ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,20 ;renglon

Ing. Faustino Vzquez Camporro

76

Lenguaje Ensamblador mov dl,20 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad17 int 21h ;imprimir los numeros del eje Y ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,10 ;renglon mov dl,18 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad13 int 21h ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,11 ;renglon mov dl,19 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad12 int 21h ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,12 ;renglon mov dl,19 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad11 int 21h ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,13 ;renglon mov dl,19 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad10 int 21h ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,14 ;renglon mov dl,19 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad9 int 21h ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,15 ;renglon

Ing. Faustino Vzquez Camporro

77

Lenguaje Ensamblador mov dl,19 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad8 int 21h ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,16 ;renglon mov dl,19 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad7 int 21h ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,17 ;renglon mov dl,19 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad6 int 21h ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,18 ;renglon mov dl,19 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad5 int 21h ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,19 ;renglon mov dl,19 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad4 int 21h ;imprimir los numeros del eje X ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,21 ;renglon mov dl,31 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad6 int 21h ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,21 ;renglon

Ing. Faustino Vzquez Camporro

78

Lenguaje Ensamblador mov dl,27 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad5 int 21h ;posicionar el cursor en una coordenada mov ah,02h mov bh,00h mov dh,21 ;renglon mov dl,23 ;columna int 10h ;imprimir el mensaje a pantalla mov ah,09h lea dx,cad4 int 21h mov ax,4c00h int 21h begin endp end begin

Ing. Faustino Vzquez Camporro

79

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Unidad 3. Macros y Procedimientos Procedimientos Hasta ahora los segmentos de cdigo han consistido slo en un procedimiento, codificado como: BEGIN PROC FAR . . . BEGIN ENDP En esta caso el operando FAR informa al sistema que la direccin indicada es el punto de entrada para la ejecucin del programa, mientras que la directiva ENDP define al final del procedimiento. Sin embargo, un segmento de cdigo puede tener cualquier nmero de procedimientos, todos distinguidos por PROC y ENDP. Un procedimiento llamado (o subrutina) es una seccin de cdigo que realiza una tarea definida y clara. Operaciones CALL y RET La instruccin CALL transfiere el control a un procedimiento llamado, y la instruccin RET regresa del procedimiento llamado al procedimiento original que hizo la llamada. RET debe ser la ultima instruccin en un procedimiento llamado. Los formatos generales para CALL y RET son: [etiqueta: ] CALL [etiqueta: ] RET Ejemplo:
title page 60,132 p06asm (EXE) Ilustracion de procedimientos .model small .stack 64 .data db 09,'MENU PRINCIPAL',13,10,'$' db '1. SALTO CONDICIONAL',13,10,'$' db '2. SUMA NUMERO SIN SIGNO',13,10,'$' db '3. MULTIPLICACION SIN SIGNO',13,10,'$' db 'OPCION:',13,10,'$' .code proc far mov ax,@data mov ds,ax mov es,ax call mov int endp menu ax,4c00h 21h

procedimiento [inmediato]

opc1 opc2 opc3 opc4 opc5 begin

begin menu

proc near mov ah,09h

;peticion para desplegar

80

Lenguaje Ensamblador lea int mov lea int mov lea int mov lea int mov lea int menu dx,opc1 21h ah,09h dx,opc2 21h ah,09h dx,opc3 21h ah,09h dx,opc4 21h ah,09h dx,opc5 21h

Ing. Faustino Vzquez Camporro ;carga la direccion de la indicacion ;llama al dos ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos

ret endp end begin

81

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

title

CR LF TAB opc1 opc2 opc3 opc4 opc5 begin

page 60,132 p06asm (EXE) Ilustracion de procedimientos .model small .stack 64 .data EQU 13 ;EQU declara constantes 13-Retorno de carro EQU 10 ;10-Avance de linea EQU 09 ;09-Avanza al sig Tabulador db TAB,'MENU PRINCIPAL',CR,LF,'$' db '1. SALTO CONDICIONAL',CR,LF,'$' db '2. SUMA NUMERO SIN SIGNO',CR,LF,'$' db '3. MULTIPLICACION SIN SIGNO',CR,LF,'$' db 'OPCION:',CR,LF,'$' .code proc far mov ax,@data mov ds,ax mov es,ax call mov int endp menu ax,4c00h 21h

begin menu

proc near mov ah,09h lea dx,opc1 int 21h mov lea int mov lea int mov lea int mov lea int ah,09h dx,opc2 21h ah,09h dx,opc3 21h ah,09h dx,opc4 21h ah,09h dx,opc5 21h

;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos ;peticion para desplegar ;carga la direccion de la indicacion ;llama al dos

menu

ret endp end begin

82

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

title

char espa begin

page 60,132 p09asm (EXE) Despliegue en pantalla .model small .stack 64 .data db 00,'$' db ' ','$' .code proc far mov ax,@data mov ds,ax mov es,ax call call call mov int endp clrscr gotoxy printf ax,4c00h 21h ;limpiar pantalla ;fijar cursor ;exhibir caracteres

begin clrscr

proc near mov ax,0600h mov bh,07 mov cx,0000 mov dx,184fh int 10h ret endp proc near mov ah,02h mov bh,00 mov dx,0000 int 10h ret endp proc near mov cx,256 mov lea int inc mov lea int ah,09h dx,char 21h char ah,09h dx,espa 21h

;recorrer toda la ;atributo: blanco ;posicion izquier ;posicion derecha

pantalla sobre negro superior inferior

clrscr gotoxy

;peticion de fijar cursor ;pagina no. 0 ;hilera 0, columna 0

gotoxy printf d20:

;iniciar 256 iteracciones ;exhibir caracter ascii ;iniciar direccion de caracter a imprimir ;incrementar para el sig caracter ;exhibir caracter ascii ;iniciar direccion de caracter a imprimir ;regresa si es dif de cero

printf

loop d20 ret endp end begin

83

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

title

parame lonmax lonrea nombre cadena begin

page 60,132 p10asm (EXE) Aceptar y mostrar nombres .model small .stack 64 .data label byte ;lista de parametros db 20 ;longitud maxima db ? ;no. de caracteres introducidos db 21 dup(' ') ;variable con los datos introducidos db 'Dame tu nombre: ','$' .code proc far mov ax,@data mov ds,ax mov es,ax call clrscr dx,0000 gotoxy printf scanf clrscr lonrea,00 a30 confcad writeln a20 ax,4c00h 21h ;limpiar pantalla ;fijar cursor en 00,00 ;imprimir cadena en pantalla ;lee del teclado el nombre ;limpiar pantalla ;se ingreso el nombre? ;salta si es igual a, no, salida ;configurar cadena para impresion ;centra e imprime el nombre

A20: mov call call call call cmp je call call jmp a30: begin mov int endp

writeln proc near mov dl,lonrea shr dl,1 neg dl add dl,40 centrado mov dh,12 call gotoxy mov ah,09h lea dx,nombre int 21h ret writeln endp confcad proc near mov bh,00 mov bl,lonrea mov nombre[bx],07 mov nombre[bx+1],'$' ret confcad endp clrscr proc near mov ax,0600h mov bh,07

;almacena longitud real del nombre ;corrimiento derecha sin signo ;niega los bits ;suma 40, calcula la columna para imprimir ;establece fila en 12, fila central pantalla (25) ;fija cursor ;imprime el nombre centrado en pantalla

;reemplaza caracter enter (0d) ;con el de la campana (07) ;pone el delimitador de impresion

;recorrer toda la pantalla ;atributo: blanco sobre negro

84

Lenguaje Ensamblador mov mov int clrscr gotoxy ret endp proc near mov ah,02h mov bh,00 int 10h ret endp proc near mov ah,0ah lea dx,parame int 21h ret endp proc near mov ah,09h lea dx,cadena int 21h ret endp end begin ;peticion de teclado ;entrada ;peticion de fijar cursor ;pagina no. 0 cx,0000 dx,184fh 10h ;posicion izquier superior ;posicion derecha inferior

Ing. Faustino Vzquez Camporro

gotoxy scanf

scanf printf

;peticion para imprimir en pantalla

printf

85

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

title

cadena carh carv esqsi esqsd esqii esqid col lin begin

page 60,132 p10asm (EXE) Imprimir un marco en pantalla .model small .stack 64 .data db 'INSTITUTO TECNOLOGICO SUPERIOR DE VILLA LA VENTA','$' db '','$' ;205 decimal db '','$' ;186 decimal db '','$' ;201 decimal db '','$' ;187 decimal db '','$' ;200 decimal db '','$' ;188 decimal db 0 db 0 .code proc far mov ax,@data mov ds,ax mov es,ax call call mov mov call call mov int endp clrscr marco dl,10 dh,12 gotoxy printf ax,4c00h 21h ;limpiar pantalla ;situa en columna 10 ;establece fila en 12, fila central pantalla (25) ;situa el cursor en 10,12 ;imprime la cadena

begin marco b10:

proc near mov mov call mov lea int mov mov call mov lea int inc cmp jbe dh,0 dl,col gotoxy ah,09h dx,carh 21h dh,23 dl,col gotoxy ah,09h dx,carh 21h col col,79 b10 dh,lin dl,0 gotoxy ah,09h dx,carv 21h dh,lin

;imprime el caracter horizontal de 0 a 79

;imprime el caracter horizontal de 0 a 79

b20: mov mov call mov lea int mov

;imprime el caracter horizontal de 0 a 79

86

Lenguaje Ensamblador mov call mov lea int inc cmp jbe mov mov call mov lea int mov mov call mov lea int mov mov call mov lea int mov mov call mov lea int marco ret endp dl,79 gotoxy ah,09h dx,carv 21h lin lin,23 b20 dh,0 dl,0 gotoxy ah,09h dx,esqsi 21h dh,0 dl,79 gotoxy ah,09h dx,esqsd 21h dh,23 dl,0 gotoxy ah,09h dx,esqii 21h dh,23 dl,79 gotoxy ah,09h dx,esqid 21h

Ing. Faustino Vzquez Camporro

;imprime el caracter horizontal de 0 a 79

;imprime el caracter horizontal de 0 a 79

;imprime el caracter horizontal de 0 a 79

;imprime el caracter horizontal de 0 a 79

;imprime el caracter horizontal de 0 a 79

printf proc near mov ah,09h lea dx,cadena int 21h ret printf endp clrscr proc near mov ax,0600h mov bh,07 mov cx,0000 mov dx,184fh int 10h ret endp proc near mov ah,02h

;imprime el nombre centrado en pantalla

;recorrer toda la ;atributo: blanco ;posicion izquier ;posicion derecha

pantalla sobre negro superior inferior

clrscr gotoxy

;peticion de fijar cursor

87

Lenguaje Ensamblador mov int gotoxy bh,00 10h ;pagina no. 0

Ing. Faustino Vzquez Camporro

ret endp end begin

88

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

page 60,132 p10asm (EXE) Mover un asterisco .model small .stack 64 .data parame label byte ;lista de parametros lonmax db 2 ;longitud maxima lonrea db ? ;no. de caracteres introducidos letra db 3 dup(' ') ;variable con los datos introducidos car db '*','$' col db 10 lin db 10 .code begin proc far mov ax,@data mov ds,ax mov es,ax title A10: call clrscr mov dh,lin mov dl,col call gotoxy call printf call scanf cmp letra,65 ;A jne a20 dec col cmp col,0 jne a10 mov col,80 jmp a10 a20: cmp jne inc cmp jne mov jmp a30: cmp jne dec cmp jne mov jmp a40: cmp jne inc cmp jne mov jmp a50: cmp jne letra,83 a10 ;S letra,88 a50 lin lin,26 a10 lin,1 a10 ;X letra,87 a40 lin lin,0 a10 lin,25 a10 ;W letra,68 a30 col col,81 a10 col,1 a10 ;D ;limpiar pantalla

;imprimir cadena en pantalla ;lee del teclado la letra

89

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

begin clrscr

mov int endp

ax,4c00h 21h

proc near mov ax,0600h mov bh,07 mov cx,0000 mov dx,184fh int 10h ret endp proc near mov ah,02h mov bh,00 int 10h ret endp proc near mov ah,0ah lea dx,parame int 21h ret endp proc near mov ah,09h lea dx,car int 21h ret endp end begin

;recorrer toda la ;atributo: blanco ;posicion izquier ;posicion derecha

pantalla sobre negro superior inferior

clrscr gotoxy

;peticion de fijar cursor ;pagina no. 0

gotoxy scanf

;peticion de teclado ;entrada

scanf printf

;peticion para imprimir en pantalla

printf

90

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Macros Para macros que usted necesite incluir con su programa, primero tiene que definirlas (o copiarlas de una biblioteca de macros). Una definicin de macro aparece antes que cualquier definicin de segmento. Su formato general es: INICIO MACRO ;Define macro MOV AX,@DATA MOV DS,AX MOV ES,AX ENDM El nombre de esta macro es INICIO, aunque es aceptable cualquier otro nombre vlido que sea nico. La directiva MACRO en la primer lnea le indica al ensamblador que las instrucciones que siguen hasta ENDM (fin de la macro), son parte de la definicin de la macro. La directiva ENDM termina la definicin de la macro. Las instrucciones entre MACRO y ENDM comprenden el cuerpo de la definicin de la macro. En forma subsecuente se puede usar la macroinstruccin INICIO en el segmento de cdigo en donde quiera inicializar los registros. Cuando el ensamblador encuentra la macroinstruccin INICIO, busca en una tabla de instrucciones simblicas y, a falta de una entrada, busca macroinstrucciones. Ya que el programa contiene una definicin de la macro INICIO, el ensamblador sustituye el cuerpo de la definici generando las instrucciones: la expansin de la macro. Uso de parmetros en macros Para hacer una macro flexible,puede definir nombre en ella como argumentos mudos (ficticios). La definicin de la macro siguiente, llamada PRINTF, proporciona el uso de la funcin 09H del DOS para desplegar cualquier mensaje. PRINTF MACRO MOV AH,09H LEA DX,MENSAJE INT 21H MENSAJE

ENDM Cuando se usa la macroinstruccin, el programador tiene que proporcionar el nombre del mensaje, el cual hace referencia a un rea de datos terminada por un signo de pesos.

91

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Comentarios Puede codificar comentarios en una definicin de macro para clarificar su objetivo. Una directiva COMMENT o un punto y coma indican una lnea de comentario. Por ejemplo PRINTF MACRO MENSAJE ;Esta macro permite agregar comentarios MOV AH,09H LEA DX,MENSAJE INT 21H

ENDM Directiva LOCAL Algunas macros necesitan que se definan elementos de datos y etiquetas de instrucciones dentro de la definicin dela macro. Si utiliza la macro ms de una vez en el mismo programa y el ensamblador define los elementos de datos para cada aparicin, los nombres duplicados haran que el ensamblador genere un mensaje de error. Para asegurar que cada nombre generado es nico, codifique la directiva LOCAL inmediatamente despus de la instruccin MACRO, aun antes de los comentarios. Su formato general es: LOCAL mudo-1, mudo-2, ;Uno o ms argumentos mudos Incluir (INCLUDE) desde una biblioteca de macros Definir una macro como INICIO PRINTF, y usarla slo una vez en un programa no es muy productivo. El enfoque habitual es catalogar las macros en una biblioteca en disco bajo un nombre descriptivo, como MACRO.LIB. Usted slo tiene que reunir todas las definiciones de sus macros en un archivo y almacenar el archivo en disco. Para usar cualquiera de las macros catalogadas, en lugar de codificar las definiciones MACRO al inicio del programa utilice la directiva INCLUDE de la siguiente manera: INCLUDE D:MACRO.LIB El ensamblador accesa al archivo llamado MACRO.LIB en la unidad e incluye ambas definiciones de macro, INICIO y PRINTF, en el programa.

92

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Por ejemplo:
title page 60,132 p16asm (exe) Uso de Macros gotoxy macro col,ren mov ah,02h mov bh,00 ;pagina mov dh,ren ;renglon mov dl,col ;columna int 10h endm iniciar macro mov ax,@data mov ds,ax mov es,ax endm finalizar macro mov ax,4c00h int 21h endm clrscr macro esq1,esq2,color mov ax,0600h mov bh,color ;17h blanco sobre azul mov cx,esq1 ;0000 mov dx,esq2 ;184fh pantalla completa int 10h endm printf macro mensaje ;Uso de parametros en la macro mov ah,09h lea dx,mensaje int 21h endm marco macro x1,y1,x2,y2 local b10 local b20 mov cl,x1 b10: gotoxy cl,y1 printf carh gotoxy printf inc cmp jbe mov b20: gotoxy printf gotoxy printf inc cmp jbe gotoxy x1,cl carv x2,cl carv cl cl,y2 b20 x1,y1 cl,y2 carh cl cl,x2 b10 cl,y1

93

Lenguaje Ensamblador printf gotoxy printf gotoxy printf gotoxy printf esqsi x2,y1 esqsd x1,y2 esqii x2,y2 esqid

Ing. Faustino Vzquez Camporro

endm scanf macro palabra mov ah,0Ah lea dx,palabra int 21h endm .model small .stack 64 .data pal label byte lonmax db 10 lonreal db ? letra db 9 dup (' ') cad db 'Ejemplo de la instruccion Macro...','$' cad2 db 'Otro ejemplo de macro...','$' carh db '','$' ;205 decimal carv db '','$' ;186 decimal esqsi db '','$' ;201 decimal esqsd db '','$' ;187 decimal esqii db '','$' ;200 decimal esqid db '','$' ;188 decimal cad3 db 'INTRODUCE TU NOMBRE:','$' .code begin proc far iniciar clrscr 0000h,184fh,17h ;fondo=verde(2), letra=blanco(7) marco 0,0,79,23 marco 2,2,77,4 gotoxy 30, 10 printf cad clrscr 0E1Eh,0E35h,27h gotoxy 30, 14 printf cad2 gotoxy 10,3 printf cad3 scanf pal finalizar begin endp end begin

94

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

page 60,132 title examen unidad dos clrscr macro mov ax,0600h mov bh,07h ;blanco sobre azul mov cx,0000 mov dx,184fh ;pantalla completa int 10h endm gotoxy macro col,ren mov ah,02h mov bh,00 ;pagina mov dh,ren ;renglon mov dl,col ;columna int 10h endm printf macro mensaje ;Uso de parametros en la macro mov ah,09h lea dx,mensaje int 21h endm scanf macro cad mov ah,0Ah lea dx,cad int 21h endm .model small .stack 64 .data pal1 label byte lonmax1 db 11 lonreal1 db ? cad1 db 10 dup(' ') pal2 label byte lonmax2 db 11 lonreal2 db ? cad2 db 10 dup(' ') cad3 cad4 cad5 cont db 'Dame una palabra (maximo de 10 caracteres):','$' db 'SI SON IGUALES...','$' db 'NO SON IGUALES...','$' db 0 .code begin proc far mov ax,@data mov ds,ax clrscr gotoxy 10,5 printf cad3 scanf pal1 gotoxy 10,7 printf cad3 scanf pal2 ;comparar las dos palabras a10: mov bh,00

95

Lenguaje Ensamblador mov bl,cont mov al,cad2[bx] cmp cad1[bx],al jne a20 inc cont mov al,lonreal1 cmp cont,al jbe a10 gotoxy 10,9 printf cad4 jmp a30 a20: gotoxy 10,9 printf cad5 a30: mov ax,4c00h int 21h begin endp end begin

Ing. Faustino Vzquez Camporro

96

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

title

page 60,132 p19asm (exe) iniciar macro mov mov mov endm finalizar macro mov int endm clrscr macro mov mov mov mov int endm gotoxy macro mov mov mov mov int endm printf macro ;Uso de mov lea int endm marco macro local local mov b10: gotoxy printf gotoxy printf inc cmp jbe mov b20: gotoxy printf gotoxy printf inc cmp jbe gotoxy printf gotoxy printf gotoxy printf gotoxy printf

Juego del gato ax,@data ds,ax es,ax ax,4c00h 21h ax,0600h bh,17h cx,0000 dx,184fh 10h col,ren ah,02h bh,00 dh,ren dl,col 10h

;blanco sobre azul ;pantalla completa

;pagina ;renglon ;columna

mensaje parametros en la macro ah,09h dx,mensaje 21h x1,y1,x2,y2 b10 b20 cl,x1 cl,y1 carh cl,y2 carh cl cl,x2 b10 cl,y1 x1,cl carv x2,cl carv cl cl,y2 b20 x1,y1 esqsi x2,y1 esqsd x1,y2 esqii x2,y2 esqid

97

Lenguaje Ensamblador endm .model small .stack 64 .data db 'Ejemplo de la instruccion Macro...','$' db 'Otro ejemplo de macro...','$' db '','$' ;205 decimal db '','$' ;186 decimal db '','$' ;201 decimal db '','$' ;187 decimal db '','$' ;200 decimal db '','$' ;188 decimal db 0 db 0 db 0 db 1 db 0 db 0 db 0 db 1 db 1 db 'Si hubo gato','$' db 'No hubo gato','$' .code proc far iniciar clrscr marco 0,0,79,23 cmp a1,1 jne a10 cmp a2,1 jne a10 cmp a3,1 jne a10 gotoxy 30,10 printf men1 jmp d10 cmp jne cmp jne cmp jne gotoxy printf jmp a20: cmp jne cmp jne cmp jne gotoxy printf jmp a30: cmp jne cmp a1,1 b10 b1,1 c1,1 a30 c2,1 a30 c3,1 a30 30,10 men1 d10 b1,1 a20 b2,1 a20 b3,1 a20 30,10 men1 d10

Ing. Faustino Vzquez Camporro

cad cad2 carh carv esqsi esqsd esqii esqid a1 a2 a3 b1 b2 b3 c1 c2 c3 men1 men2 begin

a10:

98

Lenguaje Ensamblador jne cmp jne gotoxy printf jmp b10: cmp jne cmp jne cmp jne gotoxy printf jmp b20: cmp jne cmp jne cmp jne gotoxy printf jmp b30: cmp jne cmp jne cmp jne gotoxy printf jmp c10: cmp jne cmp jne cmp jne gotoxy printf jmp c20: gotoxy printf d10: begin finalizar endp end begin 30,10 men2 a3,1 c20 b2,1 c20 c1,1 c20 30,10 men1 d10 a1,1 c10 b2,1 c10 c3,1 c10 30,10 men1 d10 a3,1 b30 b3,1 b30 c3,1 b30 30,10 men1 d10 a2,1 b20 b2,1 b20 c2,1 b20 30,10 men1 d10 b10 c1,1 b10 30,10 men1 d10

Ing. Faustino Vzquez Camporro

99

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

Unidad 4. Programacin hbrida


#include <conio.h> #include <stdio.h> void main(void) { int num1,num2,res; clrscr(); gotoxy(20,10);printf("Dame el numero del ciclo: "); scanf("%i",&num1); gotoxy(20,12);printf("Dame el numero a sumar: "); scanf("%i",&num2); asm push ax; asm push cx; asm mov cx,num1 asm mov ax,0h mult: asm add ax,num2 asm loop mult asm mov res,ax asm pop cx; asm pop ax; gotoxy(20,14);printf("El resultado es: %i",res); getch(); }

#include <conio.h> #include <stdio.h> void main(void) { int num1,num2,res; clrscr(); gotoxy(20,10);printf("Dame el numero del ciclo: "); scanf("%i",&num1); gotoxy(20,12);printf("Dame el numero a sumar: "); scanf("%i",&num2); asm{ push ax; push cx; mov cx,num1 mov ax,0h } mult: asm{ add ax,num2 loop mult mov res,ax pop cx; pop ax; } gotoxy(20,14);printf("El resultado es: %i",res); getch(); }

100

Lenguaje Ensamblador

Ing. Faustino Vzquez Camporro

#include <conio.h> #include <stdio.h> extern dato; extern set_curs(); void main(void) { int temp_row, temp_col; clrscr(); gotoxy(20,10); printf("Introduce el renglon: "); scanf("%i",&temp_row); gotoxy(20,12); printf("Introduce la columna: "); scanf("%i",&temp_col); set_curs(temp_row, temp_col); printf("Nueva posicion del cursor..."); getch(); }

#include <conio.h> #include <stdio.h> int variable; extern dato; extern funcion(); main() { int a=21930; char b='Z'; variable = funcion (a, b, 0x12345678); getch(); return 0; }

101

También podría gustarte