lunes, 29 de abril de 2013

exposicion" almacenamiento y captura de datos!!!"


La captura y almacenamiento de datos numéricos en el lenguaje ensamblador nos permite la opción de meter o introducir algún numero en un programa deceado , en el cual dando las instrucciones necesarias se pueden además de ser capturadas almacenarlas dentro del programa.
Para la introducción de los datos ya sea numéricos o carácter es necesario la interaccion a través de un dispositivo como : teclado, raton, monitor,etc.
Cuando un programa tiene mas variables que registros, el compilador almacena las variables mas utilizadas en los registros, y las restantes en memoria: derramar registros (spilling)
Solo las instrucciones de carga y almacenamiento acceden a memoria , según los cálculos efectuados sobre valores en los registros.
alineación: una cantidad esta alineada si su dirección de memoria es un múltiplo de su tamaño en bytes.
casi todas las instrucciones de carga y almacenamiento operan solo sobre datos alineados.
instrucciones para alinear datos o alineados son : lwl , lwr, swl y swr.








El ensamblador permite definir elementos para datos de diferentes longitudes de acuerdo con un conjunto de directivas especificas para ello. El formato general es el siguiente:

Donde dn es una de las directivas de la siguiente tabla:

Los datos se almacenan en memoria en el orden en que han sido declarados y podemos
acceder a ellos usando el nombre dado en la declaración. Por ejemplo, si declaramos los siguientes
datos:
Numero dw 5
Tabla 3, 4, 5
cadena  db ‘hola’
El aspecto de la memoria sería el siguiente:

Asimismo, al igual que cuando operamos con dos registros, el “tamaño de la variable” debe
ser el mismo que el del otro operando, esto es, operaciones como las siguientes darían un error al
ensamblar:
MOV AL, Numero
MOV AX, Tabla

Las constantes numéricas
se usan para definir valores aritméticos y direcciones de memoria.
Las constantes numéricas no llevan comillas, como sucede con las cadenas de caracteres, y van seguidas de un indicador de la base utilizada. Si se omite éste, se supone el sistema decimal.

Si el primer dígito de una constante hexadecimal es una letra (A..F), debe anteponerse un  cero, para que el ensamblador pueda distinguir que se trata de una constante numérica y no  una cadena de caracteres.
Existe un elemento en ensamblador  que es la DIRECTIVA que es la que se encarga de asociar el nombre de un símbolo con la expresión enterea.
La Directiva EQU.
La directiva EQU no define ningún tipo de dato, sino que define constantes, o sea, define  valores que el ensamblador puede sustituir en otras instrucciones. Por ejemplo,
VALOR EQU 100
Cada vez que en el programa aparezca VALOR, el ensamblador lo sustituirá por 100. Así,
MOV AX, VALOR
Es equivalente a
MOV AX, 100
Es muy útil para evitar tener que actualizar en varias instrucciones una constante que se repite  y que se modifica al depurar el programa




Ejemplos:
1
.MODEL SMALL
.STACK
.DATA
    VAL1 DB 'DIGITE VALOR 1: $'
    VAL2 DB 'DIGITE VALOR 2: $'
.CODE
inicio:
    MOV AX, SEG VAL1
    MOV DS, AX
    MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
    MOV AH, 09h        ;imprime mensaje VAL1 con la
    INT 21h            ;función 9h
    MOV AH, 01h        ;captura un valor del teclado
    INT 21h            ;y se guarda en AL
    PUSH AX
    MOV AX, SEG VAL2
    MOV DS, AX
    MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
    MOV AH, 09h        ;imprime mensaje VAL1 con la
    INT 21h            ;función 9h
    MOV AH, 01h        ;captura un valor del teclado
    INT 21h            ;y se guarda en AL
    MOV BL, AL
    POP AX
    ADD BX, AX
    MOV AH, 4Ch
    INT 21h
END inicio








2
.MODEL SMALL
.STACK
.DATA
    VAL1 DB 'DIGITE VALOR 1: $'
    VAL2 DB 13, 10, 'DIGITE VALOR 2: $'
    numeros DB 0
.CODE
 
inicio:
    MOV AX, SEG VAL1
    MOV DS, AX
    
    MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
    MOV AH, 09h   ;imprime mensaje VAL1 con la
    INT 21h    ;función 9h
    
    MOV AH, 01h  ;captura un valor del teclado
    INT 21h    ;y se guarda en AL
    
    sub al, 48  ;restamos al caracter el ASCII de 0 para convertirlo en     un numero
 
    mov numeros, al
    
    MOV AX, SEG VAL2
    MOV DS, AX
    MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
    MOV AH, 09h        ;imprime mensaje VAL1 con la
    INT 21h            ;función 9h
  
    MOV AH, 01h        ;captura un valor del teclado
    INT 21h            ;y se guarda en AL
    sub al, 48                     ;restamos al caracter el ASCII de 0 p ara convertirlo en un numero
    add numeros, al             ;aca tenemos el resultado de la suma
    
    MOV AH, 4Ch
    INT 21h
END inicio









3
.MODEL SMALL
.STACK
.DATA
    VAL1 DB 'DIGITE VALOR 1: $'
    VAL2 DB 13,10,'DIGITE VALOR 2: $'
    MSG DB 13,10,'LA SUMA ES: $'
.CODE
inicio:
    MOV AX, SEG VAL1
    MOV DS, AX
    MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
    CALL Print
    CALL Capt
    PUSH AX
    MOV AX, SEG VAL2
    MOV DS, AX
    MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
    CALL Print
    CALL Capt
    MOV BL, AL         ;muevo el valor que se capturo en BL
    POP AX             ;saca el valor introducido a la pila
    ADD BX, AX         ;suma BX con AX y guarda en AX
    MOV AX, SEG MSG
    MOV DS, AX
    MOV DX, OFFSET MSG  ;Envia a DX el mensaje MSG
    CALL Print
    MOV AH, 02h
    MOV DX ,AX
    INT 21h    
    MOV AH, 4Ch
    INT 21h
Print Proc Near
    MOV AH, 09h        ;imprime mensaje con la
    INT 21h            ;función 9h
    RET
Print Endp
Capt Proc Near
    MOV AH, 01h        ;captura un valor del teclado
    INT 21h            ;y se guarda en AL
    RET    
Capt Endp
END inicio
Ejercicio 3



                                                 

4 PARA PRACTICAR ;)
.MODEL SMALL
.STACK
.DATA
    VAL1 DB 'DIGITE VALOR 1: $'
    VAL2 DB 13,10,'DIGITE VALOR 2: $'
    MSG DB 13,10,'LA SUMA ES: $'
    RESU DB 0
.CODE
inicio:
    MOV AX, SEG VAL1
    MOV DS, AX
    MOV DX, OFFSET VAL1 ;Envia a DX el mensaje VAL1
    CALL Print
    CALL Capt
    MOV RESU, AL
    MOV AX, SEG VAL2
    MOV DS, AX
    MOV DX, OFFSET VAL2 ;Envia a DX el mensaje VAL1
    CALL Print
    CALL Capt
    ADD RESU, AL
    MOV AX, SEG MSG
    MOV DS, AX
    MOV DX, OFFSET MSG  ;Envia a DX el mensaje MSG
    CALL Print
    MOV AH, 02h
    MOV DX ,AX
    INT 21h    
    MOV AH, 4Ch
    INT 21h
Print Proc Near
    MOV AH, 09h        ;imprime mensaje con la
    INT 21h            ;función 9h
    SUB AL, 48          ;restamos al caracter el ASCII de 0 para convertirlo en un numero
    RET
Print Endp
Capt Proc Near
    MOV AH, 01h        ;captura un valor del teclado
    INT 21h            ;y se guarda en AL
    RET    
Capt Endp
END inicio 


lunes, 8 de abril de 2013

ACTIVIDAD DE ABC

TECLEO DE CODIGO
 
 
ENSABLE
 
 
 
SE BUSCA LLEGAR ALA INTERRUPCION
                              COMIENZA A HABER UN CICLO EN LOS SEGMENTOS
                              CONTINUA EL CICLO Y SE BUSCA LLEGAR ALA INTERRUPCION


LLEGAMOS ALA INTERRUPCION



programa capitulo 5

el siguiente programa cumple con las especificaciones siguientes
a) mover el valor intermedio 40H al registro AL
b) recorrer el contenido de AL un bit hacia la izq.
c) mover el valor inmediato 22H al BL
d) multiplicar AL al programa





para luego continuar con  el ensamble y queda de la siguiente manera
y comenzando a dar T hasta llegar ala interrupcion
y finalmente cumplimos con los registros y llegamos ala interrupcion en 21

domingo, 7 de abril de 2013

ESCRITURA DE PROGRAMAS .COM


ESCRITURA DE PROGRAMAS .COM
Un programa .com es e  COMMAND.COM , la ventaja de estos programas es que so mas pequeños que los programas .exe  comparables y son mas fáciles de adaptar para actuar como programas residentes en memoria. 
Segmentos:
el uso de segmentos para programas.com es muy diferente y fácil que para programas. Exe
*segmento de pila: ud. Define un programa . EXE con un segmento de pila mientras que en .COM gener a de manera automático
*segmento de datos: un programa .EXE por lo común define un segmento de datos e inicializa el registro DS con la dirección de ese segmento . ya que los datos para un programa .com están definidos dentro del segmento de código , tampoco tiene que definir el segmento de datos.
*Segmento de código: un programa .COM completo combina el PSP , la pila, el segmento de datos y el segmento de código en un segmento de código de máximo 64K
Conversión a formato.COM
Si su programa fuente ya esta escrito en formato.EXE , puede utilizar un editor para convertir las instrucciones a formato .COM . Los formatos de codificación de MAS Y TASM  para programas.com son idénticos , aunque sus métodos de conversión difieren . cuando la conversión a formato .COM esta completa , puede borrar los archivos .OBJ  y .EXE.
Inicialización: cuando el DOS carga un programa.com para ejecución , inicializa de forma automática todos los registros de segmentos con la dirección del psp , ya que los registros cs y ds contendrán la dirección de segmento inicial  correcta, su programa no tiene que cargarlos

Ejemplo de un programa .COM
INT 21H finaliza la función 4CH , finaliza el procesamiento y sale al DOS. Para este propósito , también se puede usar la instrucción RET
Programa masm  y tasm




La pila de .COM:
para este programa, el DOS define de manera automática una pila y establece la misma dirección de segmentos en elos cuatro registros de segmento . si el segmento de 64K para el programa es suficiente grande, el DOS establece la pila al final del segmento y carga el registro SP con FFFEH , la parte superior de la pila (el tope de la fila).
Sugerencias para la depuración:
La omisión de un solo requisito .COM puede provocar que un programa falle . Si  EXE2BIN encuentra un erro , solo le notificara que no puede convertir el archivo, pero no da la razón. Verifique los enunciados SEGMENT, ASSUME Y END . si omite ORG 100H, de forma incorrecta el programa se refiere a los datos en el PSP , con resultados impredecibles .
si ejecuta un programa.COM con DEBUG  utilice D CS:100 para ver los datos e instrucciones . no siga el programa hasta su terminación ; en lugar de eso , utilice el comando Q de DEBUG.
PUNTOS CLAVE:
Un programa .COM esta restringido a un segmento de 64K
* Un programa . com es mas pequeño que su programa . EXE
*El DOS define una pila para un programa.com al final del programa



domingo, 17 de febrero de 2013

interrupciones y llamadas a servicios de sistema


Interrupciones:
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 afectarlo directamente. De este modo un programa puede ser interrumpido temporalmente para atender alguna necesidad urgente del computador y luego continuar su ejecución como si nada hubiera pasado.
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.
Las interrupciones externas las generan los dispositivos perifericos, como pueden ser: teclado, impresoras, tarjetas de comunicaciones, etc. También son generadas por los coprocesadores.
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 vias de comunicación llamadas puertos.

Una lista de las interrupciones generadas por hardware es la siguiente

IRQ
Prioridad
Función
0
1
Timer
1
2
Teclado Hardware
2
Reservada
3
11
COM 2
4
12
COM 1
5
13
Tarjeta de Sonido
6
14
Controlador Floppy
7
15
Puerta Paralela
8
3
Reloj (tics)
9
4
Libre para tarjeta de red, sonido, puerta SCSI
10
5
idem
11
6
idem
12
7
PS-mouse
13
8
Co-procesador matemático
14
9
Canal IDE primario
15
10
Canal IDE secundario
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, utilizandolas 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 categorias: 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.



Llamadas de emergencia del sistema:
Las llamadas son peticiones a ejecución de rutinas y proporcionan la interfaz entre el sistema operativo y un programa en ejecución. Estas llamadas son instrucciones de lenguaje ensamblador y se presentan en los manuales que emplean los programadores de este lenguaje. Algunos sistemas permiten efectuar llamadas al sistema directamente desde un programa realizado en el lenguaje de mayor nivel, normalmente estas llamadas se asemejan a una función o sub-rutinas predefinidas, que generan una llamada a una ruta en especial de tiempo de ejecución, que realice efectivamente la llamada al sistema, o bien pueden generarla directamente en la línea. Por ejemplo: En el procesador INTEL es INT y en UNIX son rutinas en C.
Los programadores de sistemas de aplicación invocan con frecuencia los servicios del sistema operativo desde sus programas mediante llamadas del sistema. Las ordenes del sistema emitidas por los usuarios que manejan el lenguaje de ordenes (lenguaje de control JCL) normalmente se convierten a lenguaje de máquina y se ejecutan como una serie de llamadas del sistema.

registros del cpu


Registros de la CPU
1er búsqueda:
Para poder hacer estas cosas, es obvio que la CPU necesita almacenar algunos datos temporalmente. Debe recordar la posición de la última instrucción de forma que sepa dónde ir a buscar la siguiente. Necesita almacenar instrucciones y datos temporalmente mientras una instrucción está siendo ejecutada. En otras palabras, la CPU necesita una pequeña memoria interna. En la estructura interna de la CPU se indican los caminos de transferencia de datos y de control lógico, que incluyen un elemento con el rótulo bus interno de la CPU. Este elemento es necesario para transferir datos entre los diversos registros y la ALU, ya que ésta en realidad sólo opera con datos de la memoria interna de la CPU. La figura muestra también los elementos básicos típicos de la ALU. Dentro de la CPU hay una memoria interna compuesta por un conjunto de registros. Los registros de la CPU son:
- Registros visibles al usuario: Permiten al programador de lenguaje de máquina o ensamblador minimizar las referencias a memoria principal optimizando el uso de los registros.







- Registros de control: Son utilizados por la unidad de control para controlar el funcionamiento de la CPU y por programas privilegiados del sistema para controlar la ejecución de programas.
- Registro de estado: Se utiliza para tomar decisiones en función de operaciones realizadas. 





- Registro puntero a pila: El registro puntero a pila permite almacenar la dirección de acceso a la memoria pila. Veremos su funcionamiento al tratar las subrutinas.
2da búsqueda:

En arquitectura de ordenadores, 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.
Los registros de datos son usados para guardar números enteros. En algunas computadoras antiguas, existía un único registro donde se guardaba toda la información, llamado acumulador.
Los registros de memoria son usados para guardar exclusivamente direcciones de memoria. Eran muy usados en la arquitectura Harvard, ya que muchas veces las direcciones tenían un tamaño de palabra distinto que los datos.
Los registros de propósito general (en inglés GPRs o General Purpose Registers) pueden guardar tanto datos como direcciones. Son fundamentales en la arquitectura de von Neumann. La mayor parte de las computadoras modernas usa GPR.
Los registros de coma flotante son usados para guardar datos en formato de coma flotante.
Los registros constantes tienen valores creados por hardware de sólo lectura. Por ejemplo, en MIPS el registro cero siempre vale 0.
Los registros de propósito específico guardan información específica del estado del sistema, como el puntero de pila o el registro de estado.
tambien existen registros banderas y de base
3. búsqueda:
Los registros del procesador se emplean para controlar instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los registros son direccionables por medio de un nombre. Los bits por convención, se numeran de derecha a izquierda, como en:

... 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Los registros internos del procesador se puede clasificar en 6 tipos diferentes 
Registros de segmento
Registros de propósito general
Registros de apuntadores
Registros de banderas
Registros de Puntero de instrucción
Registros de Pila

Registros de segmento 
Un registro de segmento tiene 16 bits de longitud y facilita un área de memoria para direccionamiento conocida como el segmento actual.
Registro CS. El DOS almacena la dirección inicial del segmento de código de un programa en el registro CS. Esta dirección de segmento, mas un valor de desplazamiento en el registro apuntador de instrucción (IP), indica la dirección de una instrucción que es buscada para su ejecución
Registro DS. La dirección inicial de un segmento de datos de programa es almacenada en el registro DS. En términos sencillos, esta dirección, mas un valor de desplazamiento en una instrucción, genera una referencia a la localidad de un byte especifico en el segmento de datos.
Registro SS. El registro SS permite la colocación en memoria de una pila, para almacenamiento temporal de direcciones y datos. El DOS almacena la dirección de inicio del segmento de pila de un programa en le registro SS. Esta dirección de segmento, mas un valor de desplazamiento en el registro del apuntador de pila (SP), indica la palabra actual en la pila que esta siendo direccionada.
Registros ES. Alguna operaciones con cadenas de caracteres (datos de caracteres) utilizan el registro extra de segmento para manejar el direccionamiento de memoria. En este contexto, el registro ES esta asociado con el registro DI (índice). Un programa que requiere el uso del registro ES puede inicializarlo con una dirección de segmento apropiada.
Registros FS y GS. Son registros extra de segmento en los procesadores 80386 y posteriores. 
Regresar Arriba
Registros de propósito general. 
Los registros de propósito general AX, BX, CX y DX son los caballos de batalla del sistema. Son únicos en el sentido de que se puede direccionarlos como una palabra o como una parte de un byte. El ultimo byte de la izquierda es la parte "alta", y el ultimo byte de la derecha es la parte "baja". Por ejemplo, el registro CX consta de una parte CH (alta) y una parte Cl (baja), y usted puede referirse a cualquier parte por su nombre.
Registro AX. El registro AX, el acumulador principal, es utilizado para operaciones que implican entrada/salida y la mayor parte de la aritmética. Por ejemplo, las instrucciones para multiplicar , dividir y traducir suponen el uso del AX. También, algunas operaciones generan código mas eficiente si se refieren al AX en lugar de a los otros registros.
Registro BX. El BX es conocido como el registro base ya que es el único registro de propósito general que puede ser índice para direccionamiento indexado. También es común emplear el BX para cálculos.
Registro DX. El DX es conocido como l registro de datos. Alguna operaciones de entrada/salida requieren uso, y las operaciones de multiplicación y división con cifras grandes suponen al DX y al AX trabajando juntos.

bibliografia: 
http://www.oocities.org/mx/antrahxg/documentos/org_comp/registro.html
http://es.wikipedia.org/wiki/Registro_(hardware)
http://www.portalhuarpe.com.ar/Medhime20/Sitios%20con%20Medhime/Computaci%C3%B3n/COMPUTACION/Menu/modulo%205/5-6.htm