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 <- pila top() es 1 ntop() es 2 donde top() representa el tope de la pila y ntop() el siguiente al tope de la pila y son estos argumentos con los que se opera al llamar a una orden en concreto. Inmediato: En la instrucción está incluido directamente el operando.
En
este modo el operando es especicado en la instrucción misma. En otras palabras, una instrucción de modo inmediato tiene un campo de operando en vez de un campo de dirección. [7] El campo del operando contiene el operando actual que se debe utilizar en conjunto con la operación especicada en la instrucción. Las instrucciones de modo inmediato son útiles para inicializar los registros en un valor constante. Cuando el campo de dirección especica un registro del procesador, la instrucción se dice que está en el modo de registro.[7] Directo: El campo de operando en la instrucción contiene la dirección en memoria donde se encuentra el operando. En este modo la dirección efectiva es igual a la parte de dirección de la instrucción. El operando reside en la memoria y su dirección es dada directamente por el campo de dirección de la instrucción. [7] En una instrucción de tipo ramicación el campo de dirección especica la dirección de la rama actual.
Con este tipo de direccionamiento, la dirección
efectiva es contenida en la misma instrucción, tal como los valores de datos inmediatos que son contenidos en la instrucción. Un procesador de 16 bits suma la dirección efectiva al contenido del segmento de datos previamente desplazado en 4 bits para producir la dirección física del operando. [7] Indirecto: El campo de operando contiene una dirección de memoria, en la que se encuentra la dirección efectiva del operando. [7] Absoluto: El campo de operando contiene una dirección en memoria, en la que se encuentra la instrucción. De registro: Sirve para especifícar registros. Indirecto mediante registros: En este modo el campo de la dirección de la instrucción da la dirección en donde la dirección efectiva se almacena en la
8
memoria. El control localiza la instrucción de la memoria y utiliza su parte de dirección para acceder a la memoria de nuevo para leer una dirección efectiva. Unos pocos modos de direccionamiento requieren que el campo de dirección de la instrucción sea sumado al control de un registro especicado en el procesador. [7] La dirección efectiva en este modo se obtiene del siguiente cálculo:
Dir.
efectiva = Dir. de la parte de la instrucción + Contenido del registro del procesador...
1.7
Proceso de ensamblado y ligado
Para crear un programa ejecutable utilizando lenguaje ensamblador es necesario realizar la serie de pasos, conocida como ciclo de desarrollo de programas, que se muestra en la gura.
Figure 3: Proceso para el ciclo de desarrolo de programas
Un ensamblador es el programa que convierte un listado de código fuente, escrito en un chero de texto, en código objeto, es decir, lenguaje máquina (el que nalmente interpretará el procesador) en el que sólo le faltan las referencias a rutinas externas. El código fuente es un chero que contiene la secuencia de instrucciones en lenguaje ensamblador que forma el programa, así como ciertas directivas o comandos para el propio ensamblador, que ha sido creado utilizando un editor de texto. El código objeto consta del código en lenguaje máquina y de la información necesaria para enlazarlo con otros módulos objeto. Proceso de ligado Al construir un programa algunos de sus módulos pueden colocarse en el mismo módulo fuente y ensamblarse juntos, otros pueden estar
9
en módulos diferentes y ser ensamblados separadamente. En cualquier caso, los módulos objeto resultantes, algunos de los cuales pueden estar agrupados en librerías, deben ser enlazados para formar el módulo de carga, antes de que se pueda ejecutar el programa. Además de dar como salida el módulo de carga, el linker o enlazador imprime un mapa de memoria que indica donde serán cargados los módulos objeto en la memoria. Después de crearse el módulo de carga, éste es cargado por el cargador en la memoria del ordenador y comienza la ejecución.[8]
Figure 4: Proceso de ligado
1.8
Desplegado de mensajes en el monitor
La pantalla es una malla de posiciones direccionables, en cualquiera de las cuales se puede colocar el cursor. El sistemas proporcionara espacio en la memoria para un are de despliegue de video, o buer. El área de despliegue monocromático inicia en la localidad BISOS B000[0]H y permite utilizar 4K bytes de memoria: 2KB disponibles para caracteres y 2K para atributos de cada carácter, como video inverso, intermitencia, intensidad y subrayado. Funciones de la INT 10H del BIOS
Funciones de la INT 21H del DOS
02H Fija el cursor
02H Despliega en pantalla
06H Recorre pantalla
09H Despliega pantalla 0AH Entrada desde el teclado 3FH Entrada desde el teclado 40H Despliega en pantalla
Table 1: Funciones predenidad de la bios
10
Figure 5: Función para mostrar el conjunto de caracteres ASCII
2
Programación básica
2.1
Ensamblador (y ligador) a utilizar
El lenguaje ensamblador, o assembler (assembly language en inglés), es un lenguaje de programación de bajo nivel para los computadores, microprocesadores, microcontroladores y otros circuitos integrados programables. Implementa una representación simbólica de los códigos de máquina binarios y otras constantes necesarias para programar una arquitectura dada de CPU y constituye la representación más directa del código máquina especíco para cada arquitectura legible por un programador.
Características
El código escrito en lenguaje ensamblador posee una cierta dicultad de ser entendido ya que su estructura se acerca al lenguaje máquina, es decir, es un lenguaje de bajo nivel.
El lenguaje ensamblador es difícilmente portable, es decir, un código escrito para un microprocesador, puede necesitar ser modicado, para poder
11
ser usado en otra máquina distinta. Al cambiar a una máquina con arquitectura diferente, generalmente es necesario reescribirlo completamente.
Con el lenguaje ensamblador se tiene un control muy preciso de las tareas realizadas por un microprocesador por lo que se pueden crear segmentos de código difíciles y/o muy inecientes de programar en un lenguaje de alto nivel, ya que, entre otras cosas, en el lenguaje ensamblador se dispone de instrucciones del CPU que generalmente no están disponibles en los lenguajes de alto nivel.
2.2
Ciclos numéricos
El lenguaje ensamblador cuenta con una instrucción muy poderosa que permite
LOOP . Esta instrucción trabaCX . El formato general de esta
la programación de ciclos nitos, la instrucción ja en forma conjunta con el registro contador instrucción es: Mov CX,Numero_Veces Etiqueta: Instrucciones a realizar
Loop
Etiqueta
La instrucción Loop ejecuta las instrucciones que se encuentran entre la Etiqueta: y Loop Etiqueta el numero de veces que indique el campo No_Veces. Por ejemplo, el siguiente grupo de instrucciones incrementa en
AX ,
1
el registro
esto lo repite 100 veces.
Mov CX,100 ;100 veces repetir: Nombre de la etiqueta Inc AX ;AX
= AX + 1
Loop repetir Regresa a la etiqueta y compara el ciclo La instrucción Loop decrementa el registro CX en cada iteración y se detiene cuando CX es igual a cero.
2.3
Captura básica de cadenas
En el lenguaje ensamblador el tipo de dato cadena (string) no está denido, pero para nes de programación, una cadena es denida como un conjunto de localidades de memoria consecutivas que se reservan bajo el nombre de una variable. Instrucciones para el manejo de strings
Instrucciones para el manejo de strings El lenguaje ensamblador cuenta con
12
cinco instrucciones para el manejo de cadenas: MOVS: Mueve un byte o palabra desde una localidad de memoria a otra. LODS : Carga desde la memoria un byte en AL o una palabra en AX. STOS : Almacena el contenido del registro AL o AX en la memoria. CMPS : Compara localidades de memoria de un byte o palabra. SCAS : Compara el contenido de AL o AX con el contenido de alguna localidad
de memoria. Las instrucciones para cadenas trabajan en conjunto con la instrucción CLD, la cual permite establecer que el sentido en el que las cadenas serán procesadas será de izquierda a derecha. Otra instrucción importante es el prejo de repetición REP, el cual permite que una instrucción para manejo de cadenas pueda ser repetida un número determinado de veces. Los registros índice juegan un papel importante en el procesamiento de cadenas de datos, el par de registros CS:SI indican la dirección de la cadena original que será procesada, y el par ES:DI contienen la dirección donde las cadenas pueden ser almacenadas.
2.4
Comparación y prueba
Existen dos instrucciones especiales en el microprocesador
8086:
CMP y TEST.
CMP (Comparar) compara si dos valores son iguales o diferentes.
Su fun-
cionamiento es similar al de la instrucción SUB (restar), sólo que no modica el operando de destino, solamente modica las banderas de signo (SF), de cero (ZF) y de acarreo (CF).
Por ejemplo: CMP AX,33 Esta instrucción compara si el valor almacenado en el registro AX es igual que el valor 33 en decimal. Por otro lado, la instrucción TEST realiza la operación AND de los operandos especicados sin que el resultado se almacene en algún registro, modicando únicamente ciertas banderas. Su aplicación más común es la de probar si algún bit es cero. Por ejemplo: Test AL,1 Esta instrucción prueba si el bit menos signicativo de AL es 1 y Test AL,128 prueba si el bit más signicativo de AL es 1. Por lo general estas instrucciones van seguidas de alguna de las instrucciones de salto.
13
2.5
Saltos
En los lenguajes de alto nivel como Pascal y C, los programadores pueden controlar el ujo de los programas por medio de instrucciones condicionales compuestas; por ejemplo, en Pascal el siguiente conjunto de instrucciones permite tomar una decisión sobre el ujo del programa:
IF A = 5then write(?Error...?); else A:=A+1; En contraste, el lenguaje ensamblador no proporciona tales mecanismos. Este tipo de decisiones se realizan por medio de una serie de instrucciones que van teniendo un signicado consecutivo; es decir, el efecto de la instrucción siguiente depende del resultado anterior. El lenguaje ensamblador proporciona un conjunto de instrucciones conocidas como instrucciones de salto. Estas instrucciones son utilizadas en conjunto con instrucciones de comparación y prueba para determinar el ujo del programa.
2.6
Ciclos condicionales
Existen dos tipos de instrucciones de salto: las instrucciones de salto condicional y las de salto incondicional. Las instrucciones de salto condicional, revisan si ha ocurrido alguna situación para poder transferir el control del programa a otra sección, por ejemplo: CMP AX,0
JEotro
........... ........... otro : .......... .......... End En este ejemplo, la instrucción JE (Salta si es igual) revisa si la prueba implícita en la instrucción anterior resultó positiva, es decir, si la comparación de AX con 0 fue cierta. En caso de que AX sea igual a 0, JE transere el control del programa a las instrucciones que se encuentran después de la etiqueta "otro". En caso contrario ejecuta las instrucciones siguientes a JE. La siguiente es una lista de las instrucciones de salto condicional y su
14
descripción:
JA o JNBE: Salta si está arriba o salta si no está por debajo o si no es igual (jump if above or jump if not below or equal). El salto se efectúa si la bandera de CF=0 o si la bandera ZF=0. JAE o JNB: Salta si está arriba o es igual o salta si no está por debajo (jump if above or equal or jump if not below). El salto se efectúa si CF=0. JB o JNAE: Salta si está por debajo o salta si no está por arriba o es igual (jump if below or jump if not above or equal). El salto se efectúa si CF=1. JBE o JNA: Salta si está por debajo o es igual o salta si no está por arriba (jump if below or equal or jump if not above). El salto se efectúa si CF=1 o ZF=1. JE o JZ: Salta si es igual o salta si es cero (jump if equal or jump if zero). El salto se efectúa si ZF=1. JNE o JNZ: Salta si no es igual o salta si no es cero (jump if not equal or jump if not zero). El salto se efectúa si ZF=0. JG o JNLE: Salta si es mayor o salta si no es menor o igual (jump if greater or jump if not less or equal). El salto se efectúa si ZF=0 u OF=SF. JGE o JNL: Salta si es mayor o igual o salta si no es menor (jump if greater or equal or jump if not less). El salto se efectúa si SF=OF.
2.7
Incremento y decremento
Las instrucciones INC y DEC permiten incrementar los contenidos de los registros. Ejemplos: INC AX ;AX=AX+1 INC VAR1 ;VAR1=VAR1+1 DEC AX ;AX=AX-1 DEC VAR1 ;VAR1=VAR1-1 y de las variables almacenadas en memoria.
2.8
Captura de cadenas con formato
2.9
Instrucciones aritméticas
Existen
8
instrucciones aritméticas básicas: ADD (Suma), SUB (Resta), MUL
(Multiplicación sin signo), DIV (División sin signo), IMUL (Multiplicación con signo), IDIV (División con signo), INC (Incremento unitario) y DEC (Decre-
15
mento unitario). Las instrucciones ADD y SUB permiten realizar sumas y restas sencillas y tienen el siguiente formato:
ADD Destino, Fuente
SUB Destino, Fuente
Ejemplos: ADD AX,BX ;AX=AX+BX ADD AX,10 ;AX=AX+10 SUB AX,BX ;AX=AX-BX SUB AX,10 ;AX=AX-10 En las operaciones de suma y resta el resultado siempre es almacenado en el operando de destino, el cual puede ser un registro o una variable.
2.10
Manipulación de la pila
La pila es un grupo de localidades de memoria que se reservan con la nalidad de proporcionar un espacio para el almacenamiento temporal de información. La pila de los programas es del tipo LIFO (Last In First Out, Ultimo en entrar, Primero en salir). Para controlar la pila el microprocesador cuenta con dos instrucciones básicas: Push (Meter) y Pop (sacar). El formato de estas instrucciones es el siguiente:
Push operando Pop operando Cuando se ejecuta la instrucción Push, el contenido del operando se almacena en la ultima posición de la pila. Por ejemplo: Si AX se carga previamente con el valor 5, una instrucción Push AX almacenaría el valor 5 en la ultima posición de la pila. Por otro lado la instrucción Pop saca el último dato almacenado en la pila y lo coloca en el operando. Siguiendo el ejemplo anterior, la instrucción Pop BX obtendría el número 5 y lo almacenaría en el registro BX.
2.11
Obtención de cadena con representación decimal
En las computadoras el formato natural para la aritmética es el binario. La representación del número decimal
ASCII
31 35 32 37
1, 527
(cuatro bytes)
16
en los tres formatos decimales:
BCD desempaquetado
BCD empaquetado
01 05 02 07
15 27
(cuatro bytes)
(dos bytes)
El procesador realiza aritmética en valores ASCII y BCD un dígito a la vez. Ya que los datos son ingresados desde un teclado signican que están en formato ASCII, la representación en memoria de un número decimal ingresado tal como 1234 es 31323334H. Pero realizar aritmetica sobre tal número implica un tratamiento especial. Las instrucciones AAA y AAS realizan aritmética de manera directa sobre números ASCCI
2.12
Instrucciones lógicas
Se cuenta con un grupo de instrucciones lógicas que operan a nivel de bit, estas instrucciones son: AND, OR, XOR y NOT. Las instrucciones que se enlistan antes requieren dos operandos, a excepción de la operación NOT que sólo requiere uno. La operación OR establece el resultado a 1 si cualquiera de los dos operandos es 1, de lo contrario el resultado será 0. La instrucción XOR coloca en 0 el resultado si los operandos son iguales, de lo contrario establece 1. Finalmente, la instrucción NOT cambia de estado todos los bits del operando, los unos por ceros y los ceros por unos. La principal aplicación de estas instrucciones es el enmascaramiento de información. La operación AND nos permite poner a cero cualquier bit de un dato; la operación OR nos permite poner a uno cualquier bit de un dato y la operación XOR permite borrar el contenido de algún registro o localidad de memoria, así como para negar algún bit.
2.13
Desplazamiento y rotación
El microprocesador cuenta con un conjunto de instrucciones que permiten la manipulación de las posiciones individuales de los bits dentro de un registro o localidad de memoria, estas instrucciones se encuentran divididas en dos grupos: instrucciones de rotación e instrucciones de desplazamiento (también conocidas como instrucciones para corrimientos). Las instrucciones para rotación son cuatro y nos permiten mover de forma cíclica los bits que forman parte de un registro o localidad de memoria, estas instrucciones son ROL, ROR, RCL , RCR. ROL y ROR funcionan de forma muy semejante; al ejecutar una instrucción ROL, el bit más signicativo del dato es desplazado hacia la bandera de acarreo
y también hacia la posición del bit memos signicativo, por lo cual todos los
17
bits restantes son rotados o movidos hacia la izquierda.
La instrucción ROR
funciona igual, sólo que ésta trabaja hacia la derecha. Las instrucciones RCL y RCR permiten la rotación de los bits de una localidad de memoria o registro, considerando también el contenido de la bandera de acarreo. En el caso de RCL, el bit más signicativo pasa hacia la bandera de acarreo, el bit que se encontraba en la bandera de acarreo pasa al bit menos signicativo y nalmente los bits restantes son rotados hacia la izquierda. La instrucción RCR funciona igual, pero aplica su rotación hacia la deecha.
2.14
Obtención de una cadena con la representación hexadecimal
2.15
Captura y almacenamiento de datos numéricos
2.16
Operaciones básicas sobre archivos de disco
3
Preguntas
Esta arquitectura fue utilizada en la computadora ENIAC 1. Mencione alguna de las ventajas de codicar en lenguaje ensamblador son: a)El programa sólo corre en un CPU b)Es facil escribir programas grandes y complejos c)Proporciona más control sobre el manejo particular de los requerimientos de hardware.R= (c)
2. En 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. a) verdadero b)falso R= a)verdadero 3. 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 a) verdadero b)falso R= a)verdadero 4. 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 a) verdadero b)falso. R=a)verdadero 5. La memoria ____________ se dispone como una hoja de trabajo para almacenamiento temporal y ejecución de programas.R= RAM (Random Access Memory) 6. 6-Existen dos tipos de memorias RAM: ____________ y las____________ R=Las RAM estáticas o SRAM yl as RAM dinámicas o DRAM.
18
7. 7- 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 a) verdadero b)falso R=a)verdadero 8. 8.En una memoria_____________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 R= RAM dinámica (DRAM), 9. Una ___________ 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 R= interrupción 10. La __________________ es parte de un computador que se encarga de almacenar la información que éste maneje. R=Memoria. 11. El ___________ es un chip que sirve como cerebro del ordenador. R=CPU. 12. La arquitectura de ___________________ es una técnica de implementación por la cual se solapa la ejecución de múltiples instrucciones.R=segmentación . 13. Las ___________________ son un recurso que reduce los tiempos de espera del procesador por los servicios solicitados a un dispositivo. R=Interrupciones. 14. La arquitectura de computadoras es el diseño conceptual y la estructura operacional fundamental de un sistema de computadora. R=Verdadero 15. La Unidad de Control: Se encargada de Coordinar todos los componentes y los ujos de datos. 16. Se denomina CPU a los circuitos que permiten almacenar y recuperar la información. R=Falso 17. La memoria RAM s e puede denir como una memoria rapida y pequeña, situada entre la memoria principal y el procesador. R=Falso 18. El modelo de arquitectura de cómputo segmentada fue utilizada en la computadora ENIAC y consiste en una unidad central de proceso que se comunica a través de un solo bus. R=Falso 19. Es es el diseño conceptual y la estructura operacional fundamental de un sistema de computadora. A)*La arquitectura de Computadoras. B) La ergonomia C) Memoria caché.
19
20. ¾Cuál de las siguientes armaciones sobre la memoria caché es cierta? A)* La caché de nivel es la más pequeña y la más rápida. b) La caché de nivel 1 es la más grande y más lenta. C) La caché de nivel 2 es igual de rápida que la memoria principal. D) Se puede producir producir un fallo en la caché de nivel 2 que no se ha producido antes en la de nivel 1. 21. La tecnología de la RAM se ha dividido en A)*2 . B)1 C)3 D)5 E)Ninguna de las anteriores 22. En que partes esta dividida la RAM .A) Volátil B)Estatica C)*Estática y dinámica. D)Dinamica. 23. Su sistema de trabajo se basa en la microprogramación. Consiste en hacer que cada instrucción sea interpretada por un mini programa.A)*CISC B)RISC 24. las comunicaciones entre la CPU y la memoria principal se realizan a través de __ canales funcionalmente distintos: el de direcciones y el de datos. R:2 25. 1981, solo trabaja con un ancho de banda de __bits. R=16 26. Cuantas unidades conforman la Unidad Central de Procesos (CPU).R=4 27. VESA (Video Electronics Standard Association), trabaja a ___ bits. R=32 28. El actual PCI (Peripheral Component Interconnect), su ancho de banda es de ___ bits.R=64
References [1] Martínez, Jaime Garza JAOR. Organización y arquitectura de computadoras. Estado de México, México.: Pretince Hall; 2000. [2] Canal, Ramón; Elias, Eduard; González, José; Marcuello, Pedro; Molina, Carlos, Peña, M.A.; Valero, Miguel. Estructura y Diseño de Computadores. Barcelona, 2000. Reverté. ISBN: 84-291-2619-8. [3] Blanco niversidad
Viejo, de
Cecilio.Electrónica Oviedo.
ISBN:
Digital.
U-
84-8317-372-7.
http://books.google.com.mx/books?id=myOXwYAhOwgC&pg=PA209&dq=MEMORIA+RAM&hl=en&s
[4] Gil, José ; Peñalver, Lourdes; Pont, Ana; Robles, Antonio. Estructura de computadores (vol I); Un recorrido por la Unidad Central de Procesos. Universidad Politécnica de Valencia. ISBN: 84-7721-415-8.
20
[5] García, Manuel; López, José. Apuntes de Organización de Computadoras. Ediciones de la Universidad de Oviedo. 2007. ISBN: 978-84-8317-606-1. [6] Tanenbaum, Andrew S. Sistemas Operativos Modernos; Segunda Edición. Pearson Educación. México, 2003. ISBN: 970-26-0315-3. Pag: 976. [6] http://www.infor.uva.es/∼cllamas/2/2-2.pdf [7] Apuntes de Modos de Direccionamiento. Departamento de Informática, Universidad de Valladolid. www.infor.uva.es/~bastida/OC/modos.pdf [8] http://www.itescam.edu.mx/principal/sylabus/fpdb/recursos/r86194.PDF
21