Unidad II: Programación básica
2.1 Ensamblador (y ligador) a utilizar
Aunque todos los ensambladores realizan básicamente las mismas tareas,
podemos clasificarlos de acuerdo a características.
Así podemos clarificarlos en:
Ensambladores Cruzados (Cross-Assembler).
Se denominan así los ensambladores que se utilizan en una computadora que
posee un procesador diferente al que tendrán las computadoras donde va a
ejecutarse el programa objeto producido.
Ensambladores Residentes.
Son aquellos que permanecen en la memoria principal de la computadora y
cargan, para su ejecución, al programa objeto producido. Este tipo de
ensamblador tiene la ventaja de que se puede comprobar inmediatamente el
programa sin necesidad de transportarlo de un lugar a otro, como se hacía en
cross-assembler, y sin necesidad de programas simuladores
Macroensambladores.
Son ensambladores que permiten el uso de macroinstrucciones (macros). Debido
a su potencia, normalmente son programas robustos que no permanecen en
memoria una vez generado el programa objeto. Puede variar la complejidad de los
mismos, dependiendo de las posibilidades de definición y manipulación de las
macroinstrucciones, pero normalmente son programas bastantes complejos, por lo
que suelen ser ensambladores residentes.
Microensambladores.
Generalmente, los procesadores utilizados en las computadoras tienen un
repertorio fijo de instrucciones, es decir, que el intérprete de las mismas
interpretaba de igual forma un determinado código de operación.
El programa que indica al intérprete de instrucciones de la UCP cómo debe actuar
se denomina microprograma. El programa que ayuda a realizar esta
microprograma se llama microensamblador.
Ensambladores de una fase.
Estos ensambladores leen una línea del programa fuente y la traducen
directamente para producir una instrucción en lenguaje máquina o la ejecuta si se
trata de una pseudoinstrucción. También va construyendo la tabla de símbolos a
medida que van apareciendo las definiciones de variables, etiquetas, etc.
Debido a su forma de traducción, estos ensambladores obligan a definir los
símbolos antes de ser empleados para que, cuando aparezca una referencia a un
determinado símbolo en una instrucción, se conozca la dirección de dicho símbolo
y se pueda traducir de forma correcta. Estos ensambladores son sencillos, baratos
y ocupan poco espacio, pero tiene el inconveniente indicado.
Ensambladores de dos fases.
Los ensambladores de dos fases se denominan así debido a que realizan la
traducción en dos etapas. En la primera fase, leen el programa fuente y
construyen una tabla de símbolos; de esta manera, en la segunda fase, vuelven a
leer el programa fuente y pueden ir traduciendo totalmente, puesto que conocen la
totalidad de los símbolos utilizados y las posiciones que se les ha asignado. Estos
ensambladores son los más utilizados en la actualidad.
2.2 Ciclos numéricos
La arquitectura de los procesadores x86 obliga al uso de segmentos de memoria
para manejar la información, el tamaño de estos segmentos es de 64kb.
La razón de ser de estos segmentos es que, considerando que el tamaño máximo
de un número que puede manejar el procesador esta dado por una palabra de 16
bits o registro, no sería posible accesar a más de 65536 localidades de memoria
utilizando uno solo de estos registros, ahora, si se divide la memoria de la pc en
grupos o segmentos, cada uno de 65536 localidades, y utilizamos una dirección
en un registro exclusivo para localizar cada segmento, y entonces cada dirección
de una casilla específica la formamos con dos registros, nos es posible accesar a
una cantidad de 4294967296 bytes de memoria, lo cual es, en la actualidad, más
memoria de la que veremos instalada en una PC.
Para que el ensamblador pueda manejar los datos es necesario que cada dato o
instrucción se encuentren localizados en el área que corresponde a sus
respectivos segmentos. El ensamblador accesa a esta información tomando en
cuenta la localización del segmento, dada por los registros DS, ES, SS y CS, y
dentro de dicho registro la dirección del dato específico.
2.5 Saltos
La mayoría de los programas constan de varios ciclos en los que una serie de
pasos se repite hasta alcanzar un requisito específico y varias pruebas para
determinar qué acción se realiza de entre varias posibles.
Una instrucción usada comúnmente para la transferencia de control es la
instrucción JMP
(jump, salto, bifurcación). Un salto es incondicional, ya que la operación transfiere
el control bajo cualquier circunstancia. También JMP vacía el resultado de la
instrucción previamente procesada; por lo que, un programa con muchas
operaciones de salto puede perder velocidad de procesamiento.
La instrucción LOOP, requiere un valor inicial en el registro CX. En cada iteración,
LOOP de forma automática disminuye 1 de CX. Si el valor en el CX es cero, el
control pasa a la instrucción que sigue; si el valor en el CX no es cero, el control
pasa a la dirección del operando. La distancia debe ser un salto corto, desde -128
hasta +127 bytes. Para una operación que exceda este límite, el ensamblador
envía un mensaje como "salto relativo fuera de rango".
Comentarios
Publicar un comentario