Mostrando entradas con la etiqueta Unidad 1. Mostrar todas las entradas
Mostrando entradas con la etiqueta Unidad 1. Mostrar todas las entradas

martes, 5 de marzo de 2019

1.8 DESPLEGADO DE MENSAJES EN EL MONITOR


Int 21H
Esta interrupción tiene varias funciones, para acceder 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

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


Esto se puede hacer de 2 maneras, utilizando offset o con el nemónico lea.
offset va a conseguir cada dirección de memoria de cada carácter y lo devolverá a la 
instrucción solicitada.


Con lea esta solicitud de direcciones por cada carácter se hace de forma automática.

Libreria emu8086.inc



1.7 COMPILADORES, PROCESO DE ENSAMBLADO Y LIGADO


Imagen relacionada

El lenguaje ensamblador, es un lenguaje de programación que es una traducción directa del código máquina(este código es interpretado por el microprocesador), para que pueda ser entendible, por lo tanto es un lenguaje nivel.

Consta de 3 partes:
Sección de pila
Sección de datos o variables.
Seccion de codigo.

Proceso de Ensamblado y ligado

Ensamblado y ligado Para poder crear un programa se requieren varias herramientas: Primero un editor para crear el programa fuente. Segundo un compilador que no es más que un programa que “traduce” el programa fuente a un programa objeto. Y tercero un enlazador o linker , que genere el programa ejecutable a partir del programa objeto.

El programa utiliza un editor de texto para crear un archivo de texto ASCII, conocido como archivo de código fuente, este con una extensión asm, haciendo uso de un editor cualquiera(notepad++).

El ensamblador lee el archivo de código fuente y produce un archivo de código objeto, una traducción del programa a lenguaje máquina.
De manera opcional, produce un archivo listado. Si ocurre un error, el programador debe regresar al paso anterior y corregir el programa. Durante el ensamble también puede generarse un archivo de referencias cruzadas, que es útil cuando se manejan programas en varios archivos.

El enlazador lee el archivo de código objeto y verifica si el programa contiene alguna llamada a los procedimientos en una biblioteca de enlace. El enlazador copia cualquier procedimiento requerido de la biblioteca enlace, lo combina con el archivo de código objeto y produce el archivo ejecutable. De manera opcional, el enlazador puede producir un archivo de mapa.
El archivo de mapeo, indica donde se localiza cada segmento o sección del programa en el archivo ejecutable y que es útil sobre todo para programas divididos.
La herramienta cargador (loader) del sistema operativo lee el archivo ejecutable y lo carga en memoria, y bifurca la CPU hacia la dirección inicial del programa, para que este empiece a ejecutarse

La principal diferencia entre compilador y ensamblador llega en el hecho de que generalmente los compiladores traducen un código a un lenguaje intermedio, como puede ser ensamblador, una vez que se hizo esto, se apoyan de esa traducción para transformar el código a lenguaje máquina.
Por el contrario el ensamblador, lee tu código, te detecta errores, y si no tenemos errores traduce directamente a lenguaje máquina, es decir, hace una traducción directa.

Ambos utilizan lo que se conoce como ligadores o enlazadores, estos al traducir un formato ejecutable, generalmente se topan con segmentos de código como las importaciones o llamadas a otros programas, es aquí donde ellos se encargan de enlazar los códigos y archivos faltantes para una correcta traducción a Lenguaje Máquina.


viernes, 1 de marzo de 2019

1. Uso de librería emu8086 (parte 3)


Programa 1: Demostración de códigos.

Código:

include "emu8086.inc"
org 100h
 .data 
  mensaje1 db 13,10,"print_string imprime un mensaje guardado en el registro SI",0
.code
  print "Print muestra un mensaje en pantalla"    
  lea si,mensaje1
  call print_string
  gotoxy 6,6 ;esto mueve el cursor a la posicion deseada 
  print "GOTOXY mueve el cursor a la posicion deseada"
  gotoxy 6,7
  print "scan_num solicita un valor por teclado, este se guarda en cl: "
  call scan_num  
  xor ax,ax
  mov al,cl
  gotoxy 6,8
  print "print_num imprime en pantalla el valor numerico de al: "
  call print_num 
  gotoxy 6,9
  print "Putc imprime un solo caracter: "
  putc "a"  
  
  
  define_print_num 
  define_scan_num      
  define_print_num_uns
  define_print_string  
end


*

Programa 2: Hello World

Código:

include emu8086.inc

ORG    100h

PRINT 'Hello World!'

GOTOXY 10, 5

PUTC 65           ; 65 - is an ASCII code for 'A'
PUTC 'B'

RET               ; return to operating system.
END               ; directive to stop the compiler.


Resultado:




Programa 3: Demostracion del uso print_string y get_string

Código:


; demonstrate get_string and print_string
;----------------------------------------
include 'emu8086.inc'
ORG    100h

LEA    SI, msg1       ; set up pointer (SI) to msg
                      ; to ask for the number
CALL   print_string   ; print message that SI points to

LEA    DI, buffer     ; set up pointer (DI) to input buffer
MOV    DX, bufSize    ; set size of buffer
CALL   get_string     ; get name & put in buffer

LEA    SI, newln      ; point at CR/LF / Hello message 
CALL   print_string   ; print message that SI points to

RET                   ; return to operating system.

; data
msg1   DB "Enter your name: ", 0  
newln  DB 13, 10
       DB "Hello, "
buffer DB 20 DUP (0)  ; input buffer for get_string   
bufSize = $-buffer    ; calculates size of buffer

DEFINE_GET_STRING
DEFINE_PRINT_STRING
END                   ; directive to stop the compiler.




Resultado:






Programa 4: Uso scan_num, print_num, pthis




Código:




; demonstrate scan_num, print_num, pthis
;----------------------------------------
include 'emu8086.inc'
ORG    100h

LEA    SI, msg1       ; ask for the number
CALL   print_string   ;
CALL   scan_num       ; get number in CX.

MOV    AX, CX         ; copy the number to AX.

; print the following string:
CALL   pthis
DB  13, 10, 'You have entered: ', 0

CALL   print_num      ; print number in AX.

RET                   ; return to operating system.

; data
msg1   DB  'Enter the number: ', 0

; macros to define procs
DEFINE_SCAN_NUM
DEFINE_PRINT_STRING
DEFINE_PRINT_NUM
DEFINE_PRINT_NUM_UNS  ; required for print_num.
DEFINE_PTHIS

END                   ; directive to stop the compiler.


Resultado:




Programa 5: hola mundo uso de gotoxy

Código:

name 'hola mundo'

include 'emu8086.inc'


org 100h

.code
gotoxy 5,5

printn "hola mundo"
gotoxy 5,6

printn "hola mundo 2"
gotoxy 5,7

print "dame un numero:"

call scan_num

define_scan_num

putc "A"

ret


Resultado:




Programa 6: hola mundo  gotoxy- imprime número

Código:
 

include 'emu8086.inc'

org 100h

.code    
Cursoroff      ;apaga el cursor
call scan_num  ;pide un numero

define_scan_num  ;define la funcion 
gotoxy 2,5 
putc 'A'   ;imprime un solo caracter
gotoxy 5,7    ;define en donde se ira a la pantalla
print 'dame un numero: '
call scan_num   
mov ax,cx 
gotoxy 5,8 
call print_num                   
   
define_print_num 
define_print_num_uns
end
ret


Resultado:







Referencia:
http://jbwyatt.com/253/emu/asm_tutorial_05.html


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:





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...