domingo, 13 de abril de 2008

EXPLICANDO ASSEMBLER 2

Bueno, acá esta la cuestión:


CS, Current Segment: Es el Segmento actual de ejecución, juntos CS:IP apuntan a la próxima orden que el Micro debe leer para ejecutar. Veamos algo:

CS:IP = 1000:FFFA hay una orden entonces IP se incrementa:

CS:IP = 1000:FFFE Que pasa si ahora hay otra orden, e IP se incrementa de nuevo?

Fácil: FFFE+1 = FFFF pero FFFF+1 = 10000 !!!

Que pasa en este caso? CS no se incrementa, e IP no puede contener un numero de 5 cifras! Lo que pasa es que IP vuelve a 0000 y el programa sigue en CS:IP o sea 1000:0000, lo que es una posición 64k mas baja de memoria, o sea cualquier lado... Este es el problema por lo que los .COMs no pueden tener mas de 64k de largo sin hacer nada raro (cambiar CS cuando sea necesario).

DS, Data Segment: Es el segmento destinado a ser usado junto con BX, SI y DI para apuntar a una dirección de memoria. También puede ser usado con BP y SP, pero hace falta expresarlo concretamente. (Mas adelante aclaro esto)

ES, Extra Segment: Es un segmento Extra para ser utilizado cuando haga falta. También tiene una función propia: Junto con DI indican el destino en las "órdenes de cadena" (el dato leído de DS:SI es puesto en ES:DI, en las ordenes de movimiento).

SS, Stack Segment: El segmento de Stack; junto con SP apuntan a la última posición que fue utilizada para "depositar" datos en el Stack.

Por ultimo:

Flags: Es un registro especial en el cual se guardan los resultados de la última operación matemática o de comparación. No se guardan los resultados numéricos, solo los de estado, es decir:

Hasta aquí la explicación de los registros internos del Micro.

Para apuntar a una posición, hace falta indicar su Offset y su Segment, esto se hace mediante un registro de segmento (DS, CS, SS, ES) y un Offset, que puede ser un número o un registro como BS, SI, DI, BP, SP:DS:[3304h] Apunta al Segment DS y al offset 3304h.

Los corchetes indican que loque se quiere es el contenido de esa posición, no la posición en si.ES:[BX] Indica a la posición que esta en el Segmento DS y el Offset BX.SS:[SP] Indica la posición de arriba de todo del Stack, apuntada por el Segmento SS y el Offset SP.No siempre hace falta indicar el Segment al que se apunta.

Como el segment DS es el destinado para poner los datos, la gente de Intel decidió que si no se especifica segmento para un offset absoluto (un número como el primer caso), o para los registros BS, SI y DI, se asume DS. Para los registros SP y BP, se asume SS como Segmento por defecto. Entonces:

[1304h] Indica el contenido de DS:[1304h]

[BX] Apunta a DS:[BX], pero

ES:[BX] Apunta a ES:[BX], porque se especifica ES

ES:[0017h] -> a ES:[0017h]

[SP] -> a SS:[SP]

CS:[SP] -> a CS:[SP]

CS:[DI] -> a CS:[DI]

SS:[SI] -> a SS:[SI]

[SI] -> a DS:[SI]

[DI] -> a DS:[DI]

[BP] -> a SS:[BP]

ES:[BP] -> a ES:[BP]

Es decir, cualquier combinación de Segmento y Registro Índice o Base o Offset Absoluto puede ser formada, pero no siempre hace falta aclarar el Segmento.

Hasta ahora vimos que en los microprocesadores hay variables llamadas REGISTROS, que cada uno esta destinado a una función especial, pero que en general se dividen en dos grandes grupos, los registros de uso general, por decirles de alguna forma, y los exclusivamente para ser usados como segmentos. Vamos a ver como es un programa en Assembler, pero antes, quiero aclarar que es un Assembler.

Assembler, propiamente dicho, es el programa (TASM, MASM, A86, etc.) que se ocupa de transformar lo que nosotros escribimos, en palabras, se podría decir, a número, que es lo que realmente entiende la máquina. En realidad, lo convierte, actualmente, en un código objeto, .OBJ, que es una herramienta que se creo para poder unir o Linkear varias rutinas hechas en distintos momentos y/o lenguajes. Lo que completa el proceso es el Linker, TLINK, LINK, OPTLINK, BLINKER, etc. Lo que yo uso, particularmente, son el Assembler y Linker de Borland, el TASM y el TLINK, pero bueno, si alguien quiere usar alguno mas, es cosa de darse maña, o preguntar que hay que cambiar.

Primero, para comenzar por algo fácil, y para que por fin, de una vez por todas, puedan comenzar a hacer algo, vamos a hacer un .COM, es lo mas simple, mas rápido, y mas fácil de recordar.

1 comentario:

Anónimo dijo...

Al no tener bibliografia quiere decir que todo lo que esta en este blog han sido estudios realizados por usted, asi que por favor escriba la bibliografia de donde obtuvo cada tema.
Al igual que el tema anterior habla mucho y hay bastantes cosas que son muy tecnicas y para un usuario que quiera entrar a ver este blog no entenderia nada de lo que trata.

Julian Cardenas
Fernando Perez
Lina Cuervo