jueves, 28 de febrero de 2019

1. Uso de libreria emu8086 (parte 2)

Programa 1: Al introducir la edad, compara si es mayor o menor de edad.

Código:

;De : Ambrocio Isaias
org 100h

.model small
.stack
.data                        
include "emu8086.inc"            
num1 db 0; variable para la edad
.code
inicio proc far
    
    ;poner el primer letrero
    print " Ingrese su edad: ";macro print
    
    ;lectura del valor
    call scan_num ;llamada al proc de la libreria para pedir un valor
    mov num1,cl
    
    ;lectura segundo valor
    

    xor ax,ax ;limpiar el registro ax
    mov al,num1
    cmp al,18d ;Si lo que se encuentra en al>18 
    JGE mayor ;salta a mayor
    JMP menor ;sino ve a menor  
    
    mayor:
        printn " "
        print "Eres mayor de edad"
        jmp final
    menor:
        printn " "
        print "Eres menor de edad"
               
        jmp final
           
           
    final:  
         print " "
         printn " "
         print "Presiona enter para salir..."
         mov ah,0 ;servicios de lectura de una pulsación de teclado
         int 16h  ;Invoca a servicios de teclado
         mov ah,4ch
         int 21h
         ret
define_print_string
define_print_num
define_print_num_uns ;para recibir numeros decimales
define_scan_num  ;del procedimiento scan_num
endp inicio

end


Resultado:





Programa 2: Nos permitirá mostrar si hemos aprobado o reprobado alguna asignatura en base a una calificación.

Código:


;De : Ambrocio Isaias
.MODEL SMALL
.STACK 64
.DATA  
    include "emu8086.inc"
    
    nota db 0

    
.CODE   
OPERACIONES PROC FAR ;DECLARACION DE PROCEDIMIENTO    
 
    ;MUESTRO EL MENSAJE         
    print " " ;usa macro print para un espacio
    print "Ingrese la calificacion: " ;macro imprime
    
    call scan_num    ;Leo el numero
    mov nota,cl      ;lo guardo en nota
    
    xor ax,ax        ;borro el contenido de ax
    mov al,nota      ;muevo nota a al
    
    CMP AL,70d       ;comparo al con 70
    JGE MAYOR        ;si es mayor o igual pasa a mayor
    JMP MENOR        ;si no a menor
        
   MAYOR:
    printn " "    
    print "Aprobado"
    JMP SALIR 
        
   MENOR:   
    printn " "    
    print "Reprobado"
    JMP SALIR
    
   SALIR:
         print " "
         printn " "
         gotoxy 10,10  ;coloco el cursor en las coordenadas 10x,10y
         print "Presiona enter para salir..." ;imprimo despues este mensaje
         mov ah,0  ;servicio de lectura de pulsacion de tecla
         int 16h   ;invoca servicios de teclado
         mov ah,4ch
         int 21h
         ret
       
OPERACIONES ENDP   

define_print_string
define_print_num
define_print_num_uns
define_scan_num    
    
END   



Resultado:





Programa 3: Suma de dos números, uso de la libreria emu8086.inc.


Código:

;De: Isaias Ambrocio
org 100h

name "suma de dos numeros"
include "emu8086.inc"
org 100h

.data
suma db 2 dup (?) ;manera de declarar un arreglo de 2 lugares 
.code
sumas proc     
    
    print " Introduce el primer numero: " ;macro de la lib
    call scan_num ;llamada a un procedimiento para pedir un num
    mov suma[0],cl ;mueve el valor de cl a la posicion 0 del array   
    printn " " ;macro que imprime un espacio 
    print " Introduce el segundo numero: " ;macro que imprime un letrero
    
    call scan_num ;llamada a un procedimiento para pedir num
    mov suma[1],cl ;;mueve el valor de cl a la posicion 1 del array   
    xor ax,ax ;xor nemonico que limpia registros
    
    add al,suma[0] ;valor de suma pos 0 []
    add al,suma[1] ;valor de suma pos 1
    
    printn " " ;macro de la libreria pone un espacio y retorno 
    print " La suma es: " ;macro que imprime un letrero 
   
    call print_num ;llamada a un procedimiento para imprimir un num del reg ax
sumas endp
exit:
    print " "
    printn " "
    print "Presiona enter para salir..."
    mov ah,0  ;servicio de pulsación de teclado
    int 16h   ;invoca a servicios de taclado
    ret
define_print_string ;no se uso
define_print_num ;es del print_num
define_print_num_uns ;conversion a decimal del scan_num
define_scan_num ;procedimiento del scan_num(macro)
end

ret


Resultado:


miércoles, 27 de febrero de 2019

1.6 MODOS DE DIRECCIONAMIENTO


Los modos de direccionamiento son las diferentes maneras de especificar un operando dentro de una instrucción en lenguaje ensamblador. Un modo de direccionamiento especifica la forma de calcular la dirección de memoria efectiva de un operando mediante el uso de la información contenida en registros y/o constantes, contenida dentro de una instrucción de la máquina o en otra parte.

Tipos de direccionamiento

Registro:

Sirve para especificar operandos que están en registros.


Implícito: 
En este modo de direccionamiento no es necesario poner ninguna dirección de forma explícita, ya que en el propio código de operación se conoce la dirección de el/los operando/s al (a los) que se desea acceder o con el/los que se quiere operar.

Inmediato: 
En la instrucción está incluido directamente el operando.
En este modo el operando es especificado en la instrucción misma. En otras palabras, una instrucción de modo inmediato tiene un campo de operando en vez de un campo de dirección. El campo del operando contiene el operando actual que se debe utilizar en conjunto con la operación especificada en la instrucción. Las instrucciones de modo inmediato son útiles para inicializar los registros en un valor constante.
Cuando el campo de dirección especifica un registro del procesador, la instrucción se dice que está en el modo de registro. Su valor es fijo, por lo que se suele utilizar en operaciones aritméticas o para definir constantes y variables. Como ventaja, no se requiere acceso adicional a memoria para obtener el dato, pero el tamaño del operando está limitado por el tamaño del campo de direccionamiento.
Las desventajas principales son que el valor del dato es constante y el rango de valores que se pueden representar está limitado por el tamaño de este operando.

Indirecto:
El campo de operando contiene una dirección de memoria, en la que se encuentra la dirección efectiva del operando.
Si hace referencia a un registro de la máquina, la dirección de memoria (dirección efectiva) que contiene el dato estará en este registro y hablaremos de direccionamiento indirecto a registro; si hace referencia a una posición de memoria, la dirección de memoria (dirección efectiva) que contiene el dato estará almacenada en esta posición de memoria y hablaremos de direccionamiento indirecto a memoria.
La desventaja principal de este modo de direccionamiento es que necesita un acceso más a memoria que el directo. Es decir, un acceso a memoria para el direccionamiento indirecto a registro y dos accesos a memoria para el direccionamiento indirecto a memoria; por este motivo este segundo modo de direccionamiento no se implementa en la mayoría de las máquinas.

martes, 26 de febrero de 2019

1.5 LLAMADAS A SERVICIOS DEL SISTEMA



LLamada al sistema

Una llamada al sistema es un método o función que puede invocar un proceso para solicitar un cierto servicio al sistema operativo. Dado que el acceso a ciertos recursos del sistema requieren la ejecución de código en modo privilegiado, el sistema operativo ofrece un conjunto de métodos o funciones que el programa puede emplear para acceder a dichos recursos. En otras palabras, el sistema operativo actúa como intermediario, ofreciendo una interfaz de programación (API) que el programa puede usar en cualquier momento para solicitar recursos gestionados por el sistema operativo.


Una interrupción es un mecanismo que permite ejecutar un bloque de instrucciones interrumpiendo la ejecución de un programa, y luego restablecer la ejecución del mismo sin afectar directamente.

Cada interrupción tiene varias funciones, y podremos elegir cuál ejecutamos según el valor de AH.
21h: Invoca a todos los servicios de llamada a función DOS, generalmente usado en combinación con otros servicios para la entrada o salida de datos.
20h: Invoca al servicio de terminación de programa del DOS (termina un programa, como el exit).
10h: Despliega opciones de video
16h: Esta interrupción se encarga de controlar el teclado del PC.

Servicios:

Un servicio es el valor (selector del que hablamos anteriormente), este nos proporciona la facilidad para realizar varias tareas, desde una simple inserción de datos, hasta el hecho de modificar propiedades del display.
Funciones para desplegar información
02H Exhibe salida
Uso: Despliega un carácter a la pantalla.
Registros de llamada:
AH = 02H
DL = Valor del caracter a desplegar.

09H Impresión de cadena
Uso: Despliega una cadena de caracteres en la pantalla.
Registros de llamada:
AH = 09H
DS:DX = Dirección de inicio de una cadena de caracteres
4ch: Termina un programa pero antes retorna el control si es que este programa fue invocado por otro programa. 
Referencias:

1.4 CONCEPTO DE INTERRUPCIONES


CONCEPTO DE INTERRUPCIONES


Una interrupción es una situación especial que suspende la ejecución de un programa de modo que el sistema pueda realizar una acción para tratarla. Tal situación se da, por ejemplo, cuando un periférico requiere la atención del procesador para realizar una operación de E/S.

Las interrupciones constituyen quizá el mecanismo más importante para la conexión del microcontrolador con el mundo exterior, sincronizando la ejecución de programas con acontecimientos externos.


PASOS PARA EL PROCESAMIENTO

1. Terminar la ejecución de la instrucción máquina en curso.

2. Salva el valor de contador de programa, IP, en la pila, de manera que en la CPU, al terminar el proceso, pueda seguir ejecutando el programa a partir de la última instrucción.

3. La CPU salta a la dirección donde está almacenada la rutina de servicio de interrupción (ISR, Interrupt Service Routine) y ejecuta esa rutina que tiene como objetivo atender al dispositivo que generó la interrupción.

4. Una vez que la rutina de la interrupción termina, el procesador restaura el estado que había guardado en la pila en el paso 2 y retorna al programa que se estaba usando anteriormente.

EJEMPLOS DE INTERRUPCIONES

int 01h-->un solo paso
int 02h-->interrupcion no enmascarable
int 03h--> punto de interrupcion
int 04h-->desbordamiento
int 05h-->impresion de pantalla
int 08h-->Cronometro
int 15h-->Servicios del sistema
int 16h-->Funciones de entrada del teclado
int 18h-->Entrada con el Basic de Rom
int 19h-->Cargador ed arranque
int 1Ah-->Leer y establecer la hora
int 1Bh-->Obtener el control con una interrupcion de teclado.
int 2oh-->Terminar un programa

int 33h->Funciones del Raton

1.3 MEMORIA (RAM)



RAM



La memoria principal o primaria, "Memoria Central ", es aquella memoria de un ordenador, donde se almacenan temporalmente tanto los datos como los programas que la CPU está procesando o va a procesar en un determinado momento. Se denomina Memoria a los circuitos que permiten almacenar y recuperar la información. En un sentido más amplio, puede referirse también a sistemas externos de almacenamiento, como las unidades de disco o de cinta. Memoria de acceso aleatorio o RAM (Random Access Memory) es la memoria basada en semiconductores que puede ser leída y escrita por el microprocesador u otros dispositivos de hardware. El acceso a las posiciones de almacenamiento se puede realizar en cualquier orden.

Este tipo de memoria puede ser borrada y grabada las veces que deseemos. La única desventaja es que la información grabada en ella solo puede ser utilizada mientras tenga energía. En cuanto se corte la alimentación, los datos que se grabaron se borrarán instantáneamente. Se usan solo como almacenamiento temporal.

La RAM tiene dos modos de operación posibles:

  • RAM estática: flips-flops internos que almacenan información binaria. La información almacenada es válida mientras la unidad está encendida.
  • RAM dinámica: conjunto de pequeños condensadores que pueden estar cargados o descargados. Debe refrescarse cada pocos milisegundos para impedir la pérdida de información. Tienen mayor capacidad que las estáticas.


Características de la Memoria Principal (RAM)

Un sistema de memoria se puede clasificar en función de muy diversas características. Entre ellas podemos destacar las siguientes: localización de la memoria, capacidad, método de acceso y velocidad de acceso. En el caso de la memoria RAM (también denominada memoria principal o primaria) se puede realizar la siguiente clasificación:

  • Localización: Interna (se encuentra en la placa base)
  • Capacidad: Hoy en día no es raro encontrar ordenadores PC equipados con 64, 128 ó 256 Mb de memoria RAM.
  • Método de acceso: La RAM es una memoria de acceso aleatorio. Esto significa que una palabra o byte se puede encontrar de forma directa, sin tener en cuenta los bytes almacenados antes o después de dicha palabra (al contrario que las memorias en cinta, que requieren de un acceso secuencial). 
  • Velocidad de acceso: Actualmente se pueden encontrar sistemas de memoria RAM capaces de realizar transferencias a frecuencias del orden de los Gbps (gigabits por segundo).



Según los tipos de conectores que lleve la memoria, al conjunto de éstos se les denominan módulos, y éstos a su vez se dividen en:
  • SIMM (Single In-line Memory Module): Pequeña placa de circuito impreso con varios chips de memoria integrados. Se fabrican con diferentes velocidades de acceso capacidades (4, 8, 16, 32, 64 Mb) y son de 30 ó 72 contactos. Se montan por pares generalmente.
  • DIMM: Son más alargados, cuentan con 168 contactos y llevan dos muescas para facilitar su correcta colocación. Pueden montarse de 1 en 1.



Referencia:
https://leo-yac.wixsite.com/lenguaje-ensamblador/la-memoria-principal-ram
http://blogjazz21.blogspot.com/2017/03/13-la-memoria-principal-ram.html

1.2 EL PROCESADOR Y SUS REGISTROS INTERNOS



Definición de registros:

Un registro es una memoria de alta velocidad y poca capacidad, integrada en el microprocesador, que permite guardar transitoriamente y acceder a valores muy usados, generalmente en operaciones matemáticas.

Función de los registros:

  • Los registros están en la cumbre de la jerarquía de memoria, y son la manera más rápida que tiene el sistema de almacenar datos. Los registros se miden generalmente por el número de bits que almacenan; por ejemplo, un "registro de 8 bits" o un "registro de 32 bits“.
  • La CPU contiene un conjunto de localidades de almacenamiento temporal de datos de alta velocidad llamada registro. Algunos de los registros están dedicados al control, y solo la unidad de control tiene acceso a ellos. Los registros restantes son los registros de uso general y el programador es el usuario que tiene acceso a ellos.


Algunos registros básicos:






Registros de Propósito General


Los registros de propósito general son el AX, BX, CX, y DX, de 16 bits. Cada uno de ellos se divide en dos registros de 8 bits, llamados AH y AL, BH y BL, CH y CL, y, DH y DL, H significando High (alto) y L significando Low (bajo), indicando la parte alta o la parte baja del registro correspondiente de 16 bits. Un programa podía usar tanto los registros de 16 bits como los registros de 8 bits. 


  • Registro AX: El registro AX es el registro acumulador, es utilizado para operaciones que implican entrada/salida, multiplicación y división (estas dos últimas en conjunto con el registro DX)(operaciones aritméticas)
  • Registro BX: El registro BX es el registro base, y es el único registro de propósito general que puede ser un índice para direccionamiento indexado.Se usa para indicar un desplazamiento.
  • Registro CX: El registro CX es conocido como el registro contador. Puede contener un valor para controlar el número de veces que un ciclo se repite o un valor para corrimiento de bits.Se usa como contador en los bucles.
  • Registro DX: El registro DX es el registro de datos. En algunas operaciones se indica mediante este registro el número de puerto de entrada/salida, y en las operaciones de multiplicación y división de 16 bits se utiliza junto con el acumulador AX. También se usa en las operaciones aritméticas.


Registros Índice


Los registros SI y DI están disponibles para direccionamiento indexado y para operaciones de cadenas de caracteres.

  • Registro SI: El registro índice fuente de 16 bits es requerido por algunas operaciones con cadenas de caracteres. El SI está asociado con el segmento DS.
  • Registro DI: El registro índice destino también es requerido por algunas operaciones con cadenas de caracteres. El DI está asociado con el segmento ES.



Registros Apuntadores


Los registros SP (apuntador de pila) y BP (apuntador base) están asociados con el registro SS y permiten al sistema acceder a datos en el segmento de la pila.
  • Registro SP: El apuntador de pila de 16 bits está asociado con el segmento SS y proporciona un valor de desplazamiento que se refiere a la palabra actual que está siendo procesada en la pila. Contiene la dirección relativa al segmento de la pila. El sistema maneja de manera automática este registro, aunque el programa puede hacer ciertas manipulaciones con él.
  • Registro BP: El apuntador base de 16 bits facilita la referencia de parámetros dentro de la pila.Se utiliza para fijar el puntero de pila y así poder acceder a los elementos de la pila.



Registros de segmentos

  • Registro CS: Registro de segmento de código. Indica la dirección de una instrucción que es buscada para su ejecución. 
  • Registro  DS: Registro de segmento de datos.Contiene la dirección del área de memoria donde se encuentran los datos del programa.
  • Registro ES: Registro de segmento extra. Contiene la dirección del segmento extra. Se trata de un segmento de datos adicional que se utiliza para superar la limitación de los 64Kb del segmento de datos y para hacer transferencias de datos entre segmentos.
  • Registro SS: Registro de segmento de pila. Contiene la dirección del segmento de pila. La pila es un espacio de memoria temporal que se usa para almacenar valores de 16 bits (palabras).


Puntero de instrucciones:


IP: Registro puntero de instrucción o contador de programa (PC). Contiene el desplazamiento de la siguiente instrucción a ejecutar respecto al segmento de código en ejecución. Por lo tanto, la dirección completa de la siguiente instrucción sería CS:IP. La única forma de influir en este registro es de forma indirecta mediante instrucciones de bifurcación.

Registro de banderas (flags):

Cada bandera es un bit y se usa para registrar la información de estado y de control de las operaciones del microprocesador. Hay nueve banderas (los 7 bits restantes no se utilizan):

Banderas de estado:

Registran el estado del procesador, normalmente asociado a una comparación o a una instrucción aritmética.

  • CF (Carry Flag): Bandera de acareo.
  • OF (Overflow Flag): Bandera de desbordamiento (aritmético).
  • ZF (Zero Flag): Bandera de resultado 0 o comparación igual.
  • SF (Sign Flag): Bandera de resultado o comparación negativa.
  • PF (Parity Flag): Bandera de paridad (número par de bits).
  • AF (Auxiliary Flag): Bandera auxiliar. Indica si hay necesidad de ajuste en las operaciones aritméticas con números BCD.


Banderas de control:

  • DF  (Direction Flag): Bandera de dirección. Controla la dirección de las operaciones con cadenas de caracteres (sentido de avance ascendente/descendente). Incrementando o decrementando automáticamente los registros índices (SI y DI)
  • IF (Interrupt Flag): Bandera de interrupciones. Indica si están permitidas o no las interrupciones de los dispositivos
  • externos.
  • TF (Trap Flag): Bandera de atrape. Controla la operación de modo paso a paso (usada por el programa DEBUG).



Referencia:
http://galia.fc.uaslp.mx/~cantocar/ARQUI_COM_II/LIBRO%20IBM-PC/03.htm
http://www.geocities.ws/antrahxg/documentos/org_comp/registro.html
https://www.monografias.com/trabajos7/regi/regi.shtml

lunes, 25 de febrero de 2019

1 .Registro de Banderas ensamblador 8086

Registro de banderas:


Es un registro de 16 bits, de los cuales nueve sirven para indicar el estado actual de la maquina y el resultado del procedimiento.

Cada bandera es un bit y se usa para registrar la información de estado y de control de las operaciones del microprocesador. Hay nueve banderas (los 7 bits restantes no se utilizan):

Banderas de estado:
Registran el estado del procesador, normalmente asociado a una comparación o a una instrucción aritmética.

  • CF (Carry Flag): Bandera de acarreo.
  • OF (Overflow Flag): Bandera de desbordamiento (aritmético).
  • ZF (Zero Flag): Bandera de resultado 0 o comparación igual.
  • SF (Sign Flag): Bandera de resultado o comparación negativa.
  • PF (Parity Flag): Bandera de paridad (número par de bits).
  • AF (Auxiliary Flag): Bandera auxiliar. Indica si hay necesidad de ajuste en las operaciones aritméticas con números BCD.


Banderas de control:
  • DF  (Direction Flag): Bandera de dirección. Controla la dirección de las operaciones con cadenas de caracteres (sentido de avance ascendente/descendente). Incrementando o decrementando automáticamente los registros índices (SI y DI)
  • IF (Interrupt Flag): Bandera de interrupciones. Indica si están permitidas o no las interrupciones de los dispositivos
  • externos.
  • TF (Trap Flag): Bandera de atrape. Controla la operación de modo paso a paso (usada por el programa DEBUG).



► vídeo
[008] Registro de Banderas | Banderas en Ensamblador 8086




Programa 1:

Código:


cf:bandera de acarreo
programa: .model small .stack .data .code mov al, 2 ;1 mov bl, 2 ;4 sub al, bl .exit end

La bandera ZF sirve para indicar que el valor del resultado es cero:






Programa 2:

Código:



org 100h

.model small
.stack
.data

.code
     mov al,255
     mov bl,1
     add al,bl
     
.exit
end


Para activar la bandera CF haremos una suma, una suma entre 2 números, en este caso 255 + 1, de manera que supere el límite del registro inferior.



Programa 3:

Código:

org 100h

org 100h

.model small
.stack
.data

.code
     
     mov al,1
     mov bl,4
     sub al,bl

.exit
end

ret




En el caso de SF esta se encenderá al obtener un resultado negativo en los registros:



Programa 4:

.model small
.stack
.data
.code
    mov al,100
    mov bl,50
    add al,bl

.exit
end          
     

La bandera OF se llevara a cabo cada vez que se lleve a cabo un acarreo de unidad aritmético, ejemplo, si sumamos 100 + 50, tendremos un acarreo de 5 decenas en la parte de la suma para generar el numero 150.
   

1. Resta de dos números.


Programa 1: Uso de la libreria emu8086, para realizar una resta.

Código:

name "Resta de dos numeros"
include "emu8086.inc"
org 100h

.data
resta db 2 dup (?)
.code
sumas proc
    print " Introduce el primer numero: "
    call scan_num
    mov resta[0],cl 
    printn " " 
    print " Introduce el segundo numero: "
    call scan_num
    mov resta[1],cl
    xor ax,ax
    mov al,resta[0]
    sub al,resta[1]
    printn " "
    print " La resta es: "
    call print_num
sumas endp
exit:
    print " "
    printn " "
    print "Presiona enter para salir..."
    mov ah,0  ;servicio de pulsación de teclado
    int 16h   ;invoca a servicios de taclado
    ret
define_print_string
define_print_num
define_print_num_uns
define_scan_num
end



Proceso:




Resultado:





1. Programa que realiza: suma, resta, división y multiplicación



Programa: Suma, resta, división y multiplicación

Código:

;por: alex gutierrez 
; suma, resta, multiplicacion y division sin tomar en cuenta el acarreo
; el 13,10 es un salto de linea

.model small
.stack 100
.data
msj1 db 'Numero 1: ','$'
msj2 db 13,10,'Numero 2: ','$'
msj3 db 13,10,'Suma: ','$'
msj4 db 13,10,'Resta: ','$'
msj5 db 13,10,'Multiplicacion: ','$'
msj6 db 13,10,'Division: ','$'
linea db 13,10,'$'
var1 db 0
var2 db 0
.code
.startup

call limpia
mov ah,09h
lea dx, msj1 ;desplegar numero 1:
int 21h

call leer ;lee primer numero
sub al,30h ;restar 30h para obtener el numero
mov var1,al ;lo guardo en var1
mov ah,09h
lea dx, msj2 ;desplegar numero 2:
int 21h

call leer ;lee segundo numero
sub al,30h ;restar 30h para obtener segundo valor
mov var2,al ;guardar en var2
mov bl,var2 ;mover a bl

;******************* SUMA
add bl,var1 ; realizo la suma de var2(bl) y var1 y el resultado queda en bl
mov ah,09h
lea dx,msj3 ;imprimir suma
int 21h
mov dl,bl ;pongo en dl el numero a imprimir var2(bl)
add dl,30h ; agrego 30h para obtener el caracter    
mov ah,02h ;imprime un caracter
int 21h

;******************RESTA
mov bl,var1
sub bl,var2
mov ah,09h
lea dx,msj4 ;desplegar resta:
int 21h
mov dl,bl ;mover resta a dl para imprimir
add dl,30h ;sumar 30 para obtener caracter
mov ah,02h ;imprimir un caracter
int 21h

;******************MULTIPLICACION
mov ah,09h
lea dx,msj5 ;desplegar mult
int 21h

mov al,var1 
mov bl,var2
mul bl ;mult al=al*bl
mov dl,al ;mover al a dl para imprimir
add dl,30h ;sumar 30 para obtener caracter
mov ah,02h ;imprimir caracter
int 21h

;*****************DIVISION
mov ah,09h
lea dx,msj6 ;desplegar div
int 21h
xor ax,ax ;limpiamos el registro ax. 
mov al,var2
mov bl,al
mov al,var1
div bl ; divide AX/BX el resultado lo almacena en AX, el residuo queda en DX
mov bl,al
mov dl,bl
add dl,30h
mov ah,02h
int 21h
.exit

; ****************PROCEDIMIENTOS
salto proc near
mov ah,09h
lea dx,linea
int 21h
mov dl,00h
ret
salto endp

leer proc near
mov ah,01h;leer caracter desde el teclado
int 21h;lee primer caracter
ret
leer endp

limpia proc near
mov ah,00h
mov al,03h
int 10h
ret
limpia endp
end




miércoles, 20 de febrero de 2019

1. Uso de libreria emu8086 (parte 1)



Programas con Uso de librerías en Ensamblador 


Para facilitar la programación, hay algunas funciones comunes que pueden incluirse en su programa. Para hacer que su programa utilice funciones definidas en otro archivo, debe usar la directiva INCLUDE seguida de un nombre de archivo. El compilador busca automáticamente el archivo en la misma carpeta donde se encuentra el archivo de origen, y si no puede encontrar el archivo allí, busca en la carpeta Inc. 

Para usar cualquiera de las funciones en emu8086.inc, debe tener la siguiente línea al comienzo de su archivo fuente: 

 include 'emu8086.inc' 

Referencias externas al módulo: 


Son imprescindibles si se hace un programa en alto nivel con procedimientos en assembler. Hay tres: PUBLIC, EXTRN e INCLUDE

PUBLIC nombre[, nombre...]: Estos nombres simbólicos se escriben en el archivo objeto. Durante una sesión con el linker, los símbolos en diferentes módulos pero con los mismos nombres tendrán la misma dirección. 

EXTRN nombre:tipo [,nombre:tipo...]: Define una variable externa con el nombre y tipo (NEAR, FAR, BYTE, WORD, DWORD o ABS (número constante especificado con la directiva EQU o =)) especificado. El tipo debe ser el mismo que el del ítem indicado con la directiva PUBLIC en otro módulo. 
INCLUDE nombre_de_archivo: Ensambla las sentencias indicadas en dicho archivo. 

emu8086.inc define las siguientes macros : 

PRINT string - macro con 1 parámetro, imprime una cadena. 
PRINTN string - macro con 1 parámetro, imprime una cadena. Lo mismo que PRINT pero agrega automáticamente "retorno de carro" al final de la cadena. 
PUTC char - macro con 1 parámetro, imprime un carácter ASCII en la posición actual del cursor. 
GOTOXY col, fila - macro con 2 parámetros, establece la posición del cursor. 
CURSOROFF - apaga el cursor de texto. 
CURSORON - enciende el cursor de texto.


Ensamblador: Suma de dos números


Este código fue tomado del siguiente vídeo:


Código:


;include para añadir librerias http://jbwyatt.com/253/emu/asm_tutorial_05.html
;gmo
name 'Suma de dos numeros'
include 'emu8086.inc' ;nombre del programa 
org 100h              ;agregamos libreria emu8086.inc

.data     ;se abre el bloque de datos
suma db 2 dup (?) ;arreglo suma de 2 espacios(byte)

.code    ;directiva indica la continuacion del prog
Sumas proc     ;proceso Sumas
    printn " "
    print "Introduce el primer numero ==>"
    call scan_num  ;recibe los valores
    mov suma[0], cl;recibe de scan_num cl y se mandan a las posiciones del arreglo
    printn " "
    print "Introduce el segundo numero ==>"
    call scan_num
    mov suma[1], cl
    printn " "
    xor ax, ax  ;limpia el registro ax
    add al, suma[0]   ;manda la suma al registro al para poder imprimir con print_num
    add al, suma[1]
    printn " "
    print "La suma es: "
    call print_num
Sumas endp

exit:       ;etiqueta salir
    print ""
    printn ""
    print "Presiona enter para salir...  "
    mov ah, 0  ;termina el programa
    int 16h
    ret
    
define_print_string ;comando definido emu8086.inc  
define_print_num
define_print_num_uns
define_scan_num     
end


Resultado:


La suma de los valores 12 y 7 decimal da 19. Como se puede ver se guarda en el registro "ax" como 13 equivalente en hexadecimal.



Referencia:


1. División en lenguaje ensamblador

Uso de div

Programa: Realiza una división.

Uso de div:

La operación div en este programa divide "ax" entre "bx", guardando el resultado en el registro "ax".

Programa 1.

Código:

org 100h
mov ax, 9
mov bx, 9
div bx ; tomara ax y bx se dividira

ret


Resultado:

Como se muestra 9 decimal se guardan en el registro "ax" y "bx" en formato hexadecimal.



El resultado de la division de 9/9 es 1, se puede apreciar en el registro "ax".



Programa 2.

Código:

org 100h

mov ax, 100
mov bx, 5
div bx ; tomara ax y bx se dividira

ret





Resultado:


Primero el valor 100 y 5 se guardaran en los registros "ax" y "bx", respectivamente en formato hexadeximal.



Al realizar la división, nos da como resultado 14 hexadecimal (en el registro "ax"), en decimal su equivalente es 20.







Referencia:

1. Programa que compara si es mayor de edad


Condicionales

Programa 1: 

Compara al ingresar la edad si es mayor o menor de edad.

Código:

org 100h

.model small

.stack ; segmento de pila


.data 

diez db 10; variable para poder imprimir dos caracteres(se multiplica por el 1 valor) 
num1 db 0 ; variable para edad
mens db 'Ingrese la edad: $'
mens1 db 10, 13, 'Eres mayor de Edad $'
mens2 db 10, 13, 'Eres menor de Edad $'

.code
    inicio proc Far
        mov ax, @data ; direccionamiento del seg
        mov ds, ax ;los datos se mueven al registro de ax
       
        ; poner el primer letrero  


        mov ah, 09 ;impresion
        lea dx, mens
        int 21h

        
        mov ah, 01
        int 21h  
        sub al, 30h ;convierte el valor 
        mul diez ;se multiplica el numero ingresado para las decenas
        mov num1, al

        ;pedir segundo valor
        
        mov ah, 01
        int 21h
        sub al, 30h ;resta lo que se guardo en al con 30h
        add num1, al ; se suma a las decenas obtenidas 
        mov al, num1 ;
        
        cmp al, 18 ; compara si en el registro al es 18    

        ;en caso de que sea mayor jge mayor o igual
        jge mayor ;en caso de que sea mayor va a la etiqueta
        jmp menor ;va a la etiqueta menor, si es menor el num 18
        
        mayor:
            mov ah, 09
            lea dx, mens1
            int 21h      
            jmp fin 

        menor:  
            mov ah, 09
            lea dx, mens2
            int 21h      
            jmp fin  ;va a la etiqueta fin
          
        fin: ; fin de programa
            mov ax, 4c00h   
      
 inicio endp

    end inicio

ret


Resultado:




3. Colores Modificado 9

Modificación del programa # 9 " Colores " Por mi compañero Ambrocio isaias Laureano CR EQU 13 ;Declaro retorno de carro LF...