Ejemplo sencillo

Ejemplo de separar numero pares de impares

                        .model small
.stack 100h      ;tamaño de la pila
.data
tabla1 Db   39h,45h,33h,52h,28h
impar db    5 dup (?)  ; espacios en memoria para guardar los valores de la tabla
par                 db   5 dup (?)
.code
INICIO: mov ax,seg tabla1     ; iniciar segmento desde la tabla1
mov ds,ax
mov si,offset tabla1   ; posicionar apuntador a la tabla
mov BX,offset IMPAR
mov Di,offset PAR
mov cx,5
Definir_p:         MOV AX,0000H
mov al,[si]
AND AL,0FH
SUB AL,08H
CMP AL,00H
JZ PAR_N
MOV AL,[SI]  ;los corchetes son para mover donde lo que esta apuntando SI a AL
AND AL,0FH
SUB AL,06H
CMP AL,00H
JZ PAR_N
MOV AL,[SI]
AND AL,0FH
SUB AL,04H
CMP AL,00H
JZ PAR_N
MOV AL,[SI]
AND AL,0FH
SUB AL,02H
CMP AL,00H
JZ PAR_N
JMP IMPAR_N
RETORNO: INC SI
LOOP DEFINIR_P
JMP FIN
PAR_N: MOV DL,[SI]
MOV [DI],DL
INC DI
JMP RETORNO
IMPAR_N: MOV DH,[SI]
MOV [BX],DH
INC BX
JMP RETORNO
FIN:              MOV AX,4C00H   ; salida del sistema
INT 21H
END INICIO
END


 Esto puede ayudar un poco son varios vídeos



Conjunto de intrucciones

El Conjunto de Instrucciones del Procesador

      La siguiente es una lista de las instrucciones para la familia de procesadores 8086, clasificadas por categorías. Aunque la lista parece enorme, muchas de las instrucciones rara vez se necesitan.

Aritméticas

• ADC: Suma con acarreos
• ADD: Suma números binarios
• DEC: Decrementa en 1
• DIV: División sin signo
• IDIV: Divide con signo (enteros)
• IMUL: Multiplica con signo (enteros)
• INC: Incrementa en 1
• MUL: Multiplica sin signo
• NEG: Negación
• SBB: Resta con el bit prestado
• SUB: Resta valores binarios

Conversión ASCII-BCD

• AAA: Ajuste ASCII después de sumar
• AAD: Ajuste ASCII antes de dividir
• AAM: Ajuste ASCII después de multiplicar
• AAS: Ajuste ASCII después de restar
• DAA: Ajuste decimal después de sumar
• DAS: Ajuste decimal después de restar

Corrimiento de bit

• RCL: Rota a la izquierda a través del acarreo
• RCR: Rota a la derecha a través del acarreo
• ROL: Rota a la izquierda
• ROR: Rota a la derecha
• SAL: Corrimiento algebraico a la izquierda
• SAR: Corrimiento algebraico a la derecha
• SHL: Corrimiento lógico a la izquierda
• SHR: Corrimiento lógico a la derecha
• SHLD/SHRD: Corrimiento en doble precisión (80386 y posteriores)

Comparación

• BSF/BSR: Exploración de bit (80386 y posteriores)
• BT/BTC/BTR/BTS: Prueba bit (80386 y posteriores)
• CMP: Compara
• CMPS: Compara cadenas de caracteres
• TEST: Prueba bits

Transferencia de datos

• LDS: Carga el registro del segmento de datos
• LEA: Carga una dirección efectiva
• LES: Carga el registro de segmento extra
• LODS: Carga una cadena
• LSS: Carga el registro del segmento de la pila
• MOV: Mueve datos
• MOVS: Mueve cadenas
• MOVSX: Mueve con signo-extendido
• MOVZX: Mueve con cero-extendido
• STOS: Almacena una cadena
• XCHG: Intercambia
• XLAT: Traduce

Operaciones con banderas

• CLC: Limpia la bandera de acarreo
• CLD: Limpia la bandera de dirección
• CLI: Limpia la bandera de interrupción
• CMC: Complementa la bandera de acarreo
• LAHF: Carga AH de las banderas
• POPF: Remueve banderas de la pila
• PUSHF: Agrega banderas a la pila
• SAHF: Almacena el contenido de AH en las banderas
• STC: Establece la bandera de acarreo
• STD: Establece la bandera de dirección
• STI: Establece la bandera de interrupción

Entrada/Salida

• IN: Introduce un byte o una palabra
• OUT: Saca un byte o una palabra

Operaciones lógicas

• AND: Conjunción lógica (y)
• NOT: Negación lógica (no)
• OR: Disyunción lógica (o)
• XOR: Disyunción exclusiva

Ciclos

• LOOP: Repetir el ciclo hasta que se complete
• LOOPE/LOOPZ: Repetir el ciclo mientras sea igual/mientras sea cero
• LOOPNE/LOOPNZ: Repetir el ciclo mientras no sea igual/mientras no sea cero

Control del procesador

• ESC: Escape
• HLT: Introduce un estado de detención
• LOCK: Bloquea el bus
• NOP: No operar
• WAIT: Pone al procesador en estado de espera

Operaciones con la pila

• POP: Remueve una palabra de la pila
• POPA: Remueve todos los registros generales (80286 y posteriores)
• PUSH: Agrega a la pila
• PUSHA: Agrega todos los registros generales (80286 y posteriores)

Operaciones con cadenas

• CMPS: Compara cadenas
• LODS: Carga cadena
• MOVS: Mueve cadena
• REP: Repite una cadena
• REPE/REPZ: Repite mientras sea igual/mientras sea cero
• REPNE/REPNZ: Repite mientras no sea igual/mientras no sea cero
• SCAS: Explora una cadena
• STOS: Almacena una cadena

Transferencia (condicional)

• INTO: Interrumpe si hay desbordamiento
• JA/JNBE: Bifurca (salta) si es mayor o salta si no es menor o igual
• JAE/JNB: Salta si es mayor o igual o salta si no es menor
• JB/JNAE: Salta si es menor o salta si no es mayor o igual
• JBE/JNA: Salta si es menor o igual o salta si no es mayor
• JC/JNC: Salta si hay acarreo o salta si no hay acarreo
• JCXZ: Salta si CX es cero
• JE/JZ: Salta si es igual o salta si es cero
• JG/JNLE: Salta si es mayor o salta si no es menor o igual
• JGE/JNL: Salta si es mayor o igual o salta si no es menor
• JL/JNGE: Salta si es menor o salta si no es mayor o igual
• JLE/JNG: Salta si es menor o igual o salta si no es mayor
• JNE/JNZ: Salta si no es igual o salta si no es cero
• JNP/JPO: Salta si no hay paridad o salta si la paridad es impar
• JO/JNO: Salta si hay desbordamiento o salta si no hay desbordamiento
• JP/JPE: Salta si hay paridad o salta si la paridad es par
• JS/JNS: Salta si el signo es negativo o salta si el signo es positivo

Transferencia (incondicional)

• CALL: Llama a un procedimiento
• INT: Interrupción
• IRET: Interrupción de regreso
• JMP: Salto incondicional
• RET: Regreso
• RETN/RETF: Regreso cercano o regreso lejano

Conversión de tipo

• CBW: Convierte byte a palabra
• CDQ: Convierte palabra doble a palabra cuádruple (80386 y posteriores)
• CWD: Convierte palabra a palabra doble
• CWDE: Convierte una palabra a una palabra doble extendida

Interrupciones

Interrupciones

      Algunas veces el flujo ordinario de un programa debe ser interrumpido para procesar eventos que requieren una respuesta rápida. El hardware de un computador provee un mecanismo llamado interrupción para manipular estos eventos. Por ejemplo cuando se mueve el ratón la interrupción de hardware del ratón es el programa actual para manejar el movimiento del ratón (para mover el cursor del mouse, etc) Las interrupciones hacen que el control se pase a un manipulador de interrupciones. Los manipuladores de interrupciones son rutinas que procesan la interrupción. A cada tipo de interrupción se le asigna un numero entero. En el comienzo de la memoria física una tabla de vectores de interrupción que contiene la dirección del segmento de los manipuladores de la interrupción. El numero de la interrupción es esencialmente un indice en esta tabla.

Interrupciones internas de hardware

Las interrupciones internas son generadas por ciertos eventos que surgen durante la ejecución de un programa.

Este tipo de interrupciones son manejadas en su totalidad por el hardware y no es posible modificarlas.

Un ejemplo claro de este tipo de interrupciones es la que actualiza el contador del reloj interno de la computadora, el hardware hace el llamado a esta interrupción varias veces durante un segundo para mantener la hora actualizada.

Aunque no podemos manejar directamente esta interrupción (no podemos controlar por software las actualizaciones del reloj), es posible utilizar sus efectos en la computadora para nuestro beneficio, por ejemplo para crear un "reloj virtual" actualizado continuamente gracias al contador del reloj interno. Únicamente debemos escribir un programa que lea el valor actual del contador y lo traduzca a un formato entendible para el usuario.


Interrupciones externas de hardware

Las interrupciones externas las generan los dispositivos periféricos, como pueden ser: teclado, impresoras, tarjetas de comunicaciones, etc. También son generadas por los co-procesadores.

No es posible desactivar a las interrupciones externas.

Estas interrupciones no son enviadas directamente a la UCP, sino que se mandan a un circuito integrado cuya función es exclusivamente manejar este tipo de interrupciones. El circuito, llamado PIC 8259A, si es controlado por la UCP utilizando para tal control una serie de vías de comunicación llamadas puertos.

Interrupciones de software

Las interrupciones de software pueden ser activadas directamente por el ensamblador invocando al número de interrupción deseada con la instrucción INT.

El uso de las interrupciones nos ayuda en la creación de programas, utilizándolas nuestros programas son más cortos, es más fácil entenderlos y usualmente tienen un mejor desempeño debido en gran parte a su menor tamaño.

Este tipo de interrupciones podemos separarlas en dos categorías: las interrupciones del sistema operativo DOS y las interrupciones del BIOS.

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.

Interrupciones mas usuales
  • Int 21H (interrupción del DOS)
  • Int 10H (interrupción del BIOS)
  • Int 16H (Interrupción del BIOS)
Interrupción 21H

Propósito: Llamar a diversas funciones del DOS.

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.

Funciones para desplegar información al vídeo.
  • 02H Exhibe salida
  • 09H Impresión de cadena (vídeo)
  • 40H Escritura en dispositivo/Archivo

Funciones para leer información del teclado.

  • 01H Entrada desde teclado
  • 0AH Entrada desde teclado usando buffer
  • 3FH Lectura desde dispositivo/archivo

Funciones para trabajar con archivos.

En esta sección únicamente se expone la tarea específica de cada función, para una referencia acerca de los conceptos empleados refierase a la unidad 7, titulada: "Introducción al manejo de archivos".

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

Interrupción 10H

Propósito: Llamar a diversas funciones de vídeo del BIOS.

Sintaxis: Int 10H
Esta interrupción tiene diversas funciones, todas ellas nos sirven para controlar la entrada y salida de vídeo, la forma de acceso a cada una de las opciones es por medio del registro AH.

Funciones comunes de la interrupción 10H.(algunas de las funciones de esta interrupción)

  • 02H Selección de posición del cursor
  • 09H Escribe atributo y carácter en el cursor
  • 0AH Escribe carácter en la posición del cursor
  • 0EH Escritura de caracteres en modo alfanumérico
Interrupción 16H

Propósito: Manejar la entrada/salida del teclado.

Sintaxis: Int 16H

Veremos dos opciones de la interrupción 16H, estas opciones, al igual que las de otras interrupciones, son llamadas utilizando el registro AH. 

Funciones de la interrupción 16H

  • 00H Lee un carácter de teclado
  • 01H Lee estado del teclado
Código para limpiar pantalla

       MOV AX,0600H ;RECORRER TODO LA PANTALLA
       MOV BH,07H ;ATRIBUTO FONDO NEGRO LETRAS BLANCAS
       MOV CX,0000H ;POSICIÓN IZQUIERDA SUPERIOR
       MOV DX,184FH ;POSICIÓN DERECHA INFERIOR
       INT 10H ;INTERRUPCIÓN 

Ensamblar, Enlazar y Ejecutar un programa en Lenguaje Ensamblador.

Ensamblar

     Consiste en la traduccion del codigo fuente(archivo.asm) en codigo objeto ( archivo .obj) y la generacion de un archivo intermedio. Cuando se ensambla se crean dos extensiones .obj y .lst.

     Para enlazar un programa en caso de ser por medio de doxbox se entra en la carpeta de donde se encuentra el ensamblador y el linkeador (enlazador)


Luego de abrir la carpeta TD se coloca el siguiente comando para ensamblar el codigo TASM /zd/zi nombre y le dan enter no les debe arrojar errores ni nada si por alguna razón les arroja un error les dirá la linea en la cual da el error y hasta que no lo corrijan no lo ensamblara 


Enlazar

    El programa para enlazar toma el codigo objeto (.obj) generado por el ensamblado y le añade los encabezados apropiados para crear otro archivo que va hacer el ejecutable y crea las extensiones .exe y .map 

      Para linkearlo se escribe el siguiente comando TLINK /v/s nombre y enter 


Ejecutar

     Para ejecutar, el programa crea un psp inmediatamente antes de que el programa este cargado en memoria.

       Para ver la ejecucion del programa paso a paso y lo que va haciendo en cada instruccion se entra al turbo debugger se coloca td nombre y entre y abre una pantalla asi


Para ejecutar paso a paso F7, para cambiar de pantalla de las cuarto que sales F6, para ejecutar el programa completo F9  y para ver lo que hace el programa si se usaron interrupciones de texto y de video solo se coloca el nombre y enter mas adelante se hablara de las interrupciones

Ejemplo sencillo

Ejemplo de separar numero pares de impares                         .model small .stack 100h      ;tamaño de l...