Indice
1. Componentes básicos de un
sistema ms-dos
2. Arquitectura interna del intel
80×86
3. Definición de los sistemas
numéricos
4. Transformaciones
5. Tipos de programas
ejecutables
6. Acceso a las interrupciones del bios
y dos desde rom
7. Principales interrupciones del bios y
del dos
8. Bibliografía
Investigación
1. Componentes
básicos de un sistema
ms-dos
Las operaciones de un
sistema de computación incluyendo un IBM PC’s y
compatibles están basadas en un concepto simple.
Ellas guardan intrusiones y datos en la memoria y
usan el CPU para
repetir intrusiones y datos recibidos
desde la memoria y
ejecutan las instrucciones para manipular los datos (Computadoras
basadas en la Arquitectura de
Von Newmann), por lo tanto el CPU y la memoria son
los dos componentes básicos de cualquier sistema de
computación. La memoria esta
definida en dos variedades random access memory
(RAM) la que
permite la escritura y
la lectura de
cualquier localidad de memoria y la read only memory (ROM), que
la que contiene valores que
pueden ser leídos pero no alterados. La ROM es usada para
almacenar pequeños primitivos programas para
ejecutar instrucciones de entrada y salida y control de
periféricos. La RAM es usada para
el Sistema Operativo
y programas para
usuarios. El Sistema Operativo
es un componente fundamental en un sistema. Este programa de
computadoras
se toma la tarea de cargar otros programas y ejecutarlos, provee
acceso a los archivos del
sistema. La performa la E/S, y hace interfaces interactivas con
el usuario. El sistema operativo es el que provee al sistema su
personalidad.
MS-DOS, OS/2,
UNIX son ejemplo
de algunos Sistema Operativos para PC, similarmente CP/M es un
Sistema Operativos para antiguos microprocesadores
de INTEL de 8 Bits como el 8080. El hardware de toda computadora
incluyendo las computadoras que usan el MS-DOS
está interconectados.
El CPU, memoria, y periféricos de entrada (teclado,
escáner, lápiz óptico, lector de
código de barra, micrófono, mouse etc.) y
salida (monitor,
impresora,
cornetas, etc.) están todos interconectados por una serie
de cables llamados Buces y cada Buz esta claramente definido. Un
Buz es un hardware que especifica una
señal y tiempo
estándar que son seguidos y entendidos por el CPU y su
circuito de soporte (incluyendo periféricos aun no
instalados). Los buces a su vez se clasifican en Buz de Datos,
Buz de Dirección, y Buz de Control. El Buz
de Dirección selecciona la localidad de
memoria entre la memoria usada y el CPU. El Buz de Control
refiere la líneas de señales de tiempo y la
línea de poder a los
componentes. Un Sistema Operativo MS-DOS no necesita
ningún tipo de Buz especifico. Esto es porque es posible
tener el Buz en un segundo plano y estar ejecutando su sistema y
así mismo lo aplica para otro tipo de programas
compatibles. Por ejemplo los antiguos sistemas IBM
PC-AT con los PC-AT Buces y el nuevo IBM PS/2 basado en la
arquitectura
de MCA (Micro Channel Architecture), y puede ser ejecutado en
MS-DOS y OS/2.
2. Arquitectura interna
del intel 80×86
Fue el primer microprocesador
de 16 bits que INTEL fabrico a principios del
año 1978. Los objetivos de
la arquitectura de dicho procesador fueron
los de ampliar la capacidad del INTEL 80×80 de forma
simétrica, añadiendo una potencia de
proceso no
disponible en los micros de 8 bits. Algunas de estas características son: aritmética en
16 bits, multiplicación y división con o sin signo,
manipulación de cadena de caracteres y operación
sobre bits. También se han realizado mecanismo de software para la construcción de códigos reentrante y
reubicable. Su estructura
interna esta representada por la figura numero 1. Consta de 2
unidades claramente diferenciadas denominadas EU (Unidad de
Ejecución) y BIU (interfaces del Bus).
La EU ejecuta las operaciones
requeridas por la instrucciones sobre una UAL de 16 bits. No
tiene conexión con el exterior y solamente se comunica con
la BIU que es la parte que realiza todas las operaciones en el
bus solicitadas
por la EU. Un mecanismo, tal vez único dentro de los
microprocesadores aunque muy empleado dentro de
los mínimos y grandes ordenadores, es el denominado de
búsqueda anticipada de instrucciones (prefetch). En el
INTEL 8086 existe una estructura
FIFO en RAM de 6 octetos de capacidad que es llenada por la BIU
con los contenidos de las intrusiones siguientes a la que la EU
esta ejecutando en ese momento.
Los registros del
procesador se
especifican en la figura numero 1. y son los
siguientes:
a.-) Cuatro registros de 16
bits, denominados AX,BX,CX y DX, que pueden ser direccionados de
8 registros de 8 bits, denominados AH,AL,….DL. los siete
últimos son equivalentes a los registros A, H, L, B, C, D
y E, del microprocesador
Intel 80×86. El registro AX sirve
fundamentalmente como acumulador y como registro de
trasferencia en las intrusiones E/S. El registro BX puede usarse
como acumulador y como registro base para calcular la direcciones
de los datos de memoria. El registro CX puede usarse como
acumulador y se utiliza como contador para las intrusiones
interactivas. El registro DX puede usarse como acumulador y se
emplea como puntero de datos en ciertas intrusiones especificas
de E/S.
b.-) Cuatro registros de puntero de segmento denominado
CS, DS, SS y ES. Dicho puntero definen cuatro segmentos de 64 K
octetos cada uno. Cualquier dirección de memoria se forma,
como ya veremos en el apartado de direccionamiento, sumando al
puntero del segmento una dirección efectiva calculada por
diversos procedimientos.
El registro CS, (CODE SEGMENT) se usa junto con el PC para
calcular las direcciones de las intrusiones del programa; el
registro SS (STACK SEGMENT) se emplea junto con el SP (STACK
POINTER) para calcular la dirección de las intrusiones que
manejan la pila tales como PUSH, POP, CALL y RETURN; por su
parte, el registro DS (DATA SEGMENT) se usa en instrucciones que
manejan datos de memoria y el registro ES (EXTRA SEGMENT) se
utiliza en instrucciones que manejan cadena de
caracteres.
c.-) Cuatro registros que contiene direcciones de
desplazamiento dentro de los segmentos denominadas SP, BP, SI,
DI. El registro SP puntero de la pila los registros SI (INDEX
SEGMENT) y DI (Índice Destino) contienen desplazamientos
de los punteros de segmento DS y ES en las intrusiones que
manejan cadena de caracteres. El registro BP (BASE POINTER) es el
puntero base.
d.-) Un registro contador de programas, PC.
e.-) Un registro de estado, S, de
16 bits con la siguiente asignación: Bit bo(C)
es el acarreo, Bit b2(P) es el de paridad, Bit
b4(A) es el de acarreo auxiliar, Bit b6(Z)
el de cero, Bit b7(S) el de signo, Bit b8
(T) el de Trap, Bit b9(I) que sirve para controlar el
bloqueo de las intrusiones, Bit b10(D) que determinan
si se han de autoincrementar o autodecrementar los punteros SI y
DI en las intrusiones que manejan cadenas de caracteres, Bit
b11(O) que especifica el desbordamiento
(Overflow).
El 8086 representa la arquitectura base para todos los
microprocesadores de 16 bits de Intel: 8088, 8086, 80188, 80186 y
80286. Aunque han aparecido nuevas características a medida que estos
microprocesadores han ido evolucionando; todos los procesadores
Intel, usados en la actualidad en los PC’s y compatibles
son miembros de la familia
8086. El conjunto de instrucciones, registros y otras
características son similares, a excepción de
algunos detalles, todo la familia 80×86 en
adelante poseen dos características en común: a)
Arquitectura Segmentada, Esto significa que la memoria es divida
en segmentos con un tamaño máximo de 64k (información importante para el
direccionamiento de la memoria en la futura programación segmentada en el lenguaje
ensamblador) y b) Compatibilidad de Las intrusiones y
registros de las anteriores versiones son soportados por las
nuevas versiones, y estas versiones son soportadas por versiones
anteriores.
La familia de
microprocesadores 80×86 consta de los siguientes
microprocesadores:
8088: Es un microprocesador de 16 bits, usado en las
primeras PC´S (XT compatibles). Soporte solamente el modo
real. Es capaz de direccionar un megabytes de memoria y posee un
bus de datos de 8 bits. El 8086 es Similar al 8088, con la
excepción de que el bus de datos es de 16 bits. El 0188 es
similar al 8088, pero con un conjunto de instrucciones extendidos
y ciertas mejoras en la velocidad de
ejecución. Se incorporan dentro del microprocesador
algunos chips que anteriormente eran externos,
consiguiéndose unas mejoras en el rendimiento del mismo.
El 80186 es igual al 80188 pero con un bus de datos de 16 bits.
El 80286 Incluye un conjunto de instrucciones extendidos del
80186, pero además soporta memoria
virtual, modo protegido y multitarea. El 80386 soporta
procesamientos de 16 y 32 bits. El 80386 es capas de manejar
memoria real y protegida, memoria
virtual y multitarea. Es más rápido que el
80286 y contiene un conjunto de instrucciones ampliables. El
80386SX es similar al 80386 por un bus de datos de solo 16 bits.
El 80486 incorpora un cache interno de 8k y ciertas mejoras de
velocidad con
respecto al 80386. Incluye un coprocesador matemático
dentro del mismo chip. El 80486SX es Similar a los 80486 con la
diferencia que no posee coprocesador matemático y 80486DX2
es Similar al 80486, pero con la diferencia de que internamente,
trabaja al doble de la frecuencia externa del reloj.
El 80×86 tiene dos procesadores en
el mismo chip. Estos son La Unidad de Ejecución y La
Unidad de Interface con los Buces. Cada uno de ellos contiene su
propio registro, su propia sección aritmética, sus
propias unidades de control y trabajan de manera
asincrónica el uno con el otro para proveer la potencia total de
computo. La unidad de Interface de bus se encarga de buscar las
instrucciones para adelantar su ejecución y proporciona
facilidades en el manejo de las direcciones. Luego, la unidad de
Interface se responsabiliza del control de la adaptación
con los elementos externos del CPU central. Dicha unidad de
interface proporciona una dirección de 20 Bits o un dato
de 16 para la unidad de memoria o para la unidad de E/S en la
estructura externa del computador.
3. Definición de
los sistemas
numéricos
Sistema decimal
Desde hace muchos años, el hombre ha
utilizado como sistema para contar el denominado decimal, que
derivó del sistema numérico indoarábigo;
posiblemente se adoptó este mismo por contar con diez
dedos en las manos. El sistema decimal es unos de los denominados
sistemas posicionales, utilizando un conjunto de símbolos
cuyo significado depende fundamentalmente de su posición
relativa al símbolo de coma (.), Denominado coma decimal,
que en caso de ausencia se supone colocada implícitamente
a al derecha. Utiliza como base el 10, que corresponde al
número de símbolos que comprende para la
representación de cantidades; estos símbolos
(también denominados dígitos) son: 0 1 2 3 4 5 6 7
8 9. Una determinada cantidad, que denominaremos número
decimal, se puede expresar de la siguiente forma:
Donde: base = 10, i= posición respecto a la coma,
D = Nº. Dígitos a la izquierda de la coma, N =
Nº , de dígitos a la Izquierda de la coma,
Dígito = cada uno de los que componen el número.
Esta forma corresponde al teorema fundamental de la
numeración y por tanto corresponde a la
representación,Por ejemplo, la representación de
las cantidad 1992 es:
Sistema binario
Es el sistema que utiliza internamente el hardware de
las computadoras actuales, por ello será el sistema al que
se le prestará mayor atención y estudio. Se basa en
la representación de cantidades utilizando los
dígitos 1 y 0. Por tanto su base es 2 (número de
dígitos del sistema). Cada dígito de un
número en este sistema se denomina bit (contracción
de binary digit).
Se puede utilizar con nombre propio determinados
conjuntos de
dígitos en binario. Cuatro bits se denominan cuaterno
(ejemplo: 1001), ocho bits octeto o byte (ejemplo: 10010110), al
conjunto de 1024 bytes se le llama Kilobyte o simplemente K, 1024
Kilobytes forman un megabyte y 1024 megabytes se denominan
Gigabytes.
Sistema octal
Es un sistema de numeración cuya base es 8, es
decir, utiliza 8 símbolos para la representación de
las cantidades, Estos símbolos son; 0 1 2 3 4 5 7. Este
sistema también es de los llamados posicionales y la
posición de sus cifras se mide con relación a la
coma decimal que en caso de no aparecer se supone
implícitamente a la derecha del número. La
aritmética en este sistema es similar a la de los sistemas
binario y decimal, por lo que no entraremos en su
estudio.
Sistema hexadecimal
Es un sistema posicional de numeración en el que
su base es 16, por tanto, utilizará 16 símbolos
para la representación de cantidades, estos
símbolos son; 0 1 2 3 4 5 6 7 8 9 A B C D E F. Se la
asignan los siguientes valores
absolutos a los símbolos A, B, C, D, E y F:
Símbolo | Valor Absoluto |
A B C D E F | 10 11 12 13 14 15 |
Cabe destacar que este sistema numérico tiene
mucha utilidad, en las
operaciones internas del computador, ya
que por ejemplo cuando se utiliza el comando DEBUG, los valores
contenidos en todos los registros de memoria se especifican en
hexadecimal. Sí dos valores se suman, restan, multiplican
o dividen, el resultado se presenta en hexadecimal. Dado que lo
más común es el sistema decimal, es necesario
efectuar una conversión de hexadecimal y viceversa para
obtener el resultado de cualquier operación en el formato
DEBUG.
Conversión Decimal-Binario: Para convertir
números enteros de decimal a binario, la forma más
simple es dividir sucesivamente el numero decimal y los cocientes
que se van obteniendo por, hasta que una de las divisiones se
haga 0. La unión de todos los restos obtenidos escritos en
orden inverso, nos proporcionan el número inicial
expresado en el sistema
binario. Ej.:
10 | 2 |
|
|
|
0 | 5 | 2 |
|
|
| 1 | 2 | 2 |
|
|
| 0 | 1 | 2 |
|
|
| 1 | 0 |
10(10)=1010(2)
- Conversión de una fracción decimal a
binario: la forma más simple consiste en multiplicar
dicha fracción por 2,obteniendo en la parte entera del
resultado el primero de los dígitos binarios de la
fracción binaria que buscamos. A continuación
repetimos el mismo proceso con
la parte fraccionaria del resultado anterior, obteniendo en la
parte entera del nuevo resultado el segundo de los
dígitos buscados. Iteramos sucesivamente de esta forma,
hasta que desaparezca la parte fraccionaria o hasta que
tengamos los suficientes dígitos binarios que nos
permitan no sobrepasar un determinado error.
Conversión de binario a decimal: el método
consiste en reescribir él numero binario en
posición vertical de tal forma que la parte de la derecha
quede en la zona superior y la parte izquierda quede en la zona
inferior. Se repetirá el siguiente proceso para cada uno
de los dígitos comenzados por el inferior: Se coloca en
orden descendente la potencia de 2 desde el cero hasta n, donde
el mismo el tamaño del numero binario, el siguiente
ejemplo ilustra de la siguiente manera. Utilizando el teorema
fundamental de la numeración tenemos que 1001.1es igual
a:
Conversión decimo octal: Consiste en dividir un
numero y sus sucesivos cocientes obtenidos por ocho hasta llegar
a una división cuyo cociente sea 0. El numero Octal
buscado es el compuesto por todos los restos obtenidos escritos
en orden inverso a su obtención. Ej.:
1992 | 8 |
|
|
39 | 249 | 8 |
|
72 | 09 | 31 | 8 |
0 | 1 | 7 | 3 |
1000(10)=3710(8)
Conversión de una fracción decimal a una
octal: Se toma la fracción decimal y se multiplica por 8,
obteniendo en la parte entera del resultado el primer
dígito de la fracción octal resultante y se repite
el proceso con la parte decimal del resultado para obtener el
segundo dígito y sucesivos. El proceso termina cuando
desaparece la parte fraccionaria del resultado o dicha parte
fraccionaria es inferior al error máximo que deseamos
obtener. Ej. :
0.140625*8=1.125
0.140625(10)=0.11(8)
Conversión octal a decimal: Existen varios
métodos
siendo el más generalizado el indicado por el TFN (Teorema
fundamental de la numeración) que hace la
conversión de forma directa por medio de la formula. Ej. :
utilizando el teorema fundamental de la numeración tenemos
que 4701 es igual a:
Conversión decimal – hexadecimal: Se divide
el numero decimal y los cocientes sucesivos por 16 hasta obtener
un cociente igual a 0. El número hexadecimal buscado
será compuesto por todos logros obtenidos en orden inverso
a su obtención. Ej.:
1000 | 16 |
|
40 | 62 | 16 |
8 | 14 | 3 |
1000(10)=3E8(16)
Conversión de una fracción decimal a
hexadecimal: a la fracción decimal se multiplica por 16,
obteniendo en la parte entera del resultado el primer
dígito de la fracción hexadecimal buscada, y se
repite el proceso con la parte fraccionaria de este resultado. El
proceso se acaba cuando la parte fraccionaria desaparece o hemos
obtenido un número de dígitos que nos permita no
sobrepasar el máximo error que deseemos obtener. Ej.:
Pasar a hexadecimal la fracción decimal
0.06640625
0.06640625*16=1.0625
0.0625*16 = 1.0 Luego
0.06640625(10)=0.11(16)
Conversión hexadecimal – decimal: el método
más utilizado es el TFN que nos da el resultado por la
aplicación directa de la formula. Ej. : utilizando el
teorema fundamental de la numeración tenemos que 2CA es
igual a:
Conversión de hexadecimal-binario: para convertir
un numero hexadecimal a binario, se sustituye cada dígito
hexadecimal por su representación binaria según la
siguiente tabla.
Dígito Hexadecimal | Dígito Binarios |
0 1 2 3 4 5 6 7 8 9 A B C D E F | 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 |
Ej.: pasar el número 2BC a
binario
2 | B | C |
0010 | 1011 | 1100 |
Finalmente él número hexadecimal en
binario es igual a: 001010111100
- Conversión de octal a binario: para convertir
un numero octal a binario se sustituye cada dígito octal
en por sus correspondientes tres dígitos binarios
según la siguiente tabla.
Dígito Octal | Dígito Binario |
0 1 2 3 4 5 6 7 | 000 001 010 011 100 101 110 111 |
Ej.: Convertir el número octal 1274 en
binario.
1 | 2 | 7 | 4 |
001 | 010 | 111 | 100 |
Por lo tanto el número octal en
binario es igual a: 001010111100
5. Tipos de programas
ejecutables
Estructura del programa con extensión com: Un
programa con extensión COM están almacenados en
archivos que
contienen una copia fiel del código a ser ejecutado. Ya
que no contienen información para la reasignación de
localidades, son más compactos y son cargados más
rápidamente que sus equivalentes EXE. El MS-DOS no tiene
manera de saber si un archivo con
extensión COM es un programa ejecutable válido.
Este simplemente lo carga en memoria y le transfiere el control.
Debido al hecho de que los programas COM son siempre cargados
inmediatamente después del PSP y no contienen encabezado
que especifique el punto de entrada al mismo, siempre debe
comenzar en la dirección 0100h. Esta dirección
deberá contener la primera instrucción ejecutable.
La longitud máxima de un programa COM es de 65536 bytes,
menos la longitud de PSP (256 bytes) y la longitud de la pila
(mínimo 2 bytes).
Cuando el sistema operativo transfiere el control a un
programa COM, todos los registros de segmento apuntan al PSP. El
registro apuntador de pila (SP), contiene el valor en la
memoria de OFFFEh si la memoria los permite. En otro caso adopta
el mínimo valor posible
menos dos bytes (el MS-DOS introduce un cero en la pila antes de
transferir el control al programa). Aún cuando la longitud
de un programa COM no puede exceder de los 64 , las versiones
actuales del MS-DOS reservan toda la memoria disponible. Si un
programa COM debe ejecutar otro proceso, es necesario que el
mismo libere la memoria no usada de tal manera que pueda ser
empleada por otra aplicación. Cuando un programa COM
termina, puede retornar al control del sistema operativo por
varios medios. El
método preferido es el uso de la función 4Ch de la
Int 21, la cual permite que el programa devuelva un código
de retorno al proceso que invocó. Sin embargo, si el
programa está ejecutándose bajo la versión
1.00 del MS.DOS, el control debe ser retornado mediante el uso de
la Int 20h. Un programa COM puede ser ensamblado a partir de
varios módulos objeto, con la condición de todos
ellos empleen los mismos nombres y clases de segmentos y
asegurando que él modulo inicial, con el punto de entrada
en 0100h sea enlazado primero. Adicionalmente todos los procedimientos y
funciones
deben tener el atributo NEAR, ya que todo el código
ejecutable estará dentro del mismo segmento.
Al enlazar un programa COM el enlazador mostrará
el siguiente mensaje; "Warnig: no stack segment". Este mensaje
puede ser ignorado, ya que el mismo se debe a que se ha instruido
al enlazador para que genere un programa con extensión EXE
donde el segmento de pila debe ser indicado de manera
explícita, y no así en los COM donde esta es
asumida por defecto. En la zona desde 000Ah hasta 0015h dentro
del PSP se encuentran las direcciones de las rutinas manejadoras
de los eventos Ctrl-C y
Error critico. Si el programa de aplicación altera estos
valores para sus propios propósitos, el MS-DOS los
restaura al finalizar la ejecución del mismo.
Estructura del prefijo de programa.
0000h | INT 20 |
0002h | Segmento, final del bloque de |
0004h | Reservado |
0005h | Invocación FAR a la función |
000Ah | Vector de interrupción de |
000Eh | Vector de interrupción Ctrl-C |
0012h | Vector de interrupción de error |
0016h | Reservado |
002Ch | Segmento de bloque de variables de ambiente |
002Eh |
|
005Ch | Bloque de control de archivo por |
006Ch | Bloque de control de archivo por defecto |
0080h | Líneas de comandos |
00FFh | Final del PSP |
La palabra de datos en desplazamiento 002Ch contiene la
direccion del segmento de bloque de variables de
ambiente
(Environment block), el cual contiene una serie de cadenas
ASCIIZ. Este bloque es heredado del proceso que causo la
ejecución del programa aplicación. Entre la
información que contiene tenemos, el paso usado por el
COMAND.COM para encontrar el archivo ejecutable, el lugar del
disco donde se encuentra el propio COMAND.COM y el formato del
prompt empleado por este. La cola de comandos, la cual
está constituida por los caracteres restantes en la
línea de comandos, después del nombre del programa,
es copiado a partir de la localidad 0081h en el PSP. La longitud
de la cola, sin incluir el carácter de retorno al final,
está ubicada en la posición 0080h. Los
parámetros relacionados con redireccionamiento o piping no
aparecen en esta posición de la linea de comandos, ya que
estos procesos son
transparentes a los programas de aplicación. Para
proporcionar compatibilidad con CP/M, el MS-DOS coloca los dos
primeros comandos en la cola, dentro de los bloques de control
del archivo (FCD) por defecto en las direcciones PSP:005Ch
yPSP:006Ch asumiendo que pueden ser nombre de archivos. Sin
embargo, si alguno de estos comandos son nombres de archivos que
incluyen especificaciones del paso, la información
colocada en los FCB no será de utilidad ya que
estas estructuras no
soportan el manejo de estructuras
jerárquicas de archivos y subdirectorios. Los FCB son de
muy escaso uso en los programas de aplicación modernos. El
área de 128 bytes ubicado entre las direcciones 0080h y
00FFh en el PSP pueden también servir como área de
transferencia de disco por defecto (DTA), la cual es establecida
por el MS-DOS antes de transferir el control al programa de
aplicación. A menos que el programa establezca de manera
explícita otra DTA, este será usado como buffer de
datos para cualquier intercambio con disco que este
efectué. Los programas de aplicación no deben
alterar la información contenida en el PSP a partir de la
dirección 005Ch.
Estructura de un programa de extension exe: Los
programas EXE son ilimitados en tamaño (él limite
lo dictamina la memoria disponible del equipo). Además,
los programas EXE pueden colocar el código, datos y pila
en distintos segmentos de la memoria. La oportunidad de colocar
las diversas partes de un programa en fragmentos diferentes de
memoria y la de establecer segmentos de memoria con solamente
códigos de que pudieran ser compartidos por varias tareas,
es un significativo para ambientes multitareas tales como el
Microsoft
Windows. El
cargador del MS-DOS, sitúa al programa EXE, inmediatamente
después del PSP, aunque el orden de los segmentos que lo
constituyen pueden variar. El archivo EXE contiene un encabezado,
bloque de información de control, con un formato
característico. El tamaño de dicho encabezado pude
variar dependiendo del numero de instrucciones que deben ser
localizadas al momento de carga del programa, pero siempre
será múltiplo de 512. Antes de que el MS-DOS
transfiera el control al programa, se calculan los valores
iniciales del registro del segmento de código (CS) y el
apuntador de instrucciones (IP) basados en
la información sobre el punto de entrada, al programa,
contenida en el encabezado del archivo EXE. Esta
información es general a partir de la instrucción
END en él modulo principal del programa fuente. Los
registros de segmentos de datos y segmentos extras inicializados
de manera que apunten al PSP de tal manera que el programa pueda
tener acceso a la información contenida.
Imagen de Memoria de un programa EXE
típico
SS:SP | Segmento de Pila |
SS:0000h | Datos del Programa |
CS:0000h | Código del Programa |
DS:0000h | Prefijo del segmento del Programa |
ES: 0000h |
|
Formato de un archivo de carga EXE.
0000h | Primera parte del identificador del archivo EXE |
0001h | Segunda parte del identificador de archivo EXE |
0002h | Longitud del archivo MOD 512 |
0004h | Tamaño del archivo, en páginas de |
0008h | Número de ítems en la tabla de |
000Ah | Tamaño del encabezado en párrafos |
000Ch | Número mínimo de párrafos |
000Eh | Máximo número de párrafos |
0010h | Desplazamiento del segmento del módulo de |
0012h | Suma de chequeo |
0016h | Contenido del apuntador de instrucciones al |
0018h | Desplazamiento del segmento del módulo de |
001Ah | Desplazamiento del primer ítem en la tabla |
001Bh | Número de overplay (0 para la parte |
| Tabla de relocalizaciones |
| Espacio reservado (longitud variable) |
| Segmento de programas y datos |
| Segmento de pila |
El contenido inicial del segmento de pila y de la
apuntador de pila provienen también del encabezado del
archivo. Esta información es derivada de la
declaración del segmento de pila efectuada mediante la
sentencia STACK. El espacio reservado para la pila puede ser
inicializado o no dependiendo de la manera como este haya sido
declarado. Puede ser conveniente en muchos casos inicializar el
segmento de pila con un patrón de caracteres
predeterminados que permitan su posterior inspección.
Cuando el programa EXE finaliza su ejecución debe retornar
el control al sistema operativo mediante la función 4Ch de
la Int 21h. Existen otros métodos,
pero no ofrecen ninguna otra ventaja y son considerablemente
menos convenientes " Generalmente requieren que el registro CS
apunte al segmento de PSP".
Un programa EXE puede ser construido a partir de varios
módulos independientes. Cada modulo puede tener nombres
diferentes para el segmento de código y los procedimientos
pueden llevar el atributo NEAR o FAR, dependiendo del
tamaño del programa ejecutable. El programador debe
asegurarse de que los módulos, a ser enlazados solo tenga
una declaración de segmento de pila y que haya siod
definido un único punto de entrada (por medio de la
directiva END). La salida del enlazador es un archivo con
extensión EXE el cual puede ser ejecutado
inmediatamente.
6. Acceso a las
interrupciones del bios y dos
desde rom
El ROM
BIOS y DOS
contiene rutinas que pueden ser usadas en los programas. Estas
rutinas usualmente no son invocadas por procedimientos usuales,
pero pueden ser accedido por mecanismos de interrupción.
La mayoría de los programadores típicamente
organizan los programas por intrusiones CALL. El BIOS y las
funciones del
DOS están en forma de código objeto, y se
encuentran en direcciones de memoria, en el lenguaje
ensamblador
hay una instrucción denominada INT que genera una
interrupción de software, en un
microprocesador 80x 86 que provee una solución a
determinado código de interrupción. El 80 x 86 usa
código de interrupciones como índice en una tabla
para localizar la rutina a ejecutar cuando la interrupción
ocurre. Esta tabla de funciones son conocidas como Tabla del
Vector de Interrupción (IVT) y las funciones son conocidas
como Interrupciones Rutinarias de Servicio
(ISR’s). El IVT esta localizado en el primer 1,024 Byte de
Memoria y contiene 256 entradas. Desde cada dirección ISR
es de la forma CS:IP cada
entrada en el IVT requiere de 4 Byte de almacenamiento
(256 * 4 = 1,024 B). El 80×86 recibe la señal de
interrupción primero empuja (PUSH) los Flags, CS y el
registro IP que se encuentra en la pila en ese orden, luego el
CPU usa el numero de interrupción para indexarlo en el
vector de interrupción (IVT) y luego salta a las rutinas
de servicio de
interrupción (ISR’s) para esa interrupción.
El ISR’s termina con IRET (Interrup RETRY) los cual remueve
los datos de la pila (POP) el Intrusión Pointer (IP), el
Code Segment (CS) y Flags de la Stack (pila) por la cual retorna
el control a la interrupción del programa. Ej: 1.-
Ejecutando la interrupción 5 ocasiona que el
microprocesador grabe el siguiente estado y salta
a la función de la tabla IVS en la entrada de la
interrupción 5, 2.- El microprocesador ejecuta el
código que maneja en esa interrupción (imprimir
pantalla), 3.- Cuanto IRET es ejecutado se devuelve el control
justo después del comando colocado en el programa
objeto.
7. Principales Interrupciones
del BIOS y del DOS
inT | TIPO | DESCRIPCIÓN |
2 | BIOS | Este tipo de interrupción no se puede |
5 | BIOS | Esta interrupción se encarga de imprimir el |
8 | BIOS | Esta rutina maneja la interrupción del |
9 | BIOS | Esta rutina es un procedimiento FAR KB-INT. La |
E | BIOS | Este procedimiento de tipo FAR, DISK-INT maneja la |
F | DOS | Activa la misma llamada que type 4. |
10 | BIOS | El conjunto de rutinas asociados con este |
11 | BIOS | El procedimiento proporciona él numero de |
12 | BIOS | Proporciona el tamaño de la |
13 | BIOS | Llama a varias rutinas para llevar operaciones de |
14 | BIOS | Este procedimiento permite al usuario la entrada y |
15 | BIOS | Interrupción empleada para controlar las |
16 | BIOS | Esta interrupción utiliza a AX para leer el |
17 | BIOS | Esta rutina proporciona la |
18 | BIOS | Esta interrupción llama al casette de |
19 | BIOS | La rutina asociada con esta interrupción, |
1ª | BIOS | Esta rutina permite seleccionar o leer el |
1B | DOS | Esta interrupción se presenta cada vez que |
1C | BIOS | Esta interrupción provoca la |
1D | BIOS | Esta tabla de bytes y rutinas necesarias para |
1E | DOS | Tabla de Diskette. |
1F | DOS | Tabla de gráficos. |
20 | DOS | Esta interrupción es generada por DOS para |
21 | DOS | Esta interrupción consta de varias |
22 | DOS | Cuando termina la ejecución de un programa |
23 | DOS | Esta interrupción es generada como |
24 | DOS | Esta interrupción se llama cada ves que |
25 | DOS | Esta interrupción transfiere el control, |
26 | DOS | Esta interrupción transfiere el control, |
27 | DOS | Este vector es empleado, para que al |
2F | DOS | Esta interrupción define una interfaz |
Anexo Nº 1
Medina, Ramon. Programación avanzada en
lenguaje
ensamblador. 1992, Págs. 7-19.
Barbakati, Nabaiyoti. Haybe, Randal. The waite
group´s microsoft
macro assembler bible.
Godfrey, Terry J.Lenguaje ensamblador
para microcomputadoras ibm(para principiantes y avanzados).
1991, Editorial Prentice-hall hispanoamericana, S.A. Págs.
8-12 y 143-148.
Alcalde E.; García M.; Peñuelas S.
Informática básica.1988, Editorial
McGraw-Hill. Págs. 23-48.
Autor:
Miguel Pita
Escuela de
ingeniería de sistemas
Cátedra Assembler
m_pita[arroba]hotmail.com