Documente Academic
Documente Profesional
Documente Cultură
Unidad1. Fundamentos.
1.1 Introducción.
1.1.1 Uso y aplicaciones del lenguaje ensamblador.
Importancia del Estudio y Uso de Ensamblador
Ayuda a conocer a detalle cómo trabaja un CPU
Util para Electrónica y Sistemas
Desarrolla Habilidades de Programación Avanzada
Mejores Oportunidades de Empleo en la Industria
Hay algún debate encima de la utilidad del lenguaje ensamblador. En muchos casos,
compiladores modernos pueden rendir lenguajes de alto nivel en el código como eso corre tan
rápido como la mano que escribe en ensamblador.
Sin embargo, algunos cálculos discretos aun pueden darse mas rápidamente corriendo código
en ensamblador, y alguna programación de bajo nivel es simplemente mas fácil de hacer en
ensamblador. Algunas tareas de sistemas-dependientes realizadas por sistemas operativos
simplemente no pueden ser expresadas en lenguajes de alto nivel. Muchos compiladores
también rinden lenguajes de alto nivel en ensamblador antes de compilar completamente,
permitiendo visualizar el código de ensamblador para depurar [debug] y propósito de
optimización.
Muchos dispositivos integrados son también programados en ensamblador a exprimir la
funcionalidad máxima absoluta fuera de los que es frecuente recursos computacionales muy
limitados, aunque esto esta gradualmente cambiando en algunas áreas como mas chips
poderosos volviendo disponible para el mismo mínimo costo.
http://www.geocities.com/SiliconValley/Haven/2037/documentos/Lenguaje_Ensamblador.htm
ENSAMBLADOR.
Una de las mayores importancias del ensamblador es que uno puede optimizar
al máximo sus programas (tanto tamaño, como velocidad de ejecución). Otra
importancia es la gran velocidad a la que ejecuta el código.
MEMORIA CENTRAL
También denominada memoria principal, es la parte de la CPU de una
computadora donde están almacenadas las instrucciones y los datos
necesarios para que un determinado proceso pueda ser realizado.
Gran rapidez.
Componentes fijos.
Capacidad mediana.
Reutilizable y de acceso directo.
Es una memoria de acceso directo, puede accederse a una de sus celdas con
sólo conocer su posición, para esta memoria el tiempo de acceso es más corto
que las memorias auxiliares, por tanto, los datos que manejan los procesos
deben residir en ella en el momento de su ejecución.
ROMBIOS
ROM DE INICIO
ROM EXTENDIDA
PROM: Permite programarse una sola vez, una vez decididas sus
características e instalada, se convierte en una ROM normal.
SALIDA.
Monitores
Impresoras
Plotters
Graficadores
ENTRADA.
Son los dispositivos periféricos que permiten introducir la información a la
computadora para su procesamiento. Algunos de estos dispositivos son:
Teclado
Mouse
Tabletas gráficas
Lápiz óptico
Entrada de Voz
Pantallas sensibles al tacto
Lectores ópticos
ENTRADA/SALIDA
Son dispositivos que efectúan tanto tareas de entrada como de salida, estos
incluyen:
Discos duros
CD´s
Discos flexibles
1.2 El microprocesador.
Un microprocesador debe contener al menos: una unidad de control, unidad de
aritmética y lógica y algunos registros.
a) REGISTROS GENERALES
b) REGISTROS APUNTADORES (ESP Y EBP).
c) REGISTROS INDICES (ESI Y EDI).
d) REGISTRO DE SEGMENTOS (SS, CS, DS, ES.)
e) REGISTRO APUNTADOR DE INSTRUCCIONES (IP).
f) REGISTRO DE ESTADO (BANDERAS)
g) COLA DE INSTRUCCIONES
h) UNIDAD DE CONTROL DE LA UNIDAD DE EJECUCIÓN
i) BUSES INTERNOS
j) UNIDAD ARITMETICA Y LOGICA (ALU)
g) COLA DE INSTRUCCIONES
1. Suma aritmética.
2. Funciones lógicas AND, OR y XOR.
3. Complemento.
4. Rotación hacia la izquierda o derecha.
Esta unidad es un grupo de circuitos electrónicos encargada de realizar las
operaciones elementales de tipo aritmético (+, -, *, /) y de tipo lógico
(comparaciones), también hace comparaciones alfabéticas, por ejemplo; Soto,
Sánchez.
1.2.1 Buses.
i) BUSES INTERNOS (DATOS, DIRECCIONES).
BUS DE DATOS. Circulan los datos con los que va a trabajar el ordenador,
debe estar conectado a la memoria principal, puesto que en ella se encuentran
almacenados los datos, al banco de registro y por supuesto a la unidad
aritmética y lógica, el bus de datos tiene 8 conectores y es capaz de transportar
8 señales en paralelo, esto significa que el bus de datos puede llevar unidades
de información de 8 dígitos binarios, sólo una unidad cada vez.
1.2.2 Registros.
a) REGISTROS GENERALES
REGISTRO EBP O BASE. Se usa para manipular la pila sin afectar el registro
de segmentos SS, así como para direccionar una matriz de datos en una pila
de memoria. También se direcciona como BP.
Registro de banderas
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
AC VM RF
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
NT IOP IOP OF DF IF TF SF ZF AF PF CF
Modo Implicado
En este modo los operandos son especificados implícitamente en la definición
de la instrucción. Por ejemplo, la instrucción “complemente el acumulador” es
una instrucción de modo implicado debido a que el operando en el registro
acumulador está implicado en la definición de la instrucción.
Ejemplos:
MOV AX, 60
MOV BX, 01A
MOV AX, 083
MOV CX, 2BC
MOV DX, 0123
DIRECCIONAMIENTO DIRECTO
Con el direccionamiento directo, el desplazamiento del segmento de operando
está contenido en la instrucción como una cantidad de 16 bits. Este
desplazamiento se suma al contenido desplazado del registro del segmento de
datos (DS) y se devuelve a la EA de 20 bits, o dirección física real.
Habitualmente, el operando de direccionamiento directo es un rótulo.
Ejemplo:
MOV AX, MYDATA
MYDATA
CONT DIR.
0005
0004
FF 0003
00 0002
0001
0000
AX
1111111100000000
DIRECCIONAMIENTO DE REGISTRO
Transfiere un byte o palabra desde el registro fuente o localidad en la memoria,
hasta el registro o localidad destino en la memoria. Es fácil comprender el
direccionamiento por registro una vez que se aprende los numerosos registros
que hay en los 8086-080486. Los 8086-80286 contienen los siguiente registros
de 8 bits, utilizando con el direccionamiento por registro AH, AL, BH, BL, CH,
CL, DH, y DL.
También contienen los siguientes registros de 16 bits AX, BX, CX, DX, SP, BP,
SI y DI. En los 80380/80486 los registros, ampliados de 32 bits son EAX, EBX,
ECX, EDX, ESP, EBP, EDI y ESI. Pero no se debe mezclar un registro de 8 bits
con uno de 16 bits, uno de 8 bits con uno de 32 bits, o uno de 16 bits con uno
de 32 bits porque no lo permite el conjunto de instrucciones de 8086-80486. La
tabla presenta algunas versiones de instrucción MOV entre registros. Es
importante mostrar todas las variables por las numerosas combinaciones
posibles.
Lenguaje
Operación
ensamblador
MOV AL, BL Copia BL en AL
MOV CH, CL Carga CL en CH
MOV AX, CX Carga CX en AX
MOV SP, BP Carga BP en SP
MOV DS, AX Carga AX en DS
MOV DI, SI Carga SI en DS
MOV BX, ES Carga ES en BX
MOV ECX, EBX Carga EBX en ECX
MOV ESP, EDX Carga EDX en ESP
No se permite (segmento a
MOV ES, DS
segmento)
No se permite ( registro de
MOV CS, AX
segmento )
MOV BL, BX No se permite (tamaño mixtos)
EJEMPLOS
MOV BP, [DX]
LEA AX, [CS]
LEA DI, [SS]
Ejemplo:
MENSAJE1 DB 'EL LENGUAJE ENSAMBLADOR ES', '#'
MENSAJE2 DB 'RAPIDO Y EFICIENTE´','#'
.
.
LEA BX, MENSAJE1
MOV AL,[BX]+4
Ejemplos:
LEA BX MYDATA
MOV SI,25
MOV AX MYDATA [BX] [SI]
Ejemplo:
LEA BX MY DATA
MOV SI, 25
MOV AX MYDATA
Ejemplo:
MOV SI, 4
MOV AL, ARRAY 1 [SI]
LEA BX MYDATA
MOV 51,25
MOV AX MYDATA [BX] [SI]
Internamente el microprocesador tiene 7 registros rotulados A(para el
acumulador );B, C, D, E, F H y L estos registros tiene 8 bits de ancho y puede
acomodar un bvte . el código de operación de una instrucción leída de la
memoria durante el ciclo de fetch es transferido al registro de instrucción. Es
entonces decodificada por el control para determinar la secuencia de micro-
operaciones necesarias ejecutar la instrucción.
1.3 Interrupciones.
Una interrupción es una detensión de la ejecución del microprocesador para
dar oportunidad a la maquina de comunicarse con los dispositivos perifericos.
Puede decirse que una interrupción es el elemento más importante para
ejecutar un programa debido a que estas permiten la interacción entre el
usuario y la maquina.
TIPOS DE INTERRUPCIONES
Recordemos que las interrupciones internas y externas se
inician a partir de señales que ocurren en la CPU. Y esta se
encuentra lista para atender a la interrupción a quien le
interrumpió, pasa el control ala rutina llamada manejador de
interrupciones, esta rutina define la causa de las
interrupciones, proporciona el servicio solicitado y regresa el
control a la CPU para que esta pueda proseguir a lo que estaba
haciendo.
INTERNAS (DEL PROGRAMA)
INTERRUPCIONES EXTERNAS
INT 1AH
La interrupcion de BIOS, 1AH, permite leer y escribir la fecha y hora actuales
desde y al reloj del sistema. La tabla siguiente es un listado de las opciones
disponibles con la interrupción del BIOS tipo 1AH.
INTERRUPCION 1AH
Valor AH Función Entrada Salida
CX--Bytes superiores del reloj
AH=0 Lee inicializacion reloj actual DX--Bytes inferiores del reloj
AL--0,si temporizador no ha pasado 24 horas
CX= Bytes superiores del reloj
AH=1 Inicializa reloj actual
DX= Bytes inferiores del reloj
CH--BCD horas
AH=2 Lee hora--reloj de tiempo real CL--BCD minutos
DH--BCD segundos
BCD horas
CH=
BCD minutos
CL=
AH=3 Inicializa hora--reloj de tiempo real BCD segundos
DH=
1--hora del diaundos
DL=
0--hora estandar
CH--BCD siglo
CL--BCD año
AH=4 Lee fecha-- reloj de tiempo real.
DH--BCD mes
DL--BCD dia
CH= BCD siglo
CL= BCD año
AH=5 Inicialioza Fecha--reloj de tiempo real
DH= BCD mes
DL= BCD dia
CH= BCD horas
AH=6 Inicializa alarma (hasta 23:59:59) CL= BCD minutos
DH= BCD segundos
INT 10H
Muchas veces cuando se programa, la entrada o salida de la computadora
necesita ser mostrada en la pantalla del monitor. Con frecuencia esto
requerirá una simple operación de borrado de pantalla; en otras ocasiones se
podrá desear cambiar los colores o atributos de la pantalla. El control de la
pantalla puede conseguirse fácilmente con las interrupciones del BIOS tipo 10H
. La tabla siguiente es un listado de las posibles variaciones programables
con las interrupciones tipo 10H.
INTERRUPCION 10H
Valor
Función Salida Entrada
AH
Manipulacion de caracteres
Interfaz de gráficos
BH = Paleta ID (0-127)
BL = Color para paleta ID
0--Fondo (0-15)
AH=11 Selecciona paleta colores
1--paleta
0--Verde(1),rojo(2),amarillo(3)
1-- Cyan (1), magenta (2),
DX= Fila (0-199)
AH=12 Dibuja punto en pantalla CX= Columna (0-319/639)
AL= Color del punto
DX= Fila (0-199)
AH=13 Lee informacion punto CX= Columna (0-319/639)
AL= Valor del punto
Salida teletipo ASCII
AH=16 Reservado
AH=17 Reservado
AH=18 Reservado
INTERRUPCION 21H
Valor
Función Entrada Salida
AH
Espera y visualiza caracter de teclado
AH = 1 AL - Cacter introducido
con comprobación CTRL-BREAK
Visualiza caracter de teclado con
AH = 2 DL = Caracter a visualizar
comprobación CTRL-BREAK
DL= 0
AL= 0
AH=2E Verifica estado(inicializa)
0;verifica off
1;verifica on
Número de interrupción
AH=35 Direccion interrupcion (lee) AL=
ES:BX--apunta a direccion vector
DL= Unidad (0--implicita,1--A,2--B,etc.)
AX--sectores/apiñamiento(FFFF si invalido)
AH=36 Disco espacio disponible BX--Número apiñamiento libres
CX--Bytes por sector
DX--Número total de apiñamientos
AH=39 Hace directorio DS:DX Dirección de cadena para directorio
AH=3A Eliminar directorio DS:DX Dirección de cadena para directorio
AH=3B Cambia directorio DS:DX Dirección de cadena para nuevo directorio
DS:DX Dirección de cadena para archivo
AH=3C Archivo (crea) AX--Retorno maipula archivo
CX= Atributo archivo
La primera cosa de todas, ¿qué son las interrupciones?, bien, las interrupciones son un
"mecanísmo" por medio del cual hacemos que la CPU deje la tarea en la que estaba para que
se vaya a ocupar de otra cosa distinta, es decir, es una forma de llamar la atención de la CPU
de tal forma que cada dispositivo cuando necesita ser atendido por la CPU, emite una
interrupción o señal haciendo que la CPU vaya a atenderla de inmediato. Esto es
importantísimo ya que de no existir interrupciones, la CPU debería de ir preguntando, cada
cierto tiempo, a los dispositivos para ver si necesitan de su intervención y como podeis
suponer, eso significaría lentitud, mucha lentitud.
Por tanto, quedaros con que las interrupciones sirven para controlar el hardware, ya que son
las que llaman a la CPU cuando este, el hardware, necesita la intervención de la misma.
Seguro que alguno se ha preguntado, "si cuando llamamos a una interrupción se ejecuta una
determinada rutina...¿dónde narices se encuentra esta rutina?, es más, ¿cómo sabe nuestra
CPU dónde encontrarla?."
Bien, la respuesta a estas dos preguntas (y muchas más) se encuentra en la tabla de vectores
de interrupción. Dicha tabla es una estructura que se crea durante la inicialización del
ordenador y se coloca, en el principio de nuestra memoria (segmento 0 y desplazamiento 0).
Dicha estrucutura ocupa y de forma justa 1Kb, ya que dispone de 256 entradas de 4 bytes cada
una. Lo importante de todo esto es que, dicha estructura, almacena la dirección, en memoria,
de las distintas rutinas que van ligadas a las distintas interrupciones, de tal modo que cuando
invocamos, mediante interrupción software, o se invoca, mediante hardware, una interrupción,
lo que se hace es utilizar un índice que va ligado a la interrupción, de tal manera que, con dicho
índice, se acude a la tabla de vectores de interrupción para que el sistema encuentre la
dirección de la rutina en dónde se encuentra el verdadero tratamiento a la interrupción, es
decir, si se produce la interrupción x, lo que se hace es acudir a la tabla con el índice x para
encontrar la entrada (recordar que eran 256 entradas con 4 bytes cada una) que contiene la
dirección en memoria de la rutina que sirve para tratar a la interrupción de índice x.
Como cada entrada es de 4 bytes, es fácil adivinar que dichos 4 bytes forman la dirección, ya
que 2 de esos bytes se utilizan como segmento y los otros 2 como desplazamiento, total, que
ya tenemos la dirección de memoria con la rutina que hay que utilizar.
Ahora pensar por un momento que somos nostros los que, conociendo la dirección de memoria
de una de esas rutinas, cambiamos dicha rutina por una nuestra para que al producirse una
determinada interrupción ocurra lo que a nosotros nos interese...Como podéis observar, las
posibilidades son muy interesantes, tan sólo tenéis que mirar el efecto de luz del Visualizator
v:2.0 (ir a sencción de Bájate algo interesante), dicho efecto se consiguió poniendo en la rutina
que se encargaba de controlar la interrupción de reloj del sistema, el código necesario para el
efecto de luz, con lo que al producirse la interrupción de reloj se ejecutaba también el código
del efecto y como la interrupción de reloj se produce contínuamente, los efectos son muy
buenos, vamos, que si queréis hacer ese efecto acudiendo a un bucle While lo llevais claro :-(.
Espero haber despertado, con este artículo, el interés por saber dominar las interrupciones. Si
queréis saber más, tan sólo teneis que buscar información en libros sobre programación de
dispositivos tales como ratón, VGA, etc, en los que se acude siempre a ellas. Ahora mismo
estoy pensando el hacer un artículo sobre como controlar el ratón así que puede que aparezca
en esta actualización de la revista, además, es la mejor forma de entender las interrupciones
¿o no?. ;).
http://usuarios.lycos.es/macedoniamagazine/varios2.htm
1.3.1 Hardware.
Las interrupciones internas son generadas por ciertos eventos que surgen
durante la ejecución de un programa.
http://members.tripod.com/~MoisesRBB/unidad6.htm
1.3.2 Software.
Ver archivo: Interrupciones 2005.pft
Por otro lado las interrupciones del SOFTWARE no interrumpen algo si no son
variantes de las rutinas las cuales pueden invocarse a voluntad y son
controladas por un programa en forma sincrónica o sea, que se conoce con
todo lo relacionado con su ejecución puesto que el programa controla el
momento y la manera en que son llamadas mediante la secuencia de
instrucciones CALL y RET, cuando un programa ejecuta una instrucción CALL
se conoce previamente la dirección de la rutina llamada de tal forma que la
CPU pueda saltar al código, que se encuentra ahí y ejecutarle. En la mayoría
de los casos el programa TLINK.EXE determina y asigna las direcciones de las
rutinas es claro que el enlazador no puede saber de antemano donde se
encuentran las rutinas MS DOS y del BIOS en la memoria de la otra cuando un
programa ejecuta una instrucción INT # de interrupción en la CPU
automáticamente accesa la memoria baja a fin de obtener el desplazamiento
La diferencia entre ambas es que las interrupciones del sistema operativo son
más fáciles de usar pero también son más lentas ya que estas interrupciones
hacen uso del BIOS para lograr su cometido, en cambio las interrupciones del
BIOS son mucho más rápidas pero tienen la desventaja que, como son parte
del hardware son muy específicas y pueden variar dependiendo incluso de la
marca del fabricante del circuito.
Interrupción 21H
Sintaxis:
Int 21H
Esta interrupción tiene varias funciones, para accesar a cada una de ellas es
necesario que el el registro AH se encuentre el número de función que se
requiera al momento de llamar a la interrupción.
Método FCB
0FH Abrir archivo
14H Lectura secuencial
15H Escritura secuencial
16H Crear archivo
21H Lectura aleatoria
22H Escritura aleatoria
Handles
3CH Crear archivo
3DH Abrir archivo
3EH Cierra manejador de archivo
3FH Lectura desde archivo/dispositivo
40H Escritura en archivo/dispositivo
42H Mover apuntador de lectura/escritura en archivo
Función 02H
Uso:
Registros de llamada:
AH = 02H
DL = Valor del caracter a desplegar.
Registros de retorno:
Ninguno
Función 09H
Uso:
Ninguno.
Función 40H
Uso:
Función 01H
Uso:
Con esta función es muy sencillo leer un caracter del teclado, el código
hexadecimal del caracter leído se guarda en el registro AL. En caso de que
sea un caracter extendido el registro AL contendra el valor de 0 y será
necesario llamar de nuevo a la función para obtener el código de este
caracter.
Función 0AH
Uso:
Función 3FH
Uso:
Función 0FH
Uso:
Función 14H
Uso:
Función 15H
Uso:
Función 16H
Uso:
Función 21H
Uso:
Esta función lee el registro especificado por los campos del bloque actual y
registro actual de un FCB abierto y coloca la información en el DTA (área
de transferencia de disco o Disk Transfer Area).
Función 22H
Uso:
Escribe el registro especificado por los campos del bloque actual y registro
actual de un FCB abierto. Escribe dicha información a partir del contenido
del DTA (área de transferencia de disco).
Función 3CH
Uso:
Valor Atributos
00H Normal
02H Escondido
04H Sistema
06H Escondido y de sistema
Función 3DH
Uso:
Función 3EH
Uso:
Función 3FH
Uso:
Función 40H
Uso:
Función 42H
Uso:
Valor de AL Método
00H A partir del principio del archivo
01H A partir de la posición actual
02H A partir del final del archivo
Interrupción 10H
Sintaxis:
Int 10H
Esta interrupción tiene diversas funciones, todas ellas nos sirven para
controlar la entrada y salida de video, la forma de acceso a cada una de las
opciones es por medio del registro AH.
Función 02H
Uso:
Función 09H
Uso:
Función 0AH
Uso:
Función 0EH
Uso:
Interrupción 16H
Sintaxis:
Int 16H
Función 00H
Uso:
El código de barrido fué creado para manejar las teclas que no tienen una
representación ASCII como [ALT], [CONTROL], las teclas de función,
etc.
Función 01H
Uso:
Interrupción 17H
Sintaxis:
Int 17H
Función 00H
Uso:
Función 01H
Uso:
Función 02H
Uso:
Introducción
Todo el semestre hemos usado interrupciones para hacer llamado a servicios de DOS y
BIOS; hasta ahora, principalmente las hemos visto como formas de llamar al sistema
operativo.
Interrupciones de hardware: son las más primitivas y origen del concepto. Están
diseñadas para que el procesador pueda atender a los dispositivos aún a mitad de
la ejecución de un programa que no está detectándolos.
Interrupciones de software: permiten al software emular las operaciones que se
hacen al atender el hardware. También permiten contener una interfase universal
a los servicios del sistema operativo, que son independientes de las versiones del
sistema operativo.
Cuando un dispositivo requiere atención del CPU, le avisa por medio de una señal
(electrónica) que llamamos "Interrupción". Esta señal físicamente llega a un pin del
CPU; cuando esto ocurre, el CPU termina la instrucción que estaba ejecutando, salva en
la pila la dirección actual (CS, IP) para poder continuar más adelante en el punto donde
se quedó, y salta a ejecutar el código de atención de la interrupción, que generalmente
es parte del sistema operativo. Dado que el código que atiende la interrupción puede
encontrarse en distintos lugares de memoria, se requiere algún mecanismo para que el
CPU encuentre eficientemente donde continuar la atención de la interrupción. Este
mecanismo es conocido como "tabla de interrupciones", y se basa en reconocer por un
código a cada interrupción, el cual será usado para la búsqueda en esta tabla. Esta tabla
de interrupciones la encuentra el 80x86 al inicio de la memoria, en el primer 1 Kb. Está
formada por un arreglo de 256 direcciones, cada una de 32 bits, pues contiene al
segmento y al desplazamiento (en orden inverso, como es costumbre en Intel). De modo
que si se recibe el código de interrupción 0, se consulta la información en la localidad
0:0, y de ahí se obtienen el segmento y el desplazamiento correspondientes. Si se recibe
el código de interrupción 8, se consulta la información en la localidad 0:20h (20h = 32 =
8 por 4, dado que cada entrada en el arreglo tiene 4 bytes), y de ahí se ejecuta el código
correspondiente. Al terminar el código de atención de la interrupción, ejecuta una
instrucción IRET, que regresa el punto de ejecución a donde se había quedado,
Funcionan de un modo similar a las de hardware, solamente que en vez de que un
dispositivo envíe la señal, lo hace el programa utilizando la instrucción INT. Esta
instrucción causa que se ejecute todo el proceso anterior, pero señalada por un
programa.
Un programa residente (Terminate and Stay Resident, de ahí las siglas TSR
comúnmente usadas) consiste en que un programa se carga en memoria, se ejecuta,
prepara la ejecución de la segunda sección (por medio de un control fino sobre las
interrupciones), y libera solamente la memoria del código de preparación. De este
modo, una sección de su código queda "latente", en espera de ser disparado por un
evento: generalmente, una interrupción.
Programación de TSRs
Para programar un TSR, utilizaremos una serie de servicios de interrupciones que nos
facilitan la capacidad de dejar una sección del programa activa, así como cambiar la
dirección a la que apunta una interrupción. Resumiendo, tendremos dos grandes
secciones en un programa residente:
Cuando llamamos al servicio 4Ch de la INT 21h, toda la memoria que ocupó nuestro
programa se marca como libre y el sistema operativo puede reutilizarla. Esto sería
desastroso en el caso de un programa residente, pues el código que atiende
interrupciones podría sobreescribirse, con resultados impredecibles. Por ello, se debe
terminar el programa de modo que deje ocupada su memoria. Para ello, existen varias
opciones:
INT 08h - es llamada por el reloj del sistema, 18.2 veces por segundo, y entre
otras cosas lleva el tiempo de BIOS. Podemos interceptarla (no sustituirla) para
que nuestro programa realice algún proceso periódicamente.
INT 09h - es llamada por el teclado, cada vez que se recibe una tecla.
INT 0Ch - de software, es llamada por la interrupción del reloj.
Existen algunas precauciones adicionales que tomar en TSRs, sin embargo, como no
siempre son requeridas, se hace la referencia al PC Interno y otros libros de la
bibliografía.
http://www.sinergia-web.com.mx/clases/asm9708/Temas/clase26.htm
Ejemplos
1. Programa residente muy simple
PushA Macro
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH DS
PUSH ES
EndM
POPA Macro
POP ES
POP DS
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
EndM
; Segmento de código
Code Segment
Assume CS:Code
Assume DS:Code
Assume SS:Code
Assume ES:Code
ORG 100h
Start:
JMP Inicio
; Variables
BanderaLleno DB 0
Inicio:
PUSH DS
PUSH CS
POP DS
CLI
PUSH ES
XOR AX,AX
MOV ES,AX
MOV DI,36 ; 9*4 ; Pues estamos interceptando la interrupción 9
(reloj)
LEA BX,ParteRes
MOV AX,ES:[DI]
MOV OldInt,AX
MOV ES:[DI],BX
MOV AX,ES:[DI+2]
MOV OldInt+2,AX
MOV ES:[DI+2],DS
POP ES
STI
LEA DX,Fin2
INT 27h
RET
Fin2:
Code EndS
END Start
http://www.sinergia-
web.com.mx/clases/asm9708/programa/reside.asm
.CODE
PushA Macro
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH DS
PUSH ES
EndM
POPA Macro
POP ES
POP DS
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
EndM
ORG 100h
Start: JMP Inicializa
; Variables
Horas DB ?
Minutos DB ?
Segundos DB ?
PMFlag DB 0
DivHi DW 0
DivLo DW 0
ResultHi DW 0
ResultLo DW 0
Actual DB 0
Divisor DB 0
Contador DB 0
; Rutina residente!!!
; Podría ser PROC
Inicializa:
; Ajustar DS
PUSH DS
PUSH CS
POP DS
PUSH ES
; Apuntar ES al segmento 0
XOR AX,AX
MOV ES,AX
; Muy importante: Desactivar Interrupciones cuando vamos a
ajustar el vector
CLI
LEA BX,Inicio
MOV AX,CS
; Ajustar el vector de interrupción del Reloj: en BX el
desplazamiento de la
; rutina que atiende al reloj, en AX el segmento.
MOV ES:[1Ch*4],BX
MOV ES:[1Ch*4+2],AX
STI
; Restaurar ES
POP ES
; DS:DX apuntan al final de la zona que va a quedar residente
LEA DX,Inicializa
INT 27h ; Terminar pero dejar parte residente
END Start
http://www.sinergia-
web.com.mx/clases/asm9708/programa/relojres.asm
1.4 Estructura de un programa en ensamblador.
Un programa en lenguaje ensamblador se compone de las siguientes partes:
Área de comentarios
Definición del modelo de memoria
Área de datos
Cuerpo del programa
El área de comentarios sirve para incluir comentarios acerca del programa que
se está elaborando, comienza con la directiva .COMMENT y el comentario es
colocado entre dos caracteres ‘*’.
La definición del modelo de memoria es la parte donde se indica que tipo de
código se va generar (16 o 32 bits). En este trabajo sólo se escribirán
programas ejecutables .COM, por lo que siempre se usa la directiva .MODEL
TINY.
El área de datos es el lugar donde deben ser declaradas las constantes y
variables del programa. Las variables son declaradas después de la directiva
.DATA y las constantes después de .CONST.
En el cuerpo del programa es donde se colocan las instrucciones en lenguaje
ensamblador que se encargarán de realizar las tareas deseadas. El cuerpo del
programa comienza con la directiva .CODE y termina con la directiva END.
Esta parte corresponde al Begin y End de un programa en lenguaje Pascal.
Adicionalmente se debe indicar un punto de entrada al programa. El punto de
entrada se indica por medio de una etiqueta antes de la primer instrucción real
del programa. En el ejemplo anterior el punto de entrada es INICIO: y el punto
final de las instrucciones se indica por medio de la instrucción END INICIO.
Cuando se requiere comentar las instrucciones de un programa, se debe
colocar un punto y coma (;) y así el ensamblador interpreta todo lo que sigue
como un comentario de una sola línea. Si requiere comentarios de más de una
línea puede usar la directiva .COMMENT.
http://www.monografias.com/trabajos11/lenen/lenen.shtml
FORMATO DE INSTRUCCIONES.
· Nombre de etiqueta
· Nombre de constantes
· Nombre de variables
· Nombre de procedimiento
· Nombre de macro
CAMPO OPERACION:
El campo de operación contiene un mnemotécnico para una instrucción real
del microprocesador. El mnemónico de operación hace el código más fácil de
leer y comprender y es solamente una tabla de conversión interna del valor
binario de código máquina real. Una operación o nemotécnico, puede
representar una instrucción máquina, macroinstrucción o pseudo-operación.
CAMPO OPERANDO :
El campo operando contiene la posición o posiciones donde están los datos
que van hacer manipulados por la instrucción de la operación, si la instrucción
requiere uno o dos operados. Los operados están separados de la instrucción
por al menos un espacio en blanco. Si hay operaciones que no requieren
operados.
MOV AX, 8
Este es un ejemplo de operando inmediato. Aquí, el dato a ser manipulado
se incluye como operando fuente y se desplaza al registro AX, u operando
destino.
CAMPO COMENTARIO:
El campo comentario es él ultimo de los cuatro campos y puede ser uno de
los mas útiles. El campo comentario se utiliza para documentar internamente el
código fuente del ensamblador. Los comentarios son ignorados por el
ensamblador y son útiles solo al listar el código fuente. Si un comentario se
incluye con una instrucción de operación entonces debe estar separado del
último campo por al menos un espacio en blanco y comenzar con un punto y
coma (;).
Los delimitadores que podemos usar en cada una de las líneas son:
“FORMATO DE UN PROGRAMA”
EL FORMATO EXTERNO
El formato externo esta formado por varios comandos clave que permiten
establecer el entorno operativo del programa.
El método que utiliza los modelos de memoria son más fáciles de usar, pero
las definiciones de segmento completo ofrecen mayor control de la tarea del
lenguaje ensamblador.
USO DE MODELOS:
PROGRAMA QUE DESPLIEGA UNA CADENA EN LA PANTALLA
; PROGRAMA EJEMPLO
STACK SEGMENT PARA ‘STACK’
DB 64 DUP
STACK ENDS
DATA SEGMENT PARA 'DATA'
MESAGE DB ‘AHORA LO QUE ABUNDA ES EL AMOR’,’$’
DATA ENDS
CODE SEGMENT PARA CODE
MAIN PROC FAR
ASSUME CS: CODE, DS: DATA, ES: DATA, SS: STACK
PUSH DS
SUB AX,AX
PUSH AX
MOV AX, DATA
MOV DS, AX
MOV ES, AX
; RUTINA PARA IMPRIMIR LA CADENA
LEA DX, MESAGE
MOV AH, 09
INT 21H
RET
MAIN ENDP
CODE ENDS
END
C:\TASM Ejemplo1
C:\TLINK Ejemplo1
Ya hemos estudiado algunas partes del programa en lenguaje ensamblador. Sólo nos
falta conocer la parte más importante: las instrucciones. Pero antes de eso, veremos cual
es la estructura básica de un algoritmo en código ensambladora con la finalidad de ener
claro cual es la estructura de todos los elemento que acabamos de ver. Esto lo veremos
más a fondo cuando veamos todo lo concerniente a la programación.
Esta estructura contiene los siguientes elementos o partes que deben ser codificadas:
- Comentario descriptivo del programa (opcional, pero recomendable)
- Definir el microcontrolador que se usará (con las directrices LIST e INCLUDE).
- Introducir las opciones de compilación (que serán vistas más adelante)(opcional)
- Establecer las constantes que se usarán (con la directriz EQU).
- Reservar espacios de memoria (directriz RES) (si es necesario)
- Configurar los puertos
- Desarrollar el programa
- Poner comentarios
Y su estructura es:
Normalmente las columnas son separadas por una tabulación. El espacio mínimo entre
dos columnas es de un carácter, que puede ser un espacio en vez de una tabulación.
http://usuarios.lycos.es/sfriswolker/pic/seis.htm
http://www.pablin.com.ar/computer/cursos/varios/introasm.htm
http://members.tripod.com/~MoisesRBB/arq80x86.html
http://victorsanchez2.net/tutoriales/asm/asm001.htm
ADD suma
MPY multiplicar
SUB resta
DIV dividir
STO almacenar
Las palabras nemotécnicas son mucho más fáciles de recordar que las
secuencias de dígitos 0 y 1. Una instrucción típica en ensamblador puede ser:
ADD X, Y, Z
Por ejemplo:
y 1010,
z por 1011.
http://www.monografias.com/trabajos15/el-software/el-software.shtml#
1.4.5 Directivas.
Directivas del lenguaje ensamblador
Estos también usualmente tienen un macro lenguaje integrado para hacer fácil generar piezas
complejas de código o datos.
http://www.geocities.com/SiliconValley/Haven/2037/documentos/Lenguaje
_Ensamblador.htm
TITLE Texto.
DIRECTIVA ASSUME.
OPERACION OPERANDO
ASSUME SS:nompila, DS:nomsegdatos, CS: nomsegcodigo,. .
.
http://www.itlp.edu.mx/publica/tutoriales/ensamblador/tem5_1_.htm
DIRECTIVAS SIMPLIFICADAS DE
SEGMENTOS
Los ensambladores de MicroSoft y de Borland proporcionan algunas
formas abreviadas para definir segmentos. Para usar estas
abreviaturas, inicialice el modelo de memoria antes de definir algún
segmento. El formato general (incluyendo el punto inicial) es:
.STACK [tamaño]
.DATA
.CODE [nombre]
page 60,132
TITLE P04ASM2 (EXE) Operaciones de mover y sumar
;-------------------------------------------------------------------------
.MODEL SMALL
.STACK 64 ;Se define la pila
.DATA ;Se definen los datos
FLDA DW 250
FLDB DW 125
FLDC DW ?
;-------------------------------------------------------------------------
http://www.itlp.edu.mx/publica/tutoriales/ensamblador/tem5_2_.htm
http://www.monografias.com/trabajos11/lenen/lenen.shtml
1.5 Procedimiento de ensamble, enlace y ejecución.
Proceso de ensamble y ligado de un programa
Este proceso es muy sencillo y se describe a continuación:
Si está trabajando en MS-DOS siga estos pasos:
1.- Escriba el programa, tal y como aparece en el listado
anterior, usando su editor de texto preferido.
2.- Guárdelo con algún nombre y la extensión .ASM.
3.- En el símbolo del MS-DOS escriba lo siguiente
C:\PASS32\BIN\>PASS32 Nombre.ASM –t <Enter>
4.- Ejecute el programa .COM que se genera.
Para probar el programa abra una ventana de MS-DOS y
seleccione el programa haciendo doble clic sobre el icono.
http://www.monografias.com/trabajos11/lenen/lenen.shtml
[ ] = Son opcionales.
LINK=Microsoft
TLINK=Borland
DIRECTIVAS DE ENSAMBLE
El lenguaje ensamblador permite usar diferentes enunciados que permiten
controlar la manera en que un programa ensambla y lista, llamados directivas.
Ejemplo :
TEST1 DW 1234
TEST2 DW 0ABCDH
TEST3 DW 1,22,333,4444
TEST4 DW 23,112
TEST5 DW 23 DUP (100H)
TEST6 DW 50 DUP ( ?)
DD(Definir doble palabra).- Se utitliza para definir una variable o tabla para
inicializar una función de memoria.
Ejemplo :
CIELO DD 0FFFFFFFFH
ROSA DD 0H
FLOR DD 1,22,333,4444,55555
SUMA DD 45H + 23H
REALES DD 2.17654
DECIMAL DD 4.567E12
TABLA DD 50 DUP (03CH)
FRACC DD 0.12345
DQ (Definir cuadruple palabra).-Iniacializa 4 palabras. Acepta valores de
constantes,numéricos,tablas.
Ejemplo :
TABLA DQ 100,2000,30000,400000
MULTI DQ 1000 DUP (45.678)
SUMA DQ -6.345E -5 + 5.0001E45
LARGO DQ 7989*12H
Ejemplo :
TABLA DT 100,2000,30000,500000
MULTI DT 1000 DUP (45.678)
SUMA DT -6.345 E -5 + 5,0001E45
LARGO DT 7989*12
DBIT (Bit).- Define tipo de bits.
TEST1 DBIT 0001B
TEST2 DBIT 011001B
TEST3 DW 1B,0B,1B
TEST4 DW 0B
Ejemplo :
SUMA EQU CONTADOR
DIEZ EQU 10
...
INC SUMA
ADD SUMA,DIEZ
ALPHA.- Ordena alfabeticamente los segementos. Se coloca al inicio del
programa para listar los elementos en forma ordenada.
Formato :
Programa que llama :
DSEG1 SEGMENT PARA ‘CODE’
PUBLIC CONVAL
...
CONVAL DW ?
DSEG1 ENDS
Subprograma llamado : EXTRN (NOM : TIPO )
EXTRN CONVAL : FAR
DSEG2 SEGMENT PARA ‘CODE’
...
MOV
...
DSEG2 ENDS
ORG.- Nos permite indicar la dirección especfica de segementos de memoria.
Sirve para cambiar la dirección inicial de localidades, dandole una dirección
especifica de los segmentos.
Ejemplo :
ORG 0 00
FLDX DB ? 01
FLDY DW ? 02
FLDY2 DB ? 04
ORG $+5
COMMENT.- Sirve para delimitar comentarios.
Ejemplo :
COMMENT DELIMITADOR DE COMENTARIO
...
DELIMITADOR DE COMENTARIO
Ejemplo :
GROUP GROUP NOM-SEG1SEG2
SEG1 SEGMET PARA ‘DATA’
ASSUME DS : GROUPX
...
SEDG1 ENDS
SEG2 SEGMENT PARA ‘DATA’
ASSUME DS : GROUPX
...
SEG ENDS
LABEL.- Redefine el atributo de una variable.
Formato :
Nombre LABEL Especificador
REDEFB DW 2532H
REDEFW LABEL WORD
FIELDB DB 25H
DB 32H
.
.
.
MOV AL,REDEFB
MOV BX,REDEFW
Formato :
NOMSEGTO SEGMENT ; CODE
NOMPROC PROC FAR/NEAR ; UN PROCEDIMIENTO
... ;
NOMPROC ENDP ; DENTRO
NOMSEGTO ENDS ; DEL SEGMENTO DE CÓDIGO
Formato :
NOMBRE SEGMENT (OPCIONES) ; INICIA EL SEGMENTO
.
.
NOMBRE ENDS ; FIN DE SEGMENTO
END.-Indica fin de programa.
Formato :
END
Formato :
ENDS
Formato :
ENDP
ASSUME.- Se utiliza para direccionar cada uno de los registros del segmento
a la dirección del segmento (DS,SS,ES,FS,CS).
Formato :
ASSUME CS : CODESG, DS. :DATASG, SS : STACK ;... ES : DATASG
Formato :
.LIST, .XLIST
Ejemplo:
.XLIST
MYCODE SEGMENT PARA ‘CODE’
MYPROC PROC FAR
ASSUME CS : MYCODE, DS : MYDATA,SS : STACK
PUSH
SUB
PUSH
PAGE.-Directiva para listar, inicializa la longitud y achura de cada página de
listado.
Formato:
PAGE [LONGITUD] , [ANCHO]
Ejemplo:
PAGE 60,132
Formato :
TITLE (cadena)
Ejemplo:
TITLE PROGRAMA EJEMPLO
SUBTTL CHEQUEO DE CODIGOS DE ERROR
STACK SEGMENT PARA STACK
DB 64 DUP (´MIPILA´)
STACK ENDS
....
FUNCIONAMIENTO INTERNO.
Enseguida se ilustra un ejemplo muy claro de cómo sería un programa en
Lenguaje Ensamblador.
Para sumar 5+ 7.
CARGA_AC Dirección
Donde: CARGA_AC = al nombre de la instrucción.
Dirección =celda de memoria cuyo valor queremos llevar al
acumulador
CODIGO LONG. DE LA
INSTRUCCIÓN
INTERNO INSTRUCCIÓN
CARGA_AC 21 2
GUARDA_AC 96 2
SUMA 57 2
RESTA 42 2
Ahora escribiremos el programa en forma tabular. En la parte izquierda del
renglón pondremos la instrucción mnemónica seguida de la dirección a la que
haga referencia, luego pondremos su equivalente en el código interno extraído
del diccionario y, por último, describiremos el renglón para lo que sigue
suponemos que la celda 21 contiene un 5 y que la celda 22 contiene un 7.
Cod. 21 21 57 22 96 23 70 05 07 ¿ ….
Dir.
10 11 12 13 14 15 16 …. 21 22 23 ….
Mem.
Este movimiento de datos está sujeto a reglas y restricciones. Algunas de ellas son las
que se citan a continuación.
Es posible mover bloques de datos por medio de las instrucciones movs, que copia una
cadena de bytes o palabras; movsb que copia n bytes de una localidad a otra; y movsw
copia n palabras de una localidad a otra. Las dos últimas instrucciones toman los valores
de las direcciones definidas por DS:SI como grupo de datos a mover y ES:DI como
nueva localización de los datos.
Para mover los datos tambien existen las estructuras llamadas pilas, en este tipo de
estructuras los datos se introducen con la instrucción push y se extraen con la
instrucción pop
En una pila el primer dato introducido es el último que podemos sacar, esto es, si en
nuestro programa utilizamos las instrucciones:
PUSH AX
PUSH BX
PUSH CX
Para devolver los valores correctos a cada registro al momento de sacarlos de la pila es
necesario hacerlo en el siguiente orden:
POP CX
POP BX
POP AX
Para la comunicación con dispositivos externos se utilizan el comando out para mandar
información a un puerto y el comando IN para leer información recibida desde algun
puerto.
OUT DX,AX
IN AX,DX
http://usuarios.lycos.es/patricio/ensam/ensam2.htm
La orden MOV.
MOV AX,BX
MOV AX,DS
MOV ES,AX
MOV DX,AX
MOV AL,DH
Como se ve, no se puede realizar MOV AL,BX, ya que en AL no cabe BX
el caso de:
MOV AX,0FEA2h
MOV BL,255
MOV DH,01110101b
para representar un número decimal, se pone una 'd' al final (p.ej., 10d)
MOV AX,[BX]
MOV [AX],CX
Muchas veces, se utiliza Word Ptr o Byte Ptr, que aclaran el tamaño a
transferir:
MOV AX,[BX+3]
MOV [BP+SI],AH
Y para acabar este apartado, he aquí una tablilla de ejemplos sobre MOVs que se
pueden hacer:
MOV DX,DATO1
MOV DATO2,DX
XCHG AX, BX
DATOS SEGMENT
TABLA DB 2,3,5,8,16,23
DATOS ENDS
CODIGO SEGMENT
MOVE BX, OFFSET TABLA ; Inicializa BX con la dirección donde
comienza la tabla
MOVE AL, 5
XLAT TABLA
CODIGO ENDS
2.7.2 Pila.
Instrucciones para la pila
La pila es un grupo de localidades de memoria que se reservan con la finalidad de proporcionar
un espacio para el almacenamiento temporal de información.
La pila de los programas es del tipo LIFO (Last In First Out, Ultimo en entrar, Primero en salir).
Para controlar la pila el microprocesador cuenta con dos instrucciones básicas: Push (Meter) y
Pop (sacar).
El formato de estas instrucciones es el siguiente:
Push operando
Pop operando
Cuando se ejecuta la instrucción Push, el contenido del operando se almacena en la ultima
posición de la pila.
Por ejemplo, si AX se carga previamente con el valor 5, una instrucción Push AX almacenaría
el valor 5 en la ultima posición de la pila.
Por otro lado la instrucción Pop saca el último dato almacenado en la pila y lo coloca en el
operando.
Siguiendo el ejemplo anterior, la instrucción Pop BX obtendría el número 5 y lo almacenaría en
el registro BX.
El siguiente ejemplo muestra como implementar la instrucción XCHG por medio de las
instrucciones Push y Pop. Recuerde que la instrucción XCHG intercambia el contenido de sus
dos operandos.
.COMMENT
Programa: PushPop.ASM
Autor: Juan Carlos Guzmán C.
Descripción: Este programa demuestra el uso de las instrucciones para el manejo de la pila,
implementando la instrucción XCHG con Push y Pop
*
.MODEL tiny
.CODE
Inicio: ;Punto de entrada al programa
Mov AX,5 ;AX=5
Mov BX,10 ;BX=10
Push AX ;Pila=5
Mov AX,BX ;AX=10
Pop BX ;BX=5
Mov AX,4C00h ;Terminar programa y salir al DOS
Int 21h ;
END Inicio
END
Ejemplos: pop ax
pop pepe
Ejemplo: push cs
Sintaxis: POPF
Indicadores: OF DF IF TF SF ZF AF PF CF
x x x x x x x x x
Traslada al registro de los indicadores la palabra almacenada en la cima de la
pila; a continuación el puntero de pila SP se incrementa en dos.
Sintaxis: PUSHF
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
http://meltingpot.fortunecity.com/uruguay/978/libro/04.html
LA PILA
son PUSH y POP. La orden PUSH empuja una variable a la pila, y la orden POP
"quiero sacar el valor de DX que he metido antes y que fue el cuarto que
;y lo coloca en AX.
la pila.
Se puede operar con esta instrucción con los registros AX, BX, CX, DX,
SI, DI, BP, SP, CS, DS y ES; sin embargo no se puede hacer un POP CS,
aunque sea un gasto inútil de código, tiene su aplicación, por ejemplo, para
;de la pila.
Y esto es lo que hace un POP BP, simplemente. Para ver lo que hace un PUSH
SUB SP,2
MOV BP,SP
Como última recomendación, hay que tener bastante cuidado con los PUSH
que lo que se saca es lo que se tiene que sacar. La pila bien aprovechada
y menos tamaño.
respectivamente.
2.7.3 Matemáticos.
Instrucciones aritméticas
Las cuatro operaciones aritméticas básicas son suma, resta, multiplicación y división.
La mayoría de las computadoras proporcionan instrucciones para
las cuatro operaciones. Algunas computadoras pequeñas sólo tienen las instrucciones
suma y, tal vez, resta. La multiplicación y la división deben generarse mediante
subrutinas del software. Las cuatro operaciones aritméticas básicas son suficientes para
formular soluciones a problemas científicos cuando se expresan en términos de métodos
de análisis numérico.
NOMBRE MNEMONICO
Incrementar INC
Decrementar DEC
Sumar ADD
Restar SUB
Multiplicar MUL
Dividir DIV
Sumar con acarreo ADDC
Restar con préstamo SUBB
Negar (complemento a 2) NEG
Las instrucciones sumar, restar, multiplicar y dividir pueden estar disponibles para
diferentes tipos de datos. Los tipos de datos que se considera que están en los registros
del procesador durante la ejecución de estas operaciones aritméticas, se incluyen en la
definición del código de operación. Una instrucción aritmética puede especificar datos
de punto fijo o flotante. datos binarios o decimales, datos de precisión única o de doble
precisión. Los diferentes tipos de datos se presentaron en el capítulo 3.
No es extraño encontrar computadoras con tres o más instrucciones de suma: una para
enteros binarios, una para operandos de punto flotante y una para operandos decimales.
Enseguida, se muestran los mnemónicos para tres instrucciones de suma que especifican
tipos de datos diferentes.
Los algoritmos para operaciones con enteros, punto flotante y aritmética ~ decimal se
desarrollan en el capítulo 10.
http://members.fortunecity.es/roy8/cpu.htm
instrucciones:
;y se almacena en la dirección de AX
;resultado
Esto se puede saber mediante los flags, que trataremos más adelante.
;término )
;memoria
AND AX,[BX]
OR AX,BX
OR [AX],BX
16 bits.
contenido que hay en AL, y una vez hecho esto, va a almacenarlo en AX.
MUL SI
en AX.
IMUL SI
quedaría 1.
dividendo estaría formado por el par DX/AX. Al hacer por ejemplo un:
DIV SI
AX el resultado y en DX el resto.
http://platea.pntic.mec.es/~jdelucas/ensamblador.htm
SUMA Y RESTA.
Las instrucciones ADD y SUB realizan sumas y restas sencillas de
datos binarios. Los números binarios negativos están representados
en la forma de complemento a dos: Invierta todos los bits del numero
positivo y sume 1. Los formatos generales para las instrucciones ADD
y SUB son:
Desbordamientos
Sintaxis: AAA
Indicadores: OF DF IF TF SF ZF AF PF CF
? - - - ? ? x ? x
ADD (suma)
Sintaxis: DAA
Indicadores: OF DF IF TF SF ZF AF PF CF
? - - - x x x x x
INC (incrementar)
Ejemplos: inc al
inc es:[di]
inc ss:[bp+4]
inc word ptr cs:[bx+di+7]
***RESTA***
Sintaxis: AAS
Indicadores: OF DF IF TF SF ZF AF PF CF
? - - - ? ? x ? x
CMP (comparación)
Resta origen de destino sin retornar ningún resultado. Los operandos quedan
inalterados, paro los indicadores pueden ser consultados mediante instrucciones de
bifurcación condicional. Los operandos pueden ser de tipo byte o palabra pero ambos de
la misma dimensión.
Sintaxis: DAS
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - x x x x x
DEC (decrementar)
Resta una unidad del operando destino. El operando puede ser byte o palabra.
Obsérvese que esta instrucción no modifica el bit de acarreo (CF) y no es posible
detectar un desbordamiento por este procedimiento (utilícese ZF).
Ejemplo: dec ax
dec mem_byte
NEG (negación)
Ejemplo: neg al
SBB (resta con acarreo)
SUB (resta)
Sintaxis: AAM
Indicadores: OF DF IF TF SF ZF AF PF CF
? - - - x x ? x ?
Ejemplo: mul bl
aam
Ejemplo: imul bx
imul ch
Sintaxis: AAD
Indicadores: OF DF IF TF SF ZF AF PF CF
? - - - x x ? x ?
Convierte dos números BCD no empaquetados contenidos en AH y AL en un
dividendo de un byte que queda almacenado en AL. Tras la operación AH queda a cero.
Esta instrucción es necesaria ANTES de la operación de dividir, al contrario que AAM.
Ejemplo: aad
div bl
En el ejemplo, tras convertir los dos números BCD no empaquetados (en AX)
en un dividendo válido, la instrucción de dividir genera un resultado correcto.
Ejemplo: div bl
div mem_pal
Ejemplo: idiv bl
idiv bx
*** CONVERSIONES***
Sintaxis: CBW
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Copia el bit 7 del registro AL en todos los bits del registro AH, es decir,
expande el signo de AL a AX como paso previo a una operación de 16 bits.
Sintaxis: CWD
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Expande el signo del registro AX sobre el registro DX, copiando el bit más
significativo de AH en todo DX.
http://meltingpot.fortunecity.com/uruguay/978/libro/04.h
tml
2.7.4 Ajustes.
Las instrucciones INC y DEC:
Son las más básicas a la hora de hacer operaciones con registros: INC
INC AX
DEC AX
Decrementa AX, le resta uno.
http://platea.pntic.mec.es/~jdelucas/ensamblador.htm
2.7.5 Comparación.
INSTRUCCIONES DE COMPARACION
CMP y TEST
Tiene el mismo formato que el SUB (por ejemplo CMP AX,BX), tan sólo que
resultado.
LA INSTRUCCION CMP
LA INSTRUCCION CMPS
J:J Iguales
E:O Diferentes (E es menor)
A:A Iguales
N:N Iguales
G20:
MOV CX, 10 ;Iniciar para 10 bytes
LEA DI, NOM3
LEA SI, NOM2
REPE CMPSB ;Compare NOM2:NOM3
JE G30 ;Igual, salir
MOV BL, 02 ;No es igual, fijar BL
G30:
MOV AX, 4C00H ;Salir a DOS
INT 21H
MAIN ENDP
END BEGIN
2.8 Saltos.
Salto. Este término suele aplicarse sobre todo en programación, donde suele
distinguirse entre salto incondicional y salto condicional.
El salto incondicional sería aquella instrucción del programa que nos envía a
otra parte del programa sin tener en cuenta ninguna condición.
Al contrario, el salto condicional sería una, o varias instrucciones, que
comprobarían primero una condición; si esta condición es cierta salta a una
parte del programa, si es falsa a otra.
Una instrucción muy conocida en programación (por aparecer en muchos
lenguajes) es GOTO, que sería la instrucción de salto incondicional por
excelencia. No se suele recomendar mucho su uso (o nada), pues su
utilización implica la creación de un código fuente para el programa, poco
estructurado.
http://www.lawebdelprogramador.com/diccionario/mostrar.php?letra=J
Ver archivo:saltos.doc
Saltos, ciclos y procedimientos
Por último tenemos los procedimientos o rutinas, que son una serie de pasos que se
usaran repetidamente en el programa y en lugar de escribir todo el conjunto de pasos
unicamente se les llama por medio de la instrucción call.
Un procedimiento en ensamblador es aquel que inicie con la palabra Proc y termine con
la palabra ret.
Realmente lo que sucede con el uso de la instrucción call es que se guarda en la pila el
registro IP y se carga la dirección del procedimiento en el mismo registro, conociendo
que IP contiene la localización de la siguiente instrucción que ejecutara la UCP,
entonces podemos darnos cuenta que se desv'a el flujo del programa hacia la dirección
especificada en este registro. Al momento en que se llega a la palabra ret se saca de la
pila el valor de IP con lo que se devuelve el control al punto del programa donde se
invoc— al procedimiento.
http://usuarios.lycos.es/patricio/ensam/ensam2.htm
Hasta este punto los programas que hemos examinado han sido
ejecutados en forma lineal, esto es con una instrucción
secuencialmente a continuación de otra. Sin embargo, rara vez un
programa programable es tan sencillo. La mayoría de los programas
constan de varios ciclos en los que una serie de pasos se repite hasta
alcanzar un requisito especifico y varias pruebas para determinar que
acción se realiza de entre varias posibles.
JMP A90
...
A90: MOV AH, 00
...
2.8.1 Incondicional.
Incondicional
dir dd 0f000e987h
call dword ptr dir
JMP (salto)
http://meltingpot.fortunecity.com/uruguay/978/libro/04.html
Condicional
JA/JNBE Salto si mayor (above), si no menor o igual (not below or equal), si CF=0 y ZF=0. +
JAE/JNB Salto si mayor o igual (above or equal), si no menor (not below), si CF=0. +
Salto si menor (below), si no superior ni igual (not above or equal), si acarreo, si
JB/JNAE/JC CF=1. +
Salto si menor o igual (not below or equal), si no mayor (not above), si CF=1 ó
JBE/JNA ZF=1.
+
JCXZ Salto si CX=0.
JE/JZ Salto si igual (equal), si cero (zero), si ZF=1.
JG/JNLE Salto si mayor (greater), si no menor ni igual (not less or equal), si ZF=0 y SF=0. ±
JGE/JNL Salto si mayor o igual (greater or equal), si no menor (not less), si SF=0. ±
JL/JNGE Salto si menor (less), si no mayor ni igual (not greater or equal), si SF<>OF. ±
JLE/JNG Salto si menor o igual (less or equal), si no mayor (not greater), si ZF=0 y SF<>OF. ±
JNC Salto si no acarreo, si CF=0.
JNE/JNZ Salto si no igual, si no cero, si ZF=0.
JNO Salto si no desbordamiento, si OF=0.
JNP/JPO Salto si no paridad, si paridad impar, si PF=0.
JNS Salto si no signo, si positivo, si SF=0.
JO Salto si desbordamiento, si OF=1.
JP/JPE Salto si paridad, si paridad par, si PF=1.
JS Salto si signo, si SF=1.
SALTOS INCONDICIONALES
el control a cualquier punto del programa. Sería como el "Goto" del Basic,
El formato más sencillo para el salto sería JMP 03424h, lo que saltaría
un ejemplo:
MOV AX,0CC34h
MOV CL,22h
JMP PALANTE
JMP FIN
JMP VUELVE
a "FIN", donde tan sólo se realizará la orden Xor CX,CX cuyo resultado, por
Volvamos con la sintaxis del JMP con algunos ejemplos de cómo utilizarlo:
JMP 100h
JMP 542Ah:100h
JMP [100h]
bytes, o sea, que el rango sería desde 32767 a -32768 bytes de distancia.
Bytes.
A50:
...
JMP A50
JMP A90
...
A90:
Page 60,132
TITLE P08JUMP (COM) Uso de JMP para iterar
.MODEL SMALL
.CODE
ORG 100H
MAIN PROC NEAR
MOV AX,01 ;Iniciación de AX,
MOV BX,01 ;BX y
MOV CX,01 ;CX a 01
A20:
ADD AX, 01 ;Sumar 01 a AX
ADD BX, AX ;Sumar AX a BX
SHL CX, 1 ;Multiplicar por dos a CX
JMP A20 ;Saltar a la etiqueta A20
MAIN ENDP
END MAIN
La instrucción LOOP
| [etiqueta:] | LOOP |
dirección corta |
Page 60,132
TITLE P08LOOP (COM) Ilustración de LOOP
.MODEL SMALL
.CODE
ORG 100H
MAIN PROC NEAR
MOV AX,01 ;Iniciación de AX,
MOV BX,01 ;BX y
MOV CX,01 ;CX a 01
MOV CX,10 ;Iniciar
A20: ;Número de iteraciones
ADD AX, 01 ;Sumar 01 a AX
ADD BX, AX ;Sumar AX a BX
SHL DX, 1 ;Multiplicar por dos a DX
LOOP A20 ;Iterar si es diferente de cero
MOV AX, 4C00H ;Salida a DOS
MAIN ENDP
END MAIN
2.8.2 Condicional.
SALTOS CONDICIONALES
determinado.
las instrucciones):
JC, JNAE, JB: Los tres sirven para lo mismo. Significan: Jump if Carry,
equivalente a < en una operación sin signo. Vamos, que se compara así:
CMP 13h,18h, saltará, ya que 13h es menor que 18h. También se suelen usar
JNC, JAE, JNB: Otros tres que valen exactamente para lo mismo. Jump if
not Carry, Jump if Above or Equal y Jump if Not Below. Saltan por tanto si
JNZ o JNE: Jump if Not Zero o Jump if Not Equal. Salta si el flag de cero
segundo ( <= )
JNP, JPO: Jump if Not Parity, Jump if Parity Odd. Salta si el flag de
MOV AX,1111h
MOV BX,1112h
CMP AX,BX
Espero que con esto haya aclarado un poco la utilidad de los saltos.
Por cierto, que en los saltos condicionales se puede hacer como en los
JE 0022h
JNE 0030h
JNO AL
bytes hacia delante o 128 hacia atrás, no pudiendo superar esta distancia.
| [etiqueta:] | Jnnn |
dirección corta |
CMP AX, BX
compara el contenido de AX con el contenido del BX. Para datos sin
signo, el valor AX es mayor; sin embargo, para datos con signo el
valor AX es menor a causa del signo negativo.
Cada una de estas pruebas las puede expresar en uno de dos códigos
simbólicos de operación.
LOOP (bucle)
BUCLES
orden LOOP. Lo que hace esta orden es comparar CX con cero; si es igual,
MOV CX,0005h
bucle: INC DX
CMP DX,0000h
JE Acaba
LOOP bucle
Acaba: ...
Veamos como funciona este programa. Se mueve a CX el valor 5h, que van
a ser las veces que se repita el bucle. Ahora, llegamos al cuerpo del bucle.
También tiene la limitación de que sólo realiza saltos cortos, así como
LOOP 0003h
LOOP [AL]
Las instrucciones de las operaciones lógicas son: AND, not, or y xor, éstas trabajan
sobre los bits de sus operandos.
Las instrucciones utilizadas para las operaciones algebraicas son: para sumar add, para
restar sub, para multiplicar mul y para dividir div.
http://usuarios.lycos.es/patricio/ensam/ensam2.htm
AND (y lógico)
Ejemplo: not ax
OR (O lógico)
Realiza una operación O lógico a nivel de bits entre los dos operandos,
almacenándose después el resultado en el operando destino.
Ejemplo: or ax,bx
Realiza una operación Y lógica entre los dos operandos pero sin almacenar el
resultado. Los indicadores son afectados con la operación.
XOR (O exclusivo)
http://meltingpot.fortunecity.com/uruguay/978/libro/04.html
Las instrucciones lógicas ejecutan operaciones binarias sobre series de bits almacenadas
en registros. son útiles para manipular bits individuales o un grupo de bits que
represente información en código binario. Las instrucciones lógicas consideran en
forma separada cada bit del operando y la tratan como una variable booleana. Mediante
una aplicación adecuada de las instrucciones lógicas, es posible cambiar los valores de
bits, emplear un es que un grupo de bits o insertar nuevos valores de bits en los
operandos almacenados en registros o palabras de memoria.
En la tabla 8-8 se incluyen algunas otras instrucciones de manipulación de bits. Los bits
individuales (como los de un acarreo) pueden borrarse, activarse o complementarse con
las instrucciones apropiadas. Otro ejemplo es un flip-flop que controla la opción de
interrupción y se habilita o deshabilita mediante instrucciones de manipulación de bits.
http://members.fortunecity.es/roy8/cpu.htm
2.11 Desplazamiento.
Ver archivo: algo_desplazamientos.pdf
INSTRUCCIONES DE ROTACIÓN Y DESPLAZAMIENTO.
Rotar a la derecha los bits del operando destino junto con el indicador de
acarreo CF el número de bits especificado en el segundo operando. Si el número de bits
es 1 se puede especificar directamente; en caso contrario su valor debe cargarse en CL y
especificar CL como segundo operando:
Rota a la izquierda los bits del operando destino el número de bits especificado
en el segundo operando, que puede ser 1 ó CL previamente cargado con el valor del
número de veces.
Rota a la derecha los bits del operando destino el número de bits especificado
en el segundo operando. Si el número de bits es 1 se puede poner directamente, en caso
contrario debe ponerse a través de CL.
Desplaza a la derecha los bits del operando destino el número de los bits
especificados en el segundo operando. Los bits de la izquierda se llena con cero. Si el
número de bits a desplazar es 1 se puede especificar directamente en el caso en que no
ocurra se pone el valor en CL:
http://meltingpot.fortunecity.com/uruguay/978/libro/04.html
2.11.1 Lineal.
Instrucciones de corrimiento
Las instrucciones para recorrer el contenido de un operando son muy útiles y se ofrecen
con frecuencia en diversas variaciones. Los corrimientos son operaciones en las cuales
los bits de una palabra se recorren a la izquierda o derecha. El bit que se recorre al
extremo de la palabra determina el tipo de corrimiento que utiliza. Las instrucciones de
corrimiento pueden especificar corrimientos lógicos, aritméticos u operaciones de tipo
rotatorio. En cualquier caso, el corrimiento puede ser a la derecha o a la izquierda. ,
NOMBRE MNEMONICO
Corrimiento a la derecha lógico SHR
Corrimiento a la izquierda lógico SHL
Corrimiento a la derecha aritmético SHRA
Corrimiento a la izquierda aritmético SHLA
Rotar a la derecha ROR
Rotar a la izquierda ROL
Rotar a la derecha mediante acarreo RORC
Rotar a la izquierda mediante acarreo ROLC
Junto con el resto del número, pero el bit de signo no cambia. Esta es una operación de
corrimiento a la derecha en la que el bit final permanece igual. La instrucción de
corrimiento aritmético a la izquierda inserta 0 en la posición fina.! y es idéntica a la
instrucción lógica de corrimiento a la izquierda. Por esta razón muchas computadoras
no proporcionan una instrucción distinta de corrimiento aritmético a la izquierda cuando
ya está disponible la instrucción de corrimiento lógico a la izquierda.
CORRIMIENTO DE BITS.
Los corrimientos hacia la derecha (SHR y SAR) mueven los bits hacia
la derecha en el registro designado. El bit recorrido fuera del registro
mete la bandera de acarreo. Las instrucciones de corrimiento a la
derecha estipulan datos lógicos (sin signo) o aritméticos (con signo):
INSTRUCCION AL COMENTARIO
MOV CL, 03
MOV AL, 10110111B ; 10110111
SHR AL, 01 ; 11011011 Un corrimiento a la derecha
SHR AL, CL ; 00001011 Tres corrimientos adicionales a
la derecha
SHR AX, 03 ; Válido para 80186 y procesadores
posteriores
INSTRUCCION AL COMENTARIO
MOV CL, 03
MOV AL, 10110111B ;; 10110111
SHR AL, 01 ; 11011011 Un corrimiento a la derecha
SHR AL, CL ; 00001011 Tres corrimientos adicionales a la
derecha
SHR AX, 03 ; Válido para 80186 y procesadores posteriores
INSTRUCCION AL COMENTARIO
MOV CL, 03
MOV AL, 10110111B ; 10110111
SHR AL, 01 ; 01101110 Un corrimiento a la izquierda
SHR AL, CL ; 01110000 Tres corrimientos mas
SHR AX, 03 ; Válido para 80186 y procesadores
posteriores
http://www.itlp.edu.mx/publica/tutoriales/ensamblador/
2.11.2 Circular.
3 ROTACION DE BITS (Desplazamiento circular)
INSTRUCCION BH COMENTARIO
MOV CL, 03
MOV BH, 10110111B ; 10110111
SHR BH, 01 ; 11011011 Una rotación a la derecha
SHR BH, CL ; 00001011 Tres rotaciones a la derecha
SHR BX, 03 ; Válido para 80186 y procesadores
posteriores
INSTRUCCION BL COMENTARIO
MOV CL, 03
MOV BL, 10110111B ; 10110111
SHR BL, 01 ; 11011011 Una rotación a la izquierda
SHR BL, CL ; 00001011 Tres rotaciones a la izquierda
SHR BX, 03 ; Válido para 80186 y procesadores
posteriores
http://www.itlp.edu.mx/publica/tutoriales/ensamblador/tem6_4_.htm
Los que hayáis visto un mínimo de otros lenguajes recordaréis las sentencias
FOR y NEXT (en Basic), o el IF/THEN/ELSE también en estilo Basic pero que
también se encuentran en otros lenguajes. Pues bien, los flags y las instrucciones
éste no esté utilizado por completo, ya que cada flag ocupa un solo bit.
Se trata de varios bits, que, como siempre, pueden valer uno o cero, y
sigue:
³±³±³±³±³O³D³I³T³S³Z³±³A³±³P³±³C³
Cada cuadro representa un bit como es fácil adivinar. También está claro que
más importantes:
EL FLAG DE ACARREO
cabrá en AX. Al realizar esta suma, tenemos que tener en cuenta que el
0FFFFh). Pero de alguna manera nos tenemos que DAR CUENTA de que esto ha
sucedido.
desbordado. Hay que recordar también que las instrucciones INC y DEC no
MOV AX,0FFFFh
MOV BX,0000h
En resumen, se activa cuando tras una operación hay un paso del valor
Este flag nos va a ser también útil al comprobar errores, etc. Por
este flag se activará, con lo que podremos usar los saltos condicionales,
EL FLAG DE SIGNO
con números enteros con signo, en complemento a dos. Indica cuando tras una
operación aritmética (ADD, SUB, INC, DEC o NEG o lógica (AND, OR o XOR)
bit de mayor peso del byte, el que indica cuándo el número es negativo.
que es positivo.
byte).
EL FLAG DE CERO
Es de los más sencillos de comprender. Simplemente se activa cuando el
resultado de una operación aritmética o lógica es cero. Es evidente la gran utilidad del
flag.
Tenemos, por ejemplo, dos registros, AX y CX, que queremos comparar para saber si
son iguales.
Para saberlo, no tendríamos más que restar uno del otro, y si el resultado
salto condicional.
O sea, de un
SUB CX,AX
EL FLAG DE PARIDAD
a uno. Se pondrá a uno cuando haya un número par de bits, y a cero cuando
sea impar.
RESTO DE FLAGS
nula; por ejemplo está el flag de interrupción, que, cuando está activado,
el de trampa, que cuando está activado provoca una INT 1h cada vez que se
ejecuta otra instrucción, pero creo que su interés es escaso, al menos por
el momento.
3.1.2 Cadenas.
INSTRUCCIONES DE CADENA
lecciones más atrás, y que se puede cambiar directamente con estas dos
instrucciones:
Las instrucciones que vamos a usar como de cadena siempre tienen una S
Y estas son:
LODSB/LODSW
STOSB/STOSW
MOVSB/MOVSW
REP
Acabo de hablar sobre él. Pues bien, si se utiliza como operando suyo
reservado:
;a cero.
mov cx,400h
push dx
;DS valiendo 0.
push cs
rep movsb ; Repite ‚esto 400h veces, y cada vez que lo hace
;incrementa DI y SI.
buffer: db 400h dup (?) ; Esto deja un espacio de 400h bytes que nos
;vectores de interrupción.
Podemos, para empezar, reducir el 400h a 200h en CX, y hacer un rep movsw,
lea si,origen
lea di,destino
cmpsb
Ejemplo: cld
lea si,origen
lodsb
REP/REPE/REPZ/REPNE/REPNZ (repetir)
Prefijo Función
Instrucciones
----------- ------------------------------- --------------
--
REP Repetir CX veces MOVS, STOS
REPE/REPZ Repetir CX veces mientras ZF=1 CMPS, SCAS
REPNE/REPNZ Repetir CX veces mientras ZF=0 CMPS, SCAS
Ejemplos:
1) Buscar el byte 69 entre las 200 primeras posiciones de tabla (se supone
tabla en el segmento ES):
LEA DI,tabla
MOV CX,200
MOV AL,69
CLD
REPNE SCASB
JE encontrado
2) Rellenar de ceros 5000 bytes de una tabla colocada en datos (se supone
datos en el segmento ES):
LEA DI,datos
MOV AX,0
MOV CX,2500
CLD
REP STOSW
http://meltingpot.fortunecity.com/uruguay/978/libro/04.html
3.1.3 Carga.
Las primeras dos instrucciones permiten el intercambio de datos entre la memoria y el registro
del procesador.
La instrucci¶on LOAD copia un dato de la memoria al registro, mientras que la instruccion
STORE lo hace en el sentido inverso. La instrucci¶on LOADI permite cargar un operando
inmediato en el registro, es decir, un valor constante que se incluye en la instrucci¶on misma.
Por ejemplo, LOADI 5 hace que el valor 5 se copie al registro. Observe la diferencia con LOAD
5, que copia al registro el contenido de la celda cuya direcci¶on es 5.
MOV (transferencia)
XCHG (intercambiar)
XLAT (traducción)
lea dx,datos[si]
Sintaxis: LAHF
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - - - - - -
Sintaxis: SAHF
Indicadores: OF DF IF TF SF ZF AF PF CF
- - - - x x x x x
http://ing.utalca.cl/~fmeza/cursos/cyp/tema3.pdf
Debe recordarse que las instrucciones que se listan en la tabla 8-5, al igual que
en las tablas siguientes en esta sección, con frecuencia están asociadas con
diversos modos de direccionamiento. Algunas normas del lenguaje ensamblador
modifican el símbolo mnemónico para diferenciar entre los diversos modos de
direccionamiento. Por ejemplo, el mnemónico para
Registro LD R1 AC = R1
http://members.fortunecity.es/roy8/cpu.htm
Unidad 3. Modularización
3.3 Macros.
MACROS.
IF1
INCLUDE fichero.ext
ENDIF
La sentencia IF1 asegura que el ensamblador lea el fichero fuente de las macros sólo
en la primera pasada, para acelerar el ensamblaje y evitar que aparezcan en el listado
(generado en la segunda fase). Conviene hacer hincapié en que la definición de la macro
no consume memoria, por lo que en la práctica es indiferente declarar cientos que
ninguna macro:
PURGE nombre_simbólico[,nombre_simbólico,...]
SUPERPUSH MACRO
PUSH AX
PUSH CX
PUSH DX
PUSH BX
PUSH SP
PUSH BP
PUSH SI
PUSH DI
ENDM
Para quien no haya tenido relación previa con algún lenguaje estructurado de alto
nivel, haré un breve comentario acerca de lo que son los parámetros formales y actuales
en una macro, similar aquí a los procedimientos de los lenguajes de alto nivel.
PUSH AX
MOV AX,positivos
ADD AX,negativos
MOV total,AX
POP AX
Las instrucciones PUSH y POP sirven para no alterar el valor de AX y conseguir que
la macro se comporte como una caja negra; no es necesario que esto sea así pero es una
buena costumbre de programación para evitar que los programas hagan cosas raras. En
general, las macros de este tipo no deberían alterar los registros y, si los cambian, hay
que tener muy claro cuáles.
Si se indican más parámetros de los que una macro necesita, se ignorarán los
restantes. En cambio, si faltan, el MASM asumirá que son nulos (0) y dará un mensaje
de advertencia, el TASM es algo más rígido y podría dar un error. En general, se trata
de situaciones atípicas que deben ser evitadas.
También puede darse el caso de que no sea posible expandir la macro. En el ejemplo,
no hubiera sido posible ejecutar SUMAR AX,BX,DL porque DL es de 8 bits y la
instrucción MOV DL,AX sería ilegal.
Son necesarias normalmente para los saltos condicionales que contengan las macros
más complejas. Si se pone una etiqueta a donde saltar, la macro sólo podría ser
empleada una vez en todo el programa para evitar que dicha etiqueta aparezca
duplicada. La solución está en emplear la directiva LOCAL que ha de ir colocada justo
después de la directiva MACRO:
* Operador ;;
Indica que lo que viene a continuación es un comentario que no debe aparecer al
expansionar la macro. Cuando al ensamblar se genera un listado del programa, las
macros suelen aparecer expandidas en los puntos en que se invocan; sin embargo sólo
aparecerán los comentarios normales que comiencen por (;). Los comentarios
relacionados con el funcionamiento interno de la macro deberían ir con (;;), los relativos
al uso y sintaxis de la misma con (;). Esto es además conveniente porque durante el
ensamblaje son mantenidos en memoria los comentarios de macros (no los del resto del
programa) que comienzan por (;), y no conviene desperdiciar memoria...
* Operador &
Utilizado para concatenar texto o símbolos. Es necesario para lograr que el
ensamblador sustituya un parámetro dentro de una cadena de caracteres o como parte de
un símbolo:
SALUDO MACRO c
MOV AL,"&c"
etiqueta&c: CALL imprimir
ENDM
Cuando se utilizan estructuras repetitivas REPT, IRP o IRPC (que se verán más
adelante) existe un problema adicional al intentar crear etiquetas, ya que el ensamblador
se come un & al hacer la primera sustitución, generando la misma etiqueta a menos que
se duplique el operador &:
MEMORIA MACRO x
IRP i, <1, 2>
x&i DB i
ENDM
ENDM
MEMORIA MACRO x
IRP i, <1, 2>
x&&i DB i
ENDM
ENDM
Lo que con MEMORIA ET generará correctamente las líneas:
ET1 DB 1
ET2 DB 2
* Operador ! o <>
Empleado para indicar que el carácter que viene a continuación debe ser
interpretado literalmente y no como un símbolo. Por ello, !; es equivalente a <;>.
* Operador %
Convierte la expresión que le sigue -generalmente un símbolo- a un número; la
expresión debe ser una constante (no relocalizable). Sólo se emplea en los argumentos
de macros. Dada la macro siguiente:
Estas directivas pueden ser empleadas también sin las macros, aumentando la
comodidad de la programación, aunque abundan especialmente dentro de las macros.
REPT 2
OUT DX,AL
ENDM
Esta secuencia se transformará, al ensamblar, en lo siguiente:
OUT DX,AL
OUT DX,AL
SUCESION MACRO n
num = 0
REPT n
DB num
num = num + 1
ENDM ; fin de REPT
ENDM ; fin de macro
La sentencia SUCESION 3 provocará la siguiente expansión:
DB 0
DB 1
DB 2
* IRP simbolo_control, <arg1, arg2, ..., arg_n> ... ENDM (Indefinite repeat)
IRP i, <1,2,3>
DB 0, i, i*i
ENDM
Al expansionarse, este conjunto de instrucciones se convierte en lo siguiente:
DB 0, 1, 1
DB 0, 2, 4
DB 0, 3, 9
Nota: Todo lo encerrado entre los ángulos se considera un único parámetro. Un (;)
dentro de los ángulos no se interpreta como el inicio de un comentario sino como un
elemento más. Por otra parte, al emplear macros anidadas, deben indicarse tantos
símbolos angulares '<' y '>' consecutivos como niveles de anidamiento existan.
Lógicamente, dentro de una macro también resulta bastante útil la estructura IRP:
Cuando se pasan listas como parámetros hay que encerrarlas entre '<' y '>' al
llamar, para no confundirlas con elementos independientes. Por ejemplo, supuesta la
macro INCD:
Esta directiva es similar a la anterior, con una salvedad: los elementos situados
entre los ángulos (<) y (>) -ahora opcionales, por cierto- son caracteres ASCII y no van
separados por comas:
IRPC i, <813>
DB i
ENDM
El bloque anterior generará al expandirse:
DB 8
DB 1
DB 3
Ejemplo de utilización dentro de una macro (en combinación con el operador &):
INICIALIZA MACRO a, b, c, d
IRPC iter, <&a&b&c&d>
DB iter
ENDM ; fin de IRPC
ENDM ; fin de macro
Al ejecutar INICIALIZA 7, 1, 4, 0 se produce la siguiente expansión:
DB 7
DB 1
DB 4
DB 0
* EXITM
MALLOC MACRO n
maximo=100
REPT n
IF maximo EQ 0 ; ¿ya van 100?
EXITM ; abandonar REPT
ENDIF
maximo = maximo - 1
DB 0 ; reservar byte
ENDM
DB 255 ; byte de fin de
bloque
ENDM
5.4.7. - MACROS AVANZADAS CON NUMERO VARIABLE DE PARÁMETROS.
http://meltingpot.fortunecity.com/uruguay/978/libro/05.html#04
CUERPO DE LA MACRO
ENDM
Ejemplo de la definición de una macro.
PARÁMETROS
Un parámetro es una variable que puede tomar un valor diferente cada vez
que se ejecute una subrutina en la que se utiliza tal variable.
Ejemplo:
Despliega MACRO Mensaje
Toda macro tiene une definición inicial que consta del nombre asignado a
ella, el seudocódigo de operación MACRO y la lista de parámetros. En la
definición anterior el nombre de la macro es despliega y su parámetro es
mensaje (el mensaje que se desplegará cada vez que sea invocada la macro).
PROMPT MESSAGE2
En este caso MESSAGE2 tiene que estar apropiadamente definido en el
segmento de datos. El parámetro en la macroinstrucción corresponde al
argumento mudo en la definición original de la macro:
DEFINICIÓN DE MACRO: PROMPT MACRO MESSAGE (argumento)
MACROINSTRUCCIÓN: PROMPT MESSAGE2 (parámetro)
El ensamblador sustituye los parámetros de la macroinstrucción por los
argumentos mudos en la definición de la macro, entrada por entrada, de
izquierda a derecha.
...CÓDIGO
.
.
Despliega MACRO Mensaje, veces
MOV CX, Veces
OTRA:
MOV DX,OFFSET Mensaje
MOV AH,09
INT 21H
LOOP OTRA
ENDM
...MAS CÓDIGO
.
.
.
MOV CX,10
OTRA:
LOOP OTRA
Cuando el programa ejecuta la primera macro todo está bien, pero cuando
intenta ejecutar el código que contiene de nuevo el mismo nombre de etiqueta
se queda perplejo porque no puede decidir si la interacción se aplica a su
etiqueta OTRA o a la etiqueta OTRA de la macro procesadora.
Afortunadamente existe una solución al problema que consiste en usar un
seudocódigo de operación llamado LOCAL, el cual enumera todas las
etiquetas utilizadas dentro de una macro. Cada vez que la macro sea
expandida, el TASM crea un símbolo único para cada etiqueta enumerada en
la lista de LOCAL. El formato de LOCAL es:
ENSAMBLE DE MACROS
program1.asm
Para ensamblarlo se utiliza el TASM, el comando de ensamble es: TASM
Program1; para enlazarlo y hacerlo ejecutable tecleamos: LINK program1;
PROGRAMA:
; INICIO DEL PR0GRAMA, DEFINIMOS EL MODELO DE MEMORIA A USAR Y EL
SEGMENTO
; DE CÓDIGO
.MODEL SMALL ;MODELO DE MEMORIA
.CODE ;ÁREA DE CÓDIGO
INICIO: ;ETIQUETA DE INICIO DEL PROGRAMA
MOVE AX,DATA ;INICIALIZA EL REGISTRO DS CON LA DIRECCIÓN DADA
MOV DS,AX ;POR DATA (SEGMENTO DE DATOS)
MOV DX, OFFSET Titulo ;OBTIENE LA DIRECCIÓN DE LA CADENA DE
CADENA DE CARACTERES
MOV AH,09 ;USAMOS LA FUNCIÓN 09H DE LA INTERRUPCIÓN 21H
INT 21H ;PARA DESPLEGAR LA CADENA CUYA DIRECCIÓN OBTUVIMOS
MOV CX,16 ;CONTADOR DE CARACTERES QUE SE MOSTRARÁ
MOV BX,OFFSET Cadena ;PERMITE ACCESO A LA CADENA DONDE SE
ENCUENTRAN LOS VALORES A DESPLEGAR
CICLO: ;ETIQUETA PARA GENERAR UN CICLO
MOV AL,CL ;COLOCA EN AL EL NÚMERO A TRADUCIR Y LO TRADUCE
XLAT ;USANDO LA INSTRUCCIÓN XLAT
MOV DL,AL ;COLOCA EN DL EL VALOR A SER DESPLEGADO POR MEDIO DE
LA
MOV AH, 02 ;FUNCIÓN 2 DE LA INTERRUPCIÓN 21H
INT 21H ;DESPLIEGA EL CARACTER
MOV DL,10 ;SALTA UNA LÍNEA DESPLEGANDO EL CARÁCTER 10
INT 21H ;DESPLIEGA EL CARACTER
MOV DL,13 ;PRODUCE UN RETORNO DE CARRO DESPLEGANDO EL
CARACTER 13
INT 21H ;DESPLIEGA EL RETORNO DE CARRO
LOOP CICLO ;DECREMENTA EN 1 A CX Y BRINCA LA ETIQUETA CICLO
;SIEMPRE Y CUANDO CX NO SEA IGUAL A CERO
MOV AH, 4C ; UTILIZA LA FUNCIÓN 4C DE LA INTERRUPCIÓN 21H PARA
INT 21H ;FINALIZAR EL PROGRAMA
VENTAJAS DE LAS MACROS
2: Las macros pueden pasar y recibir parámetros que afecten solo la operación
de las mismas.
3: Las macros pueden ser guardadas en una biblioteca en código fuente, que
puede ser fácilmente editada.
Definición
Una de las principales desventajas de la programación en lenguaje
ensamblador es la repetición constante de ciertos grupos de instrucciones. Por
ejemplo el siguiente conjunto de instrucciones nos permite imprimir una
variable de tipo cadena en la pantalla:
Lea DX,Cadena ;Direccionar la cadena
Mov AH,09h ;Usar la función 09h para imprimir cadenas
Int 21h ;llamada a la interrupción 21h del DOS
Parámetros y etiquetas
Dentro de las propiedades más importantes de las macros se deben destacar
la posibilidad de utilizar parámetros y etiquetas.
Los parámetros permiten que una misma macro pueda ser usada bajo
diferentes condiciones, por ejemplo, se puede crear una macro para posicionar
el cursor en diferentes coordenadas de la pantalla e indicar sus coordenadas
por medio de parámetros.
La siguiente macro nos muestra esta propiedad:
;Esta macro posiciona el cursor en las coordenadas que se le indican como
;parámetros. Es el equivalente al GotoXY de Pascal.
.MACRO gotoxy (x,y)
xor bh,bh ;Seleccionar página cero de video
mov dl,x ;Columna
mov dh,y ;Renglón
mov ah,02h ;Función 02h para posicionar cursor
int 10h ;llamada a la int 10h del BIOS
ENDM
También existen situaciones en las que los parámetros no son necesarios, es
por esta razón que los parámetros son opcionales en la declaración de la
macro.
;Esta macro realiza una pausa en el programa hasta que una tecla es
;presionada. Es el equivalente del readkey en Pascal.
.MACRO tecla
mov ah,10h
int 16h
ENDM
Por otro lado, las etiquetas también son útiles dentro de las macros. Suponga
que se desea crear una macro que imprima una cadena un numero n de veces,
esta macro podría ser declarada de la siguiente forma:
.MACRO Imprime_nCad (Cadena, Cuantos)
Mov CX,Cuantos ;Iniciar Contador
Lea DX,Cadena ;Direccionar la cadena que se va a imprimir
Mov Ah,09h ;Usar la función 09h
Otra: ;Etiqueta interna
Int 21h ;Imprimir la Cadena n veces
Loop Otra ;Siguiente Impresión
ENDM
Ensamble de macros
Como ya se mencionó antes, una macro es declarada una sola vez y puede ser
llamada cuantas veces sea necesario dentro del cuerpo del programa.
Cada vez que el ensamblador encuentra una macroinstrucción, verifica si ésta
fue declarada; si esta verificación es exitosa, el ensamblador toma las
instrucciones del cuerpo de la macro y las reemplaza en el lugar donde la
macro fue llamada.
El siguiente programa muestra la declaración y uso de las macros:
.COMMENT
Programa: Macros1.ASM
Autor: Juan Carlos Guzmán C.
Descripción: Este programa muestra el uso de macros.
.MODEL TINY
; Declaración de variables
.DATA
cad db 'Ejemplo del uso de macros...',13,10,'$'
cad1 db 'Presiona una tecla...','$'
cad2 db 'Ejemplo del uso de la macro gotoxy...','$'
;Aquí se declaran las macros.
;************************************************************************
;------------------------------------------------------------------------
;Esta macro imprime una cadena pasada como parámetro.
;Utiliza la función 09h de la Int 21h del DOS.
.MACRO imprime_cad(cadena)
lea dx,cadena
mov ah,09h
int 21h
ENDM
;------------------------------------------------------------------------
;Esta macro realiza una pausa en el programa hasta que una tecla se
;presione. Es el equivalente del readkey en Pascal.
.MACRO tecla
mov ah,10h
int 16h
ENDM
;------------------------------------------------------------------------
;Esta macro posiciona el cursor en las coordenadas que se le indican como
;parámetros. Es el equivalente al GotoXY de Pascal.
.MACRO gotoxy (x,y)
xor bh,bh
mov dl,x
mov dh,y
mov ah,02h
int 10h
ENDM
;-------------------------------------------------------------
;Esta macro limpia la pantalla.
;Utiliza la función 06h de la Int 10h del Bios.
.MACRO limpiar_pantalla
mov ax,0600h
mov bh,17h
mov cx,0000h
mov dx,184fh
int 10h
ENDM
;-------------------------------------------------------------
;Aquí comienza el cuerpo del programa principal
.CODE
inicio: ;Declaración del punto de entrada
limpiar_pantalla ;Llamada a la macro
gotoxy (0,0) ;Colocar el cursor en 0,0
imprime_cad(cad) ;Imprime el primer mensaje
imprime_cad(cad1) ;Imprime el segundo mensaje
tecla ;Espera a que se presione una tecla
gotoxy (30,12) ;Colocar el cursor en 30,12
imprime_cad(cad2) ;Imprimir el tercer mensaje
gotoxy (50,24) ;Colocar el cursor en 50,24
imprime_cad(cad1) ;Imprimir el segundo mensaje
tecla ;Esperar por una tecla
mov ax,4c00h ;Fin del programa y regresar al DOS.
int 21h
END inicio
END
Ventajas y desventajas
Si bien es cierto que las macros proporcionan mayor flexibilidad a la hora de
programar, también es cierto que tienen algunas desventajas.
La siguiente es una lista de la principales ventajas y desventajas del uso de las
macros.
Ventajas:
Desventajas:
http://www.monografias.com/trabajos11/lenen/lenen2.s
html
Conceptos básicos
Definición y operación
El ensamblador usa las macros de tal manera que cada vez que encuentra al símbolo que
define la macro, lo sustituye por el texto que representa.
...
ENDM
Ejemplo:
DuplicaAL MACRO
SHL AL, 1
ENDM
Ejemplo:
MOV AL, 2
MOV AL, 2
Sintaxis:
<Simbolo> EQU Valor
<Simbolo> = Valor
La diferencia es que = puede usarse varias veces sobre el mismo símbolo (como una
variable)
REPT
Sintaxis:
REPT <n>
...
ENDM
Ejemplo:
REPT 10
DW Valor
Valor = Valor + 1
ENDM
REPT Valor
SHL Registro, 1
ENDM
ENDM
Uso:
Potencia2 CX, 4
Se convierte en:
SHL CX, 1
SHL CX, 1
SHL CX, 1
SHL CX, 1
http://www.sinergia-web.com.mx/clases/asm9708/Temas/clase18.htm
MANEJO DE PARAMETROS.
Para hacer una macro flexible, puede definir nombres en ella como
argumentos mudos (ficticios).La definición de la macro siguiente,
llamada DESPLEGAR_MSG, proporciona el uso de la función 09H del
DOS para desplegar cualquier mensaje. Cuando se usa la
macroinstrucción el programador tiene que proporcionar el nombre del
mensaje, el cual hace referencia a un área de datos terminada por un
signo de dólar.
DESPLEGAR_MSG MENSAJE2
BIBLIOTECAS DE MACROS.
Macro1 MACRO
....
ENDM
Macro2 MACRO
....
ENDM
INCLUDE C: MACRO.LIB
Macro1
Macro2
La Directiva PURGE.
IF1
INCLUDE C:\MACRO.LIB ;Incluye la biblioteca completa
ENDIF
3.3.1 Internas.
3.3.2 Externas.
3.4 Procedimientos.
Definición de procedimientos
Un procedimiento es un conjunto de instrucciones que tienen la finalidad de
ejecutar una tarea especifica dentro de un programa. Los procedimientos son
muy similares a las macros.
Un procedimiento se declara una sola vez en el código fuente y cuando el
programa se ensambla y ejecuta, el procedimiento se coloca en memoria para
que pueda ser utilizado por el programa.
Las principales ventajas en el uso de procedimientos son: permiten una
codificación más limpia y compacta, es decir el código fuente es más pequeño;
también permiten el ahorro de memoria, esto es porque un mismo
procedimiento puede ser llamado varias veces en el mismo programa y sólo
requiere memoria una vez.
Los procedimientos tienen la desventaja de que reducen la velocidad de
ejecución de los programas, esto se debe a la forma en que los procedimientos
se ejecutan. A continuación se presentan los pasos necesarios para ejecutar un
procedimiento:
1.- Se encuentra la llamada Call
2.- El microprocesador almacena en la Pila el contenido del IP
3.- Se coloca en el IP el valor del desplazamiento correspondiente al
Procedimiento
4.- El microprocesador ejecuta las instrucciones del procedimiento
5.- El procedimiento termina cuando se encuentra la instrucción Ret
6.- Se saca de la pila el valor original del IP y se continua el flujo del programa
Paso de parámetros
Los procedimientos en lenguaje ensamblador no cuentan con un mecanismo
para el paso de parámetros; por lo cual, la única forma de lograr esto es
colocando los parámetros que nos interesan en los registros de propósito
general antes de que el procedimiento sea ejecutado.
El siguiente procedimiento coloca el cursor en las coordenadas establecidas en
Dl y Dh.
Proc GotoXY
xor bh,bh
mov ah,02h
int 10h
Ret
Endp GotoXY
En este ejemplo, las coordenadas XY se deben situar en el registro DX antes
de que se llame al procedimiento.
Llamada a procedimientos
Los procedimientos son llamados por los programas por medio de la instrucción
CALL, seguida del nombre del procedimiento.
Ejemplo:
Call GotoXY
El siguiente programa muestra la forma de pasarle parámetros a los
procedimientos por medio de los registros generales. Este programa declara
tres procedimientos:
GotoXY: Coloca el cursor en las coordenadas especificadas
Limpia_Pantalla: Limpia la pantalla
Imprime_Cad: Imprime una cadena en la posición actual del cursor
.COMMENT
*
Programa: Proc2.ASM
Autor: Juan Carlos Guzmán C.
Descripción: Este programa ilustra la forma de utilizar procedimientos en los
programas por medio de la instrucción Call y la forma de pasarles parámetros.
.MODEL TINY
.DATA
Cad1 db 'Esta es una cadena de prueba...',13,10,'$'
.CODE
INICIO: ;Punto de entrada al programa
Mov DL,20 ;X=20
Mov DH,10 ;Y=10
Call Gotoxy ;GotoXY 20,10
Lea DX,cad1 ;DX->Cad1
Call Imprime_Cad ;Imprimir Cad1
Mov Ax,04C00h ;Terminar y regresar al dos
Int 21h ;
END INICIO
;*********************************************************************
;Procedimiento: GotoXY
;Descripción: Coloca el cursor una posición especifica de la pantalla
;Parámetros: Dl=X, Dh=Y
;*********************************************************************
PROC GotoXY
Xor Bh,Bh
Mov Ah,02h
Int 10h
Ret
ENDP GotoXY
;***********************************************************************
;Procedimiento: Limpia_Pantalla
;Descripción: Imprime una cadena de caracteres en la posición del cursor
;Parámetros: La dirección de la cadena en DX
;***********************************************************************
PROC Imprime_Cad
Mov Ah,09h
Int 21h
Ret
ENDP Imprime_Cad
END
http://www.monografias.com/trabajos11/lenen/lenen2.s
html
LLAMADA DE PROCEDIMIENTOS.
Hasta ahora los segmentos de código han consistido solo en un
procedimiento, codificado como:
page 60,132
TITLE P08CALLP (EXE) Llamada a procedimientos
.MODEL SMALL
.STACK 64
.DATA
;---------------------------------------------------------------------
.CODE
BEGIN PROC FAR
CALL B10 ;Llama a B10
; ...
MOV AX,4C00H ;Salida a DOS
INT 21H
BEGIN ENDP
;---------------------------------------------------------------------
B10 PROC NEAR
CALL C10 ;Llama a C10
; ...
RET ;De regreso
B10 ENDP ;Quien llama
;---------------------------------------------------------------------
END BEGIN
3.4.1 Internos.
Procedimientos internos
Los procedimientos internos son aquellos que se declaran y se llaman dentro del mismo
programa, también son llamados procedimientos locales.
El listado anterior muestra la forma de utilizar procedimientos internos.
3.4.2 Externos.
Procedimientos externos
Los procedimientos externos, a diferencia de los internos, se declaran en
módulos o programas separados al programa donde el procedimiento es
llamado, en otras palabras, la llamada al procedimiento se encuentra en un
programa y el procedimiento en otro.
Para poder utilizar procedimientos externos, es necesario que sean declarados
como públicos en el programa donde se encuentran y que sean llamados como
externos en el programa donde serán usados. Para lograr esto, Pass32 cuenta
con tres directivas de ensamble: .PUBLIC para declarar los procedimientos
como públicos, .EXTERN para indicar que el procedimiento que se va a usar
está fuera del programa y .INCLUDE para enlazar el programa que contiene los
procedimientos con el programa que los llama.
El siguiente programa muestra el uso de las directivas de inclusión.
Primeramente, el archivo Proc2.ASM se modificó para que su variable Cad1
fuera declarada como publica, el programa Proc3.ASM contiene la línea
.INCLUDE Proc2.ASM, lo cual indica al ensamblador que, en caso de que se
soliciten datos, etiquetas o procedimientos externos, éstos se busquen en el
archivo incluido.
Pass32 proporciona grandes facilidades para el manejo de procedimientos; en
este caso, solamente Cad1 debe ser declarada como pública, puesto que los
procedimientos se buscan y anexan automáticamente al programa que los
llama si es que existen.
.COMMENT
*
Programa: Proc3.ASM
Autor: Juan Carlos Guzmán C.
Descripción: Este programa ilustra la forma de utilizar procedimientos y datos
externos en los programas por medio de las directivas de inclusión include y
public.
.MODEL TINY
.INCLUDE proc2.ASM ;Incluir el archivo proc2.asm
;el cual contiene la variable de cadena
;Cad1 y los procedimientos externos
;usados en este programa.
.DATA
Cad2 db 'Esta es una cadena de prueba 2...',13,10,'$'
.CODE
INICIO: ;Punto de entrada al programa
Mov Dl,20 ;X=20
Mov Dh,10 ;Y=10
Call GotoXY ;GotoXY 20,10
Lea DX,Cad2 ;DX->Cad2 en Proc3.asm
Call Imprime_Cad ;Imprime Cad2
Lea DX,Cad1 ;DX->Cad1 en Proc2.asm
Call Imprime_Cad ;Imprime Cad1
Mov AX,04C00h ;Fin del programa
Int 21h ;
END INICIO
END
.COMMENT
*
Programa: Proc2.ASM
Autor: Juan Carlos Guzmán C.
Descripción: Este programa ilustra la forma de utilizar procedimientos en los
programas por medio de la instrucción Call y la forma de pasarles parámetros.
.MODEL TINY
.DATA
.PUBLIC Cad1 db 'Esta es una cadena de prueba...',13,10,'$'
.CODE
INICIO: ;Punto de entrada al programa
Mov DL,20 ;X=20
Mov DH,10 ;Y=10
Call Gotoxy ;GotoXY 20,10
Lea DX,cad1 ;DX->Cad1
Call Imprime_Cad ;Imprimir Cad1
Mov Ax,04C00h ;Terminar y regresar al dos
Int 21h ;
END INICIO
;*********************************************************************
;Procedimiento: GotoXY
;Descripción: Coloca el cursor una posición especifica de la pantalla
;Parámetros: Dl=X, Dh=Y
;*********************************************************************
PROC GotoXY
Xor Bh,Bh
Mov Ah,02h
Int 10h
Ret
ENDP GotoXY
;***********************************************************************
;Procedimiento: Limpia_Pantalla
;Descripción: Imprime una cadena de caracteres en la posición del cursor
;Parámetros: La dirección de la cadena en DX
;***********************************************************************
PROC Imprime_Cad
Mov Ah,09h
Int 21h
Ret
ENDP Imprime_Cad
END
http://www.monografias.com/trabajos11/lenen/lenen2.s
html