Unidad 2
Short Description
Download Unidad 2...
Description
Instituto Tecnológico de Tuxtla Gutiérrez. Lenguajes de Interfaz Tóala Pérez Manuel de Jesús 10270981
Catedrático: MC. Walter Torres Robledo
Ingeniería en Sistemas Computacionales.
Unidad 2 Programación básica al lenguaje ensamblador. March 23, 2013
1
Contents 1
2
Introducción al lengua je ensamblador.
2
1.1
Importancia de la programación en lenguaje ensamblador. . . . .
2
1.2
El procesador y sus registros internos . . . . . . . . . . . . . . . .
3
1.3
La memoria principal (RAM) . . . . . . . . . . . . . . . . . . . .
6
1.4
El concepto de interrupciones . . . . . . . . . . . . . . . . . . . .
6
1.5
Llamadas a servicios del sistema
7
1.6
Modos de direccionamiento
. . . . . . . . . . . . . . . . . . . . .
7
1.7
Proceso de ensamblado y ligado . . . . . . . . . . . . . . . . . . .
9
1.8
Desplegado de mensajes en el monitor
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . .
Programación básica
11
2.1
Ensamblador (y ligador) a utilizar
. . . . . . . . . . . . . . . . .
2.2
Ciclos numéricos
11
. . . . . . . . . . . . . . . . . . . . . . . . . . .
12
2.3
Captura básica de cadenas . . . . . . . . . . . . . . . . . . . . . .
12
2.4
Comparación y prueba . . . . . . . . . . . . . . . . . . . . . . . .
13
2.5
Saltos
14
2.6
Ciclos condicionales
2.7
Incremento y decremento
2.8
Captura de cadenas con formato
2.9
Instrucciones aritméticas . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.10 Manipulación de la pila
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . .
2.11 Obtención de cadena con representación decimal
14 15 15 15 16
. . . . . . . . .
16
. . . . . . . . . . . . . . . . . . . . . . . . .
17
2.13 Desplazamiento y rotación . . . . . . . . . . . . . . . . . . . . . .
17
2.12 Instrucciones lógicas
2.14 Obtención de una cadena con la representación hexadecimal . . .
18
2.15 Captura y almacenamiento de datos numéricos
. . . . . . . . . .
18
. . . . . . . . . . . .
18
2.16 Operaciones básicas sobre archivos de disco 3
10
Preguntas
1
18
Introducción al lenguaje ensamblador.
1.1
Importancia de la programación en lenguaje ensamblador.
A pesar del hecho de que codicar en un lenguaje de alto nivel es más productivo, alguna de las ventajas de codicar en lenguaje ensamblador son:
Proporciona más control sobre el manejo particular de los requerimientos de hardware.
Genera módulos ejecutables más pequeños y más compactos.
Con mayor probabilidad tiene una ejecución más rápida
2
Un programa escrito en lenguaje ensamblador requiere considerablemente menos memoria y tiempo de ejecución que un programa escrito en los conocidos lenguajes de alto nivel, como Pascal y C. [1] El lenguaje ensamblador da a un programador la capacidad de realizar tareas muy técnicas que serían difíciles, si no es que imposibles de realizar en un lenguaje de alto nivel. El conocimiento del lenguaje ensamblador permite una comprensión de la arquitectura de la máquina que ningún lenguaje de alto nivel puede ofrecer. Aunque la mayoría de los especialistas en software desarrolla aplicaciones en lenguaje de alto nivel, que son más fáciles de escribir y de dar mantenimiento, una práctica común es recodicar en lenguaje ensamblador aquellas rutinas que han causado cuellos de botella en el procesamiento. Los programas residentes y rutinas de servicio de interrupción casi siempre son desarrollados en lenguaje ensamblador. [1] Los lenguajes de alto nivel fueron diseñados para eliminar las particularidades de una computadora especíca, mientras que un lenguaje ensamblador está diseñado para una computadora especíca, o, de manera más correcta, para una familia especíca de microprocesadores. Por último, una buena razón para programar en lenguaje ensamblador es que no todos los computadores ofrecen la posibilidad de usar lenguajes de alto nivel. La mayoría de los computadores antiguos o los especializados no poseen compiladores de lenguaje de alto nivel, por tanto la única opción del programador es usar el lenguaje ensamblador.
1.2
El procesador y sus registros internos
Los registros del procesador se emplean para controlar instrucciones en ejecución, manejar direccionamiento de memoria y proporcionar capacidad aritmética. Son áreas del almacenamiento dentro del procesador, usadas para almacenar datos con los cuales está trabajando el procesador en un momento dado de la ejecución de una instrucción.
3
Figure 1: Diagrama Bloques
Algunas características de los Registros internos
Cada Procesador contiene cierto número de estos.
Los registros son la memoria más rápida de la PC
La mayoría de las operaciones se realizan en los registros
El ancho de los registros (en bits), determina cuanta información puede manejar
El tamaño del procesador está ligado a los registros internos
Los registros internos del procesador se pueden clasicar en 6 tipos diferentes 1. Registros de segmento 2. Registros de propósito general 3. Registros de apuntadores 4. Registros de banderas 5. Registros de Puntero de instrucción 6. Registros de Pila
4
Los registros de segmento se utilizan para referenciar áreas de memoria.
La
plataforma IA-32 permite direccionar la memoria según el modelo de memoria lineal o el modelo de memoria segmentada. El modelo de memoria lineal presenta todo el espacio de direcciones de la memoria como un espacio contiguo. Todas las instrucciones, los datos y la pila se encuentran en el mismo espacio de direcciones de memoria. Cada posición de memoria se referencia mediante una dirección especíca llamada "dirección lineal". El problema del enfoque anterior consiste en que todos los datos se encuentran mezclados entre sí y a la vez distribuidos a lo largo de todo el espacio de direcciones memoria, lo cual hace que su manejo sea engorroso e ineciente. El modelo de memoria segmentada resuelve este problema dividendo el espacio de direcciones en segmentos independientes entre sí. Cada segmento contiene un tipo especíco de información, es decir el código (las instrucciones) se ubica en un segmento, los datos en otro y la pila en un tercer segmento. Las posiciones de memoria en los segmentos se denen por direcciones lógicas.
Una dirección lógica está compuesta por una dirección de segmento y
un desplazamiento. El procesador traduce una dirección lógica a una dirección lineal. Los registros de propósito general, como su nombre lo indica, se utilizan en la forma en que lo desee el programador.Cada uno de estos registros se puede direccionar como un registro de 16 bits (AX, BX, CX, DX) o como un registro de 8 bits (AH, AL, BH, BL, CH, CL, DH, DL). Cada uno de los registros de 16 bits está formado por la concatenación de dos registros de 8 bits: AX = AH:AL, BX = BH:BL, CX = CH:CL y DX = DH:DL, donde el bit 0 del registro AH es el bit 8 del registro AX.
Figure 2: Registros Apuntadores Y De Índices
SP (Apuntador de pila): Contiene el desplazamiento con respecto al segmento de pila del tope de la pila del programa. El registro SP se emplea para direccionar datos en la pila cuando se ejecutan las instrucciones push y pop y cuando se llama o se regresa de un procedimiento mediante las instrucciones: call y ret, respectivamente. Registros De Segmentos
CS (Código): Tiene la dirección lógica del segmento en que se encuentra el código de un programa. Si el código ocupa más de un segmento, contiene la dirección lógica de uno de los segmentos.
5
DS (Datos):
Tiene la dirección lógica del segmento en que se encuen-
tran los datos estáticos de un programa. Si los datos ocupan más de un segmento, contiene la dirección lógica de uno de los segmentos
1.3
La memoria principal (RAM)
La memoria RAM (Random Access Memory) o memoria de acceso aleatorio de lectura/escritura volátil, se dispone como una hoja de trabajo para almacenamiento temporal y ejecución de programas. En la memoria de acceso aleatorio (RAM), las celdas de la memoria pueden accesarse para la transferencia de información en cualquier posición aleatoria deseada. Esto es, el proceso de ubicar una palabra en la memoria es igual y requiere la misma cantidad de tiempo, sin importar la ubicación física de las celdas en la memoria. Existen dos tipos de memorias RAM: Las RAM estáticas o SRAM y las RAM dinámicas o DRAM. En una RAM estática (SRAM) el valor almacenado en una celda se mantiene mediante un par de inversores y, mientras se suministre electricidad, el valor puede mantenerse indenidamente. En una RAM dinámica (DRAM), el valor almacenado en una celda se mantiene como una carga en un condensador. Para acceder a la carga almacenada se usa sólo un transistor, tanto para leer el valor como para sobrescribirlo. Debido a que las DRAMs sólo usan un transistor por bit de almacenamiento, son mucho más densas y el precio por bit es menor.
En comparación, las SRAMs requieren
entre cuatro y seis transistores por bit. En las DRAMs la carga se almacena en un condensador, por lo tanto no puede mantenerse indenidamente y debe refrescarse periódicamente. [2] Cualquiera que sea el tipo de memoria RAM utilizada, estática o dinámica, en general se utiliza para almacenar datos a corto plazo porque estos se pierden al retirarles la alimentación.[3]
1.4
El concepto de interrupciones
Una interrupción no es más que un evento que genera la ruptura de la ejecución de un programa para pasar a ejecutar otro relacionado con el evento causante de la interrupción. La interrupción, desde el puto de vista del mecanismo que la activa, puede ser de tipo:
Hardware Software
Las interrupciones de hardware, están asociadas generalmente a un dispositivo físico (reloj del sistema, periférico) y consisten en la activación de una línea para dar a conocer a la UCP la Aparición del evento asociado. [4] Las interrupciones de software consisten en instrucciones cuyo efecto es la ejecución de una rutina de servicio de interrupción (se suelen usar para llamadas al sistema operativo porque aíslan software de usuario y de sistema). [4]
6
1.5
Llamadas a servicios del sistema
La interfaz entre el sistema operativo y los programas de usuarios está denida por el conjunto de llamadas al sistema ofrecidas por el sistema operativo. Las llamadas al sistema con que cuenta la interfaz varían de un sistema operativo a otro. Puesto que el mecanismo real para emitir una llamada al sistema depende mucho de la máquina y muchas veces debe de expresarse en código ensamblador, se proporciona una biblioteca de procedimientos que permite hacer llamadas al sistema desde programas en C y también desde otros lenguajes.
En cierto
sentido, efectuar una llamada al sistema es como efectuar una llamada a un procedimiento especial, solo que las llamadas al sistemas entran al kernel y las llamadas a procedimientos no. [6] Se trata de que una aplicación ejecute una rutina del sistema operativo, con objeto de que la rutina le preste un servicio. Por ejemplo, cuando un programa desea abrir un chero de disco, llama a un servicio del sistema que le permite llevar a cabo ésta tarea. Debe tenerse en cuenta que una aplicación no puede acceder directamente al disco, y debe hacerlo a través del sistema operativo. [5] Hay dos tipos de instrucciones relacionados con la llamada a servicios del sistema operativo:
Syscall.
Instrucción de llamada a un servicio del sistema operativo, a
través de su API. Cuando una tarea ejecuta esta instrucción pasa el control al sistema operativo. [5]
Sysret. Instrucción de retorno de un servicio. El sistema operativo ejecuta esta instrucción justo antes de devolver el control a la tarea que solicitó el servicio. Entre la ejecución de las instrucciones Syscall y Sysret, el sistema operativo accede al espacio de memoria de la tarea. Por ejemplo, el sistema operativo escribe en una estructura de datos de la tarea asociada a un chero si la apertura del chero se ha completado con éxito o no. Después de ejecutar la instrucción Sysret, se ejecuta la instrucción siguiente a la Syscall. [5]
1.6
Modos de direccionamiento
Los modos de direccionamiento de un procesador son las diferentes formas de trasformación del campo de operando de la instrucciónn en la dirección del operando. El campo de la operación de una instrucción especifíca la operación que se debe realizar.
Ésta debe ser ejecutada sobre algunos datos almacena-
dos en registros del computador o en palabras de memoria, es decir, sobre los operadores. El modo de direccionamiento especifíca la forma de interpretar la información contenida en cada campo de operando para localizar, en base a esta información del operando. Los ordenadores utilizan técnicas de direccionamiento con los siguientes nes:
Dar versatilidad de programación al usuario proporcionando facilidades
tales como índices, direccionamientos indirectos, etc., esta versatilidad nos servirá para manejar estructuras de datos complejas como vectores, matrices, etc. [7]
7
Reducir el número de bits del campo de operando. Los modos de direc-
cionamiento pordrían clasicarse en propios e impropios; en los direccionamientos propios el operando está localizado en una dirección concreta de memoria, mientras que en los impropios en otros lugares tales como los registros del procesador, etc. [7] Implícito: En este modo de direccionamiento no es necesario poner ninguna dirección de forma explícita, ya que en el propio código de operación se conoce la dirección del (de los) operando(s) al (a los) que se desea acceder o con el (los) que se quiere operar.
Supongamos una arquitectura de pila, las operaciones
aritméticas no requieren direccionamiento explícito por lo que se ponen como:
add
sub
Porque cuando se opera con dos datos en esta arquitectura se sabe que son los dos elementos del tope de la pila: Ejemplo de una pila: 1 2 3 4 5 6
View more...
Comments