Está en la página 1de 4

Escuela Profesional de Ingeniería de Sistemas Taller de Programación en Ensamblador

Capitulo I: Programación Básica en Ensamblador. Primeros programas

Nuestro primer programa


1. Editar el siguiente programa y guardarlo en la carpeta principal del Turbo Assembler como hola.asm

pila segment para 'stack' stack ;este es el segmento de pila


dw 64 dup('?')
pila ends
datos segment para 'data' ;este es el segmento de datos
mensage db 'hola mundo',13,10,'$'
datos ends
codigo segment para 'code' ;este es el segmento de codigo
inicio:
assume ss:pila,cs:codigo,ds:datos ;directiva de inicializacion del programa
mov ax,datos ;inicializacion del segmento de datos
mov ds,ax ;asignacion de la direccion
lea dx,mensage ;instruccion que obtiene la direccion de mensage
mov ah,09h ;asignacion de un numero
int 21h ;ejecucion de la interrupcion de impresion en pantalla
mov ah,4ch ;asignacion de un numero
mov al,0 ;asignacion de otro numero
int 21h ;ejecucion de la interrupcion de salida
codigo ends
end inicio

2. Ingresar al intérprete de comandos del windows (Símbolo del Sistema)


3. Ubicarse en la carpeta pricipal del TurboAssembler
4. Ingresar el comando TASM hola.asm
5. Si aparecen errores volver a editar el programa
6. Ingresar el comando TLINK hola
7. Si no aparecen errores nuestro programa estará listo para ser ejecutado
8. Ejecutarlo con hola

Explorando el programa

Identificadores y comentarios en assembler


Un identificador es un nombre que se refiere a la dirección de un dato almacenado en memoria o a la dirección de una
instrucción del programa. El nombre de un identificador puede ser escrito con cualquier letra del alfabeto, uno de los
caracteres especiales (? _ $ @ .) o un número (que no debe ser la primera letra). Así son identificadores válidos:

?uno @cuatro fin .cinco nombre


Solo se permiten comentarios de una línea y comienzan con ; (punto y coma) y terminan con el fin de línea.
; este es un comentario en assembler
En el programa utilizamos los siguientes identificadores: pila, datos, codigo e inicio. Cabe aclarar que un identificador
de una instrucción de un programa siempre es seguido de : (dos puntos)

¿Cómo se organiza un programa en assembler?


Un programa se organiza en segmentos (segment). Un segmento es un espacio de memoria que puede contener un
conjunto de instrucciones ejecutables y/o datos, todos ellos contiguos, que ocupan como máximo 64kb y se identifican
mediante un registro de segmento.
Un segmento se declara de la siguiente manera:

[nombre_segmento] segment [tipo_alineacion][‘clase’]


; contenido del segmento
[nombre_segmento] ends
donde: [nombre_segmento] es un identificador válido
[tipo_alineacion] es el tipo de alineación aplicado al segmento. Puede ser: byte, word, para, page
[‘clase’] indica el segmento definido. Usualmente es: ‘code’,‘data’ o, ‘stack’
En el programa ejemplo se usan tres segmentos: el de pila, datos y código. Generalmente todos los programas utilizan
estos segmentos.

¿Un registro…?
Escuela Profesional de Ingeniería de Sistemas Taller de Programación en Ensamblador

Un registro es un espacio del procesador (se puede asumir que es una variable propia del procesador) que ocupa 16 bits,
que se utiliza para realizar operaciones y/o almacenar datos o estados del procesador. Los procesadores de la familia del
8086 tienen básicamente los siguientes registros:

Registros de propósito Registros punteros e Registros de segmento Registro puntero de


general: índice - CS instrucciones y de
- AX - SP - DS banderas
- BX - BP - SS - IP
- CX - SI - ES - FLAGS o FL
- DX - DI
Podemos adelantar que cada registro de propósito general se divide en dos registros. Así AX se divide en AH y AL
(cada uno de 8 bits), BX en BH y BL, CX en CH y CL y DX en DH y DL.
Posteriormente se detallará más acerca de la funcionalidad de los registros

¿Qué significa “ dw 64 dup('?'), mensage db 'hola mundo',13,10,'$' ” ?


Son directivas que definen datos globales (son mas o menos definiciones de variables del programa ). Además de
estas directivas existen otras. A continuación una breve reseña:
Directiva Descripción
DB Define un byte. Se usa también para definir cadenas de caracteres
DW Define una palabra (2 bytes)
DD Define una palabra doble (4 bytes)
DF Define una palabra larga (6 bytes)
DQ Define una palabra cuádruple (8 bytes)
DT Define 10 bytes
Podemos usar esta directiva de la siguiente manera:
[nombre] <directiva> [repeticiones] dup (expresion)
donde: [nombre] asigna un identificador al espacio definido. Es opcional
<directiva> es una directiva válida
[repeticiones] es un número opcional, que reproduce el número de espacios especificados.
[expresión] es el valor con el que se inicializa al espacio definido
Ejemplos:
dw 64 dup (?); define un espacio de 64 palabras (64*3 bytes) no inicializados
mensage db ‘hola mundo’,13,10,’$’;define un espacio con el identificador mensage y lo inicializa con la
cadena mostrada.
Dato2 dw 6 dup (14) seis palabras inicializadas con el número 14

¿Qué quiere decir assume?


Se utiliza para determinar el propósito de cada registro de segmento. En el ejemplo esta directiva hace saber al
ensamblador que el registro ss trabajará con el segmento de pila, el registro ds con el segmento de datos y el cs con el
segmento de código. Es una directiva esencial en el programa.

Algunas instrucciones ensamblador


mov <operando1>,<operando2>
Es una de las instrucciones más utilizadas. Se utiliza para realizar asignaciones. Equivale a operador1 = operador.
El primer operando tiene que ser necesariamente un registro (ax, bx, cx, etc.) o un espacio de memoria conocido, y el
segundo operando puede ser un registro, un espacio de memoria o un número definido. No están permitidas las
asignaciones de memoria a memoria, inmediato a registro de segmento y de registro de segmento a registro de
segmento.

lea <operando1>, <operando2>


Se utiliza para obtener la dirección de un identificador de memoria. El operador1 siempre tiene que ser un registro y el
operador2 es un identificador de memoria.

int <numero>
Ejecuta la interrupción indicada por número. En el programa ejecuta la interrupción 21h, que corresponde a las
interrupciones del DOS. Las interrupciones son servicios prestados por el sistema operativo y la BIOS, las cuales
realizan una tarea específica. Para poder ejecutar una determinada interrupción es necesario especificar una serie de
parámetros, generalmente en los registros, con los cuales trabajará la interrupción. Por ejemplo para poder imprimir una
cadena de caracteres en la pantalla es necesario poner el valor 09h en el registro ah, y la dirección de la cadena a
imprimir (terminada en el carácter especial ‘$’) en el registro dx.
Escuela Profesional de Ingeniería de Sistemas Taller de Programación en Ensamblador

Para terminar el programa se utilizó también la interrupción 21h, colocando el valor 04Ch en el registro ah y un código
de retorno (0) en el registro al. Posteriormente se profundizará en el uso de las interrupciones.

¿Qué indica end inicio?


End marca el final del programa. Se debe utilizar siempre end para indicar al ensamblador la finalización del programa
y además se debe indicar el identificador con el cual comienza el programa (en este caso inicio).

Comparación de dos Números


- Editar, guardar, ensamblar, linkear y ejecutar el siguiente programa:
;programa que compara 2 numeros
pila segment para 'stack' stack
dw 64 dup (?)
pila ends
datos segment para 'data'
numero1 db ?
numero2 db ?
mensage1 db 'Los numeros son iguales',10,13,'$'
mensage2 db 'numero1 es mayor a numero2',10,13,'$'
mensage3 db 'numero1 es menor a numero2',10,13,'$'
datos ends
codigo segment para 'code'
Inicio:
assume ss:pila,cs:codigo,ds:datos
mov ax,datos
mov ds,ax
mov numero1, 30
mov numero2, 20
mov al,numero1
cmp al,numero2
je SonIguales
ja EsMayor
jmp EsMenor
SonIguales:
mov ah, 09h
lea dx, mensage1
int 21h
jmp Final
EsMayor:
mov ah, 09h
lea dx, mensage2
int 21h
jmp Final
EsMenor:
mov ah, 09h
lea dx, mensage3
int 21h
Final:
mov ah,4ch
mov al,0
int 21h
codigo ends
end Inicio

El registro de banderas
Para poder entender el funcionamiento de algunas instrucciones como cmp, sub, o add es necesario saber que son las
banderas. El registro de banderas es un registro de 16 bits, de los cuales solo se utilizan 9. Cada bit es una bandera. Este
registro se actualiza con cada instrucción y especifica el estado del procesador después de una operación. Así si una
resta produce cero, la bandera correspondiente se activará.
El registro de banderas esta organizado de la siguiente manera:
- - - - O D I T S Z - A - P - C
El significado de cada bandera se describe a continuación:
Escuela Profesional de Ingeniería de Sistemas Taller de Programación en Ensamblador

OF: Bit de overflow o desbordamiento, que se activa cuando se produce una operación que se sale del rango de sus
operadores.
DF: Bit de dirección. Indica la dirección creciente (0) o decreciente (1), en las operaciones con cadenas.
IF: Bit de interrupción. Indica si una interrupción externa puede o no ser ejecutada.
TF: Bit de trap o desvio. Procesa o ignora la interrupción interna trace (procesamiento paso a paso).
SF: Bit de signo, que indica el valor mas significativo de un registro después de una operación.
ZF: Bit cero, que se pone a cero si una operación da como resultado cero.
AF: Bit de carry. Se pone a 1 si una operación aritmética produce un acarreo del bit 3 al 4. Se usa para aritmética
especializada (ajuste BSD).
PF: Bit de paridad. Se activa si el resultado de una operación tiene paridad par.
CF: Bit de acarreo. Contiene el acarreo de una operación aritmética o de desplazamiento de bits.

Elementos desconocidos:
La mayoría de las instrucciones del programa anterior ya fueron vistas. Ahora detallaremos las instrucciones nuevas:
cmp y j<tipo> (jmp, je, ja).

CMP <operando1>,<operando2>
Es una instrucción que realiza una comparación entre el primer operando y el segundo operando y modifica el registro
de las banderas. Al menos uno de los operandos tiene que ser un registro (de 8 o 16 bits). Esta instrucción modifica el
valor de las siguientes banderas: AF, CF, OF, PF, SF, ZF.

Saltos
En cualquier parte de un programa se puede realizar un salto a cualquier otra parte del programa, de acuerdo a
determinadas situaciones o no. Si se quiere ejecutar una porción de código cuando se produce una determinada
situación (por ejemplo si una operación da como resultado cero), se puede utilizar la siguiente instrucciones:
<salto> <etiqueta>
Donde: <salto> es una de las siguientes instrucciones

SALTO DESCRIPCIÓN
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.
JB/JNAE/JC Salto si menor (below), si no superior ni igual (not above or equal), si acarreo, si CF=1.
JBE/JNA Salto si menor o igual (not below or equal), si no mayor (not above), si CF=1 ó 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.
<Etiqueta> es un identificador de una instrucción del programa.
Como se podrá apreciar, estas instrucciones hacen uso del registro de banderas para realizar su trabajo.
Si se quiere realizar un salto de todas formas, se debe utilizar la instrucción jmp <etiqueta>.

Ejercicios
- Escribir un programa que imprima “hola sistemas” en forma vertical
- Escribir un programa que guarde una edad (un número) e imprima en la pantalla “La edad es de una persona mayor
de edad” si la edad es mayor de 18 o imprima “La edad es de una persona menor de edad” si la edad es menor o
igual a 18
- Escribir un programa que guarde tres números e imprima cadenas que indiquen cual es el mayor, el medio y el
menor

También podría gustarte