Resumen del curso de Ensamblador

resumen asm
Como lo prometido es deuda, aquí os pongo el resumen de Assembler que había comentado al finalizar el curso para tener las ideas más claras, antes por su puesto, se tiene que haber leído el curso pero por si alguien no entendió algún concepto o se que perdió en algún paso, espero que este resumen con las ideas principales esquematizadas os ayude un poco.



Ensamblador (bajo nivel) = lenguaje máquina

¿ Por que es un lenguaje máquina? (bajo nivel)
flecha
Porque esta cerca del lenguaje máquina

Las personas usan el lenguaje articulado para comunicarse y los ordenadores usan el lenguaje binario, El ensamblador facilita la “traducción” ya que contiene grupos alfabéticos insertados en el código binario a modo de instrucción (mnemotécnico)

La computadora está formada por tres partes

flecha

Unidad central de proceso que esta compuesta por :

Unidad de Control. Esta formada por un registro que almacena la instrucción, mientras que el registro de instrucción la interpreta. La UC debe conocer la instrucción exacta que el contador de programa guardará para su uso posterior. La UC no puede emitir todas las instrucciones a la vez, por lo que son sincronizadas a través de impulsos de reloj y los indicadores de estado.

Unidad Aritmético - Lógica. Realiza los calculos de las operaciones ,los datos en los que se basa son los operandos y el encargado de realizar y modificar las operaciones, operador ;formado por circuitos electrónicos que realizan las operaciones elementales que se guarda en los registros de trabajo.

Memoria principal Esta formada por palabras que contienen las instrucciones y están compuestas por bits(con valores 0 y 1) La longitud de la palabra depende del numero de bits y forman matrices de 10 filas y 10 columnas(la primera corresponde con la 00 y asi sucesivamente) y se distinguen por la posición que ocupan en la MP. La acción de guardar una información en una palabra de la memoria se llama acceso de escritura, y la acción de recuperarla, acceso de lectura. Los accesos son coordinados por la UC. A la cantidad de palabras que forman la MP se le denomina capacidad de memoria

Unidad entradas y salidas Son los que organizan la comunicación de los elementos externos que comunican la CPU y la MP (periféricos),asignandole a cada uno una dirección para su identificación .

Interconexión de las unidades funcionales La información se transmite por señales eléctricas enviadas por los conductores en paralelo (igual cantidad de bits que de conductores) Los conductores que transmiten la señal de la CPU son los bus de direcciones y la respuesta de MP es transmitida por los BUS eléctricos. Las unidades funcionales pueden ser conectadas por un único conjunto de buses a bajo costo pero con lento rendimiento, o empleando conjuntos de buses diferentes para las E/S y la MP. Para ganar velocidad en el sistema.

Los registros de procesador controlan instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar capacidad aritmética. Los registros son direccionales por medio de un nombre. Los bits por convención, se numeran de derecha a izquierda

Tipos de registro

De segmento Facilita un área de memoria para el redireccionamiento
Registro CS. Almacena la dirección inicial de código de un programa.
Registro SS. Permite la colocación en memoria de una pila para el almacenamiento de datos temporal
• Registros ES. Registro extra de segmento para manejar el direccionamiento de memoria.
• Registros FS y GS. Son registros extra de segmento en los procesadores 80386 y posteriores.
De propósito general. Se puede direccionarlos como una palabra o como una parte de un byte.
Registro AX. Simplifica entrada/salida
Registro BX. Se emplea para índice para direccionamiento indexado y cálculos.
Registro DX. Registro de datos.
Apuntador de Instrucciones Indica la instrucción actual dentro del segmento de código que se esta ejecutando actualmente.
Registros Apuntadores. Permiten al sistema accesar datos en el segmento de la pila.
Registro SP Proporciona un valor de desplazamiento que se refiere a la palabra actual que esta siendo procesada en la pila
Registros Índice Los registros SI y DI están disponibles para direccionamiento indexado y para sumas y restas.
• Registro SI. Es requerido por algunas operaciones con cadenas (de caracteres).
Registro DI También es requerido por algunas operaciones con cadenas de caracteres.
Registro de Banderas Sirven para indicar el estado actual de la maquina y el resultado del procesamiento.
* OF (Overflow, desbordamiento).
* DF (dirección)
* IF (interrupción)
* TF (trampa).
* SF (signo)
* ZF (cero)
* AF (acarreo auxiliar)
* PF (paridad)
* CF (acarreo)

Un segmento es un área especial en un programa que inicia en un limite de un párrafo( que es una dirección); pueden ser de varios tipos; de datos (DS),de código (CS),de pila (SS) etc. Los registros de segmentos contienen la dirección inicial de estos. En un programa, todas la localidades de memoria están referidas a una dirección inicial de segmento. La distancia en bytes desde la dirección del segmento se define como el desplazamiento (offset).

El direccionamiento comprende todo el proceso por el que pasa la información en sus distintas fases:

1. Búsqueda de la instrucción de la memoria.
2. Decodificar la instrucción.
3. Ejecutar la instrucción.

Existen varios tipos de direccionamiento (procesos de traspaso de información en la UC)

Modo implícito Se especifican los operandos en forma implícita en la definición de la instrucción.
Modo inmediato Se especifica el operando en la instrucción misma.
Modo de registro Los operandos están en registros que residen dentro de la CPU.
Modo indirecto por registro La instrucción especifica un registro en la CPU cuyo contenido proporciona la dirección del operando en la memoria.
Modo de direccionamiento directo La dirección efectiva es igual a la parte de dirección de la instrucción.
Modo de direccionamiento indirecto El campo de dirección de la instrucción proporciona la dirección en que se almacena la dirección efectiva en la memoria.
Modo de direccionamiento indexado El contenido de un registro índice se suma a la parte de dirección de la instrucción para obtener la dirección efectiva.
Modo de direccionamiento de registro base El contenido de un registro base se suma a la parte de dirección de la instrucción para obtener la dirección efectiva.

El conocer el tipo de direccionamiento proporciona al programador flexibilidad para elaborar programas más eficientes en relación con la cantidad de instrucciones y el tiempo de ejecución.


La interrupción consiste simplemente en suspender la ejecución de un programa de forma que la “rutina” queda interrumpida volviendo así al proceso que interrumpió la ejecución para reasumirla posteriormente. Cuando la computadora se enciende, el BIOS y el DOS establecen una tabla de servicios de interrupción en las localidades de memoria, permitiendo el uso de 256 interrupciones, cada una con un desplazamiento: segmento relativo de cuatro bytes en la forma IP:CS. Cada interrupción guarda en la pila el contenido del registro de banderas, el CS, y el IP.
Existen dos tipos de interrupciones:
Externa es provocada por un dispositivo externo al procesador.
Interna ocurre como resultado de la ejecución de una instrucción INT o una operación de división que cause desbordamiento.



El BIOS contiene un extenso conjunto de rutinas de entrada/salida y tablas que indican el estado de los dispositivos del sistema. El dos y los programas usuarios pueden solicitar rutinas del BIOS para la comunicación con los dispositivos conectados al sistema. El método para realizar la interfaz con el BIOS es el de las interrupciones de software. Ejemplos

• INT 00H: División entre cero.
• INT 01H: Un solo paso
• INT 03H: Punto de ruptura.
• INT 04H: Desbordamiento.
• INT 05H: Imprime pantalla.
• INT 08H: Sistema del cronometro
INT 09H: Interrupción del teclado.
• INT OBH, INT OCH: Control de dispositivo serial
• INT 0DH, INT OFH: Control de dispositivo paralelo.
• INT 0EH: Control de disco flexible.
INT 10H: Despliegue en vídeo.
• INT 11H: Determinación del equipo.
• INT 12H: Determinación del tamaño de la memoria.
• INT 13H: Entrada/salida de disco.

Las interrupciones desde la 20H hasta la 3FH están reservadas para operaciones del DOS

• INT 20H: Termina programa.
• INT 21H: Petición de función al DOS
• INT 22H: Dirección de terminación.
• INT 23H: Dirección de Cltr + Break.
• INT 24H: Manejador de error critico.
• INT 25H: Lectura absoluta de disco.
• INT 26H: Escritura absoluta de disco.
• INT 27H: Termina pero permanece residente (reside en memoria).
• INT 2FH: Interrupción de multiplexion
• INT 33H: Manejador del ratón

Los comentarios sirven para aclarar las instrucciones, se definen con un ; (punto y coma) designando los caracteres situados a la derecha (osea, lo que esta a la dcha. del punto y la coma es el comentario)

Ciertas palabras en lenguaje ensamblador están reservadas para sus propósitos propios, y son usadas solo bajo condiciones especiales e incluyen:

• Instrucciones, como MOV y ADD, que son operaciones que la computadora puede ejecutar.
• Directivas como END o SEGMENT, que se emplean para proporcionar comandos al ensamblador.
• Operadores, como FAR y SIZE, que se utilizan en expresiones.
Símbolos predefinidos, como @Data y @Model, que regresan información a su programa.


• Identificadores Es un nombre que se aplica a elementos en el programa. Los dos tipos de identificadores son: nombre, que se refiere a la dirección de un elemento de dato. y etiqueta, que se refiere a la dirección de una instrucción(pueden contener, letras, numeros y caracteres especiales)

• Instrucciones Un programa en lenguaje ensamblador consiste en un conjunto de enunciados. Los dos tipos de enunciados son:
1. Instrucciones, tal como MOV y ADD, que el ensamblador traduce a código objeto.
2. Directivas, que indican al ensamblador que realiza una acción especifica, como definir un elemento de dato.

• Identificador El termino nombre se aplica al nombre de un elemento o directiva definida, mientras que el termino etiqueta se aplica al nombre de una instrucción.
Operación La operación, que debe ser codificada, es con mayor frecuencia usada para la definición de áreas de datos y codificación de instrucciones.
• Operando El operando (si existe) proporciona información para la operación que actúa sobre el.
• Directivas para listar: Page y title Ayudan a controlar el formato de un listado de un programa en ensamblador.
• Directiva segment Define el inicio de un segmento.
• Tipo alineación La entrada alineación indica el limite en el que inicia el segmento.
• Tipo combinar La entrada combinar indica si se combina el segmento con otros segmentos cuando son enlazados después de ensamblar.
• Tipo clase La entrada clase, encerrada entre apóstrofos, es utilizada para agrupar segmentos cuando se enlazan.
• Directiva assume Es un mensaje que ayuda al ensamblador a convertir código simbólico a código maquina.


Los ensambladores de MicroSoft y de Borland proporcionan algunas formas abreviadas para definir segmentos. El modelo de memoria puede ser TINY, SMALL, MEDIUM, COMPACT o LARGE. Los formatos generales (incluyendo el punto inicial) para las directivas que define los segmentos de la pila, de datos y de código son:


.STACK [tamaño]
.DATA
.CODE [nombre]


Cada una de estas directivas hace que el ensamblador genere el enunciado SEGMENT necesario y su correspondiente ENDS.

La instrucción de transferencia de datos por excelencia es MOV destino, fuente ,entendiendo por fuente el contenido que se va a transferir a una determinada zona o registro de memoria denominada destino. Esta instrucción transfiere información entre registros y memoria pero tiene algunas restricciones como que no se puede realizar una transferencia de datos entre dos posiciones de memoria. Tampoco se puede hacer una transferencia directa entre dos registros de segmento Asimismo, tampoco se puede cargar en los registros de segmento un dato utilizando direccionamiento inmediato.

Las instrucciones ADD y SUB realizan sumas y restas sencillas de datos binarios. Este alerta con los desbordamientos en las operaciones aritméticas. Ya que un byte solo permite el uso de un bit de signo y siete de datos (desde -128 hasta +127), una operación aritmética puede exceder con facilidad la capacidad de un registro de un byte. Y una suma en el registro AL, que exceda su capacidad puede provocar resultados inesperados.


La lógica booleana es importante en el diseño de circuitos y tiene un paralelo en la lógica de programación. Las instrucciones para lógica booleana son:

• AND. Si ambos bits comparados son 1, establece el resultado en 1. Las demás condiciones dan como resultado 0.
• OR. Si cualquiera (o ambos) de los bits comparados es 1, el resultado es 1. Si ambos bits están en 0, el resultado es 0.
• XOR. Si uno de los bits comparados es 0 y el otro 1, el resultado es 1. Si ambos bits comparados son iguales (ambos 0 o ambos 1), el resultado es 0.
• TEST. Establece las banderas igual que lo hace AND, pero no cambia los bits de los operandos.

La instrucción NOT solo invierte los bits en un byte o palabra en un registro o en memoria; esto es, convierte los ceros en unos y los unos en ceros.

Las instrucciones de corrimiento, que son parte de la capacidad lógica de la computadora, pueden realizar las siguientes acciones:


1. Hacer referencia a un registro o dirección de memoria.
2. Recorre bits a la izquierda o a la derecha.
3. Recorre hasta 8 bits en un byte, 16 bits en una palabra y 32 bits en una palabra doble.
4. Corrimiento lógico (sin signo) o aritmético (con signo).


Los corrimientos hacia la derecha (SHR y SAR) mueven los bits hacia la derecha en el registro designado. Los corrimientos hacia la izquierda (SHL y SAL) mueven los bits a la izquierda,


Las instrucciones de rotación, que son parte de la capacidad lógica de la computadora, pueden realizar las siguientes acciones:

1. Hacer referencia a un byte o a una palabra.
2. Hacer referencia a un registro o a memoria.
3. Realizar rotación a la derecha o a la izquierda. El bit que es desplazado fuera llena
el espacio vacante en la memoria o registro y también se copia en la bandera de acarreo.
4. Realizar rotación hasta 8 bits en un byte, 16 bits en una palabra y 32 bits en una palabra doble.
5. Realizar rotación lógica (sin signo) o aritmética (con signo).(tambien se rota a la dcha y a la izq)

Para la multiplicación, la instrucción MUL maneja datos sin signo y la instrucción IMUL (multiplicación entera) maneja datos con signo. Para multiplicar dos números de un byte, el multiplicando esta en el registro AL y el multiplicador es un byte en memoria o en otro registro. Para multiplicar dos números de una palabra, el multiplicando esta en el registro AX y el multiplicador es una palabra en memoria o en otro registro. Para multiplicar dos números de palabras dobles, el multiplicando esta en el registro EAX y el multiplicador es una palabra doble en memoria o en otro registro.


Para la división, la instrucción DIV (dividir) maneja datos sin signo y la IDIV (división entera) maneja datos con signo.Para dividir palabra por palabra el dividendo esta en el AX y el divisor es un byte en memoria o en otro registro.Para dividir palabra doble entre palabra el dividendo esta en el par DX:AX y el divisor es una palabra en memoria o en otro registro.Para las palabras cuádruples entre palabras dobles el dividendo esta en el par EDX:EAX y el divisor esta en una palabra doble en memoria o en otro registro.

La instrucción CMP pro lo común es utilizada para comparar dos campos de datos, uno de los cuales están contenidos en un registro.

La instrucción CMPS compara el contenido de una localidad de memoria (direccionada por DS:SI). Dependiendo de la bandera de dirección.

Ciertas instrucciones pueden transferir el control fuera del flujo secuencial normal añadiendo un valor de desplazamiento al IP.


Una operación de salto alcanza una dirección corta por medio de un desplazamiento de un byte.

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.

La instrucción LOOP, requiere un valor inicial en el registro CX. En cada iteración.


El ensamblador permite usar una variedad de instrucciones de salto condicional que transfieren el control dependiendo de las configuraciones en el registro de banderas.

Distinguir el propósito de los saltos condicionales debe clarificar su uso. Un dato sin signo trata todos los bits como bits de datos; Un dato con signo trata el bit de mas a la izquierda como un signo, en donde 0 es positivo y 1 es negativo.


El segmento de código contiene el código ejecutable de un programa. También tiene uno o mas procedimientos, definidos con la directiva PROC.

La directiva ENDP indica el fin de un procedimiento y contiene el mismo nombre que el enunciado PROC para permitir que el ensamblador relacione a los dos.


Un procedimiento llamado (o subrutina) es una sección de código que realiza una tarea definida y clara (tal como ubicar el cursor o bien obtener entrada del teclado).


La instrucción CALL transfiere el control a un procedimiento llamado, y la instrucción RET regresa del procedimiento llamado al procedimiento original que hizo la llamada. Una llamada (CALL) a un procedimiento dentro del mismo segmento es cercana y realiza lo siguiente:


• Disminuye el SP en 2 (una palabra)
• Mete el IP en la pila.
• Inserta la dirección del desplazamiento del procedimiento llamado en el IP
Un RET que regresa desde un procedimiento cercano realiza lo siguiente:
• Saca el antiguo valor de IP de la pila y lo envía al IP
• Incrementa el SP en 2.



las macros son instrucciones complejas, formada por otras instrucciones más sencillas. Esto permite la automatización de tareas repetitivas. Se pueden programar macros en casi todos los lenguajes de programación y sus utilidades son muy variadas

La directiva MACRO en la primer línea indica al ensamblador que las instrucciones que siguen, los nombres a que se hace referencia en la definición de la macro, deben estar definidos en alguna parte del programa o deben ser dados a conocer de alguna otra forma al ensamblador. En forma subsecuente se puede usar la macro-instruccion en el segmento de código en donde quiera inicializar los registros.


Para hacer una macro flexible, puede definir nombres en ella como argumentos mudos (ficticios).La definición de la macro siguiente, llamada DESPLEGAR_MSG, proporciona el uso de la función 09H del DOS para desplegar cualquier mensaje. Un argumento mudo en una definición de macro indica al ensamblador que haga coincidir su nombre con cualquier aparición del mismo nombre en el cuerpo de la macro y puede contener cualquier nombre valido, incluyendo un nombre de registro tal como CX. Algunas macros necesitan que se definan elementos de datos y etiquetas de instrucciones dentro de la definición de la macro.

El enfoque habitual es catalogar las macros en una biblioteca en disco bajo un nombre descriptivo, como MACRO.LIB.

* La Directiva PURGE. hace que el ensamblador incluya todas las definiciones de macros que están especificadas en la biblioteca.

Para saber más :Para los que querais seguir profundizando en el lenguaje ensamblador iré añadiendo links que sean interesantes para la materia.

* Curso de lenguaje ensamblador

* Ejemplos de Ensamblador para DOS, Linux y Windows

* Código máquina para principiantes

* Lenguaje máquina: Introducción y conceptos avanzados

* Programacion del z80 en ensamblador

No hay comentarios :