Conceptos básicos sobre la estructura de los computadores

Anuncio
Estructura y Tecnología de Computadores I
1
Tema 1º - Conceptos Fundamentales sobre
Estructura de Computadores.
Concepto de Computador.
Máquina que puede resolver problemas ejecutando ciertas instrucciones.
Programa: secuencia de instrucciones que describe como ejecutar una tarea.
Lenguaje Máquina (L.M.): conjunto de instrucciones primitivas (muy
elementales) de un computador.
- El conjunto de instrucciones es limitado.
- Son instrucciones muy simples.
Todos los programas a ejecutar deben convertirse en una secuencia de
instrucciones de L.M.
El L.M. es incomodo de programar, por ello se usan lenguajes más cómodos
para el operador humano-> Lenguajes de Alto Nivel.
Niveles de Estudio de un Computador.
1º Descripción geométrica y de componentes, a nivel de componentes
electrónicos.
2º Descripción de circuito electrónico. Conjunción de circuitos electrónicos
individuales para formar circuitos lógicos. A medio camino entre la electrónica
analógica y la digital.
3º Descripción de circuitos digitales. Unión de elementos lógicos simples para
formar circuitos que realicen funciones específicas. Las funciones especificas
van a ser:
- Implementación de registros, implementación de contadores...
4º Descripción a nivel de transferencia entre registros (RTL).
Registro: almacén de información. Contiene un conjunto de bits. Se estudia el
flujo de información entre los diferentes registros. Este es el nivel que
nosotros estudiaremos.
5º Descripción a nivel funcional.
Se estudia el computador como una caja negra que realiza funciones hacia el
exterior. Algunas partes del computador se verán a este nivel.
Estructura y Tecnología de Computadores I
2
Concepto de Arquitectura y Organización de Computadoras.
Arquitectura: Atributos de un sistema que son visibles a un programador. Por
ejemplo: el lenguaje máquina, número de bits que requiere un dato
determinado, modos de direccionamiento,...
Organización: Estudio de las unidades funcionales de un sistema y su
interconexión. Por ejemplo: señales de control, interface entre el computador
y el mundo exterior, tecnología de la memoria, circuitos que implementan las
operaciones aritmético lógicas.
Ambos términos hacen referencia a conceptos aplicables a todos los
computadores.
Concepto de Familia de Computadores: Conjunto de computadores con la
misma arquitectura pero distinta organización. El modelo superior absorbe al
anterior y se respeta una compatibilidad hacia arriba.
Estructura y Tecnología de Computadores I
3
Tema 2º - Componentes y Funcionamiento
de un Computador.
2.1. Arquitectura Von Neumann.
2.1.1 concepto de arquitectura Von Neumann.
El computador está integrado por tres elementos:
- CPU.
- Memoria.
- Unidades de I/O.
Los datos e instrucciones se almacenan en una memoria de lectura /
escritura. Los contenidos de la memoria se direccionan por su posición
independientemente del dato contenido.
En la ejecución de los programas las instrucciones se ejecutan en una
determinada secuencia. Esa secuencia es la misma que como se hayan
almacenado las instrucciones en memoria.
2.1.2 CPU (Unidad Central de Proceso).
Integrada por un conjunto de componentes lógicos que sirven para:
- Almacenar datos.
- Realizar operaciones aritméticas y lógicas con esos datos.
Los componentes están incluidos dentro de una configuración que permite
hacer un uso general de funciones aritméticas y lógicas.
Hay un hardware que realiza funciones distintas según las señales de control
que reciba.
Funcionamiento:
datos

El sistema acepta 
 y produce unos resultados.
señales de control
- Señales de control: hay una parte del hardware encargada de
generar las señales de control.
o Para cada función a realizar; se debe establecer una
secuencia concreta de señales de control que se suministra
al hardware que implementa las funciones.
o El hardware que genera las señales de control está dentro de
la CPU.
o Para que la CPU active las señales de control
correspondientes a una secuencia concreta (que implementa
una operación):
Un código especifico asociado a cada secuencia de
señales de control.
Una parte del hardware que genera las señales de
control a partir de ese código.
Estructura y Tecnología de Computadores I
-
-
4
Cada uno de esos códigos es una instrucción. El conjunto de
todas ellas forman el lenguaje maquina del computador, también
se le conoce como juego de instrucciones.
Una secuencia de instrucciones forman un programa.
2.1.3. memoria.
La memoria contiene:
- Secuencia de instrucciones programa.
- Datos que van a ser utilizados durante la ejecución de ese
programa.
Funcionalidad:
1º La CPU toma las instrucciones de la memoria.
2º La CPU toma los datos que necesita desde la memoria.
Se diferencia en que los datos se “cojen” cuando se ejecuta una instrucción
determinada (cuando lo necesita el programa) mientras que el “coger” una
instrucción se hace de forma automática.
3º La CPU deposita los resultados de la ejecución en memoria.
2.1.4. unidades de I/O.
Son elementos que transfieren datos desde dispositivos externos a la CPU
hacia la CPU o la memoria y viceversa.
En máquinas con arquitectura Von Neumann todos las computaciones tienen
lugar en la CPU. Los datos e instrucciones están en memoria hasta que son
demandados por la CPU.
La CPU “ve” los dispositivos de I/O análogamente a como “ve” la memoria.
- La CPU puede enviar datos a un dispositivo de salida.
- La CPU puede leer los datos de un dispositivo de entrada.
La diferencia entre los posiciones de dispositivos de I/O y los posiciones de
memoria es que las direcciones de I/O están asociadas a los dispositivos de
I/O, no con la memoria.
2.2. Arquitectura Intel de 32 bits (IA-32).
2.2.1. introducción.
Estudiaremos las características de una arquitectura de computadores sobre
un tipo concreto de computador que implementa una arquitectura Von
Neumann.
Computadores tipo PC basados en microprocesadores Pentium de Intel (IA32).
Procesadores que abarcan IA-32:
- Pentium.
- Familia P6:
o Pentium Pro.
o Pentium II.
5
Estructura y Tecnología de Computadores I
-
o Pentium III.
Pentium IV con arquitectura Net Burst.
2.2.2. el bus del sistema.
Conecta los diferentes componentes de la arquitectura Von Neumann.
En los sistemas basados en Pentium, existe:
− Bus de Direcciones

− Bus de Control
 ⇒ Bus del Sistema

− Bus de Datos

CPU
MEMORIA
DISPOSITIVOS I/O
Bus de Datos:
- Tiene 64 bits de ancho.
- Permite realizar transferencias de 16, 32 o 64 bits, no mueve grupos
de 8 bits.
memoria 
- Transfiere información entre posiciones de 
 y CPU.
 I/O 
Bus de Direcciones:
- Tiene 36 bits de ancho.
- El sistema asocia una dirección a cada posición de memoria.
- El sistema asocia una dirección a cada posición de I/O.
memoria 
- Si la CPU accede a posiciones de 
 coloca la dirección en
 I/O 
el bus de direcciones.
memoria 
o La circuitería asociada a la 
 reconoce la dirección
 I/O 
(es decir, dice si es de memoria o de I/O)
o Da ordenes para leer el dato solicitado y lo coloca en el bus
de datos. El resto de posiciones son ignoradas.
Bus de Control:
- Integrado por todas las señales que controlan como el procesador
se comunica con el resto del sistema. Incluye:
o Señales de lectura / escritura.
o Reloj de sistema.
o Líneas de interrupción.
Estructura y Tecnología de Computadores I
-
6
o Líneas de estado
Reloj de sistema: señal eléctrica que alterna entre 2 niveles lógicos.
o Maneja toda la sincronización dentro del procesador. La CPU
es un sistema lógico asíncrono muy complejo.
o La frecuencia del reloj es la frecuencia del sistema.
o A un periodo completo se le denomina ciclo de reloj.
o La ejecución de cada instrucción consume muchos ciclos de
reloj.
2.2.3. el subsistema de memoria.
La memoria es direccionable a nivel de byte.
La memoria es equivalente a un array de 4×230 posiciones, cada una de 1
byte (230 = 1 gigabyte).
Para ejecutar la siguiente instrucción: CPU mem(x):
1º - CPU coloca en el Bus_direcciones la dirección “x”.
2º - CPU activa la línea de control de lectura.
3º - La CPU “lee” el dato que está en el Bus_datos.
Definiciones:
- Posición de memoria: 1 byte (8 bits)
- Palabra: 2 byte (16 bits).
- Palabra doble: 4 byte (32 bits).
- Palabra cuádruple: 8 byte (64 bits).
- El procesador (IA-32) puede acceder a palabras o a palabras
dobles.
- Tiempo de acceso a memoria: número de ciclos de reloj
necesarios para acceder a una posición de memoria. Del orden de
varios ciclos de reloj
- Memoria caché: parte de memoria que se coloca entre el
procesador y la memoria principal. Sirve para acelerar el acceso a
memoria. Es de pequeño tamaño. Es más rápido que la memoria
principal. Con la memoria principal se intercambia bloques enteros
de memoria, no posiciones de memoria.
- Acceso del procesador a caché:
o Acierto Caché: cuando el procesador busca y encuentra en
caché.
o Fallo Caché: cuando el procesador busca y no encuentra, la
caché pide el bloque a memoria principal. El procesador
vuelve a buscar y ahora si que acierta.
2.2.4. el subsistema de entrada / salida.
El funcionamiento es análogo al subsistema de memoria. Existen direcciones
de memoria que pertenecen al subsistema de entrada / salida. Se manejan
direcciones de 16 bit (216=65.536 direcciones)
Estructura y Tecnología de Computadores I
7
2.3 Características de la CPU en IA-32.
2.3.1. los registros de la CPU.
Los registros son ubicaciones especiales de la memoria. No forman parte de
la memoria principal. Se ubican dentro de la CPU.
Principales Registros de la CPU:
1º Registros de almacenamiento temporal de datos (32 bit):
- EAX: acumulador.
- EBX: dirección de base.
- ECX: contador.
- EDX: para datos.
2º Registro de puntero de instrucción (32 bit):
- Contiene la dirección de la siguiente operación a ejecutar.
3º Registro de banderas / flags (32 bit):
- Contiene una serie de bits con el estado del procesador o el
resultado de ciertas operaciones.
4º Otros registros.
2.3.2. la unidad aritmético lógica (ALU).
En ella tiene lugar la mayor parte de las acciones ejecutadas por la CPU. Ej.:
sumar 5 a EAX:
1º Copia el valor de EAX en la ALU.
2º Envía 5 a la ALU.
3º Ordena a la ALU que sume las dos cantidades.
4º Lleva el resultado hacia el registro EAX.
2.3.3. la unidad de interface de bus.
Unidad dentro de la CPU que se encarga de controlar los buses de datos y
direcciones al acceder a datos alojados fuera de la CPU.
2.3.4. la unidad de control y el juego de instrucciones.
Cada instrucción que puede ejecutar la CPU tiene asociado un código (es un
código numérico en binario). Al código se le conoce como código de
operación.
La unidad de control (UC) trae desde la memoria las instrucciones del
programa. La unidad de control introduce el código binario de la instrucción de
memoria que es apuntado por el puntero de instrucción (que está en el
registro de puntero de instrucción).
El puntero de instrucción contiene la dirección de memoria donde se aloja la
siguiente instrucción a ejecutar.
Estructura y Tecnología de Computadores I
8
La unidad de control lo que hace es colocar el código en un registro especial:
registro de decodificación. Identifica la acción a desarrollar. Luego inicia la
ejecución de la acción que acaba de identificar.
Tamaño de los códigos de operación: son siempre múltiplos de 8 bits; dentro
se codifica la operación a realizar y los operandos involucrados en la
operación. Estos operandos pueden ser registros, posiciones de memoria o
datos directos.
Juego de instrucciones: de la CPU, conjunto de todos los códigos de
operación que soporta su unidad de control. Entendemos por soportar que
sea un código que el sistema pueda soportar que pueda dar lugar a una serie
de pasos.
Para referirnos a los códigos de operación utilizamos notación simbólica, esta
representación se conoce como mnemónicos.
Ej.:
Código de operación mnemónico.
10001001:11001000 mov cx, ax (Un código de operación de 2 bytes)
11110100 hlt (código de operación de 1 byte)
9B:DB:E1 fdsi (código de operación de 3 bytes)
Ya que nosotros vamos a escribir los programas, vamos a necesitar una
herramienta que nos permita hacer la transformación de mnemónico a código
máquina y eso será hecho por el programa ensamblador.
Programa escrito en mnemónico Programa escrito en lenguaje maquina.
Programa ensamblador.
2.4. Organización física de la memoria.
Vamos a considerar siempre un espacio de memoria de 4 gigabytes eso
quiere decir que pueden direccionarse posiciones de la memoria utilizando
direcciones de 32 bits.
Segmentación en IA-32.
El segmento de memoria es una posición de la memoria. El
direccionamiento se puede hacer de dos modos:
- Lineal (o plano): una sola dirección selecciona una posición de
memoria.
- Segmentado: en este caso hay dos componentes para especificar
una posición:
o Segmento.
o Desplazamiento.
Estas dos componentes se convierten en una dirección física
mediante: dirección_física = f(segmento)+desplazamiento.
(La función del segmento puede ser todo lo complicado que se
quiera)
El tamaño del desplazamiento va a limitar el tamaño máximo del segmento. El
segmento al final hace referencia a un trozo de la memoria.
En IA-32 hay dos modos de direccionamiento segmentado:
9
Estructura y Tecnología de Computadores I
-
La segmentación de modo real (permite manejar zonas de memoria)
La segmentación de modo protegido: es la que maneja el sistema
operativo cuando se está manejando en modo multitarea en el
procesador.
En nuestro estudio realizamos siempre direccionamiento plano sobre un
espacio de memoria de 4 gigabytes. Los registros son de 32 bits al ser de
este tamaño son suficientes para alojar una dirección de ese espacio de 4
gigabytes.
Todo lo que hace referencia a segmentación bajo nuestro punto de vista es
trasparente, no es percibido por el usuario.
2.5. Resumen de los registros de la CPU en IA-32.
(alfa)
31
EAX
16 15
87
AH
0
AL
AX
32 bits
16 bits
8 bits
El bit menos significativo es el que está mas a la derecha y más significativo
el que se encuentra en la posición más a la izquierda. Cuando hablo de EAX
y AL no hablo de registros distintos sino de un registro que es parte de otro.
(beta)
EBX
31
16 15
87
BH
0
BL
BX
ECX
31
16 15
87
CH
0
CL
CX
EDX
31
16 15
87
DH
0
DL
10
Estructura y Tecnología de Computadores I
DX
(landa)
ESI
EFLAGS
SI
FLAGS
EDI
16 bit
32 bit
DI
EBP
BP
ESP
SP
CS
FS
DS
GS
ES
SS
16 bit
32 bit
16 bit
16 bit
Alfa, beta y landa se les conoce como registros de propósito general AL, AX,
EAX, BL, BX, EBX, CL, CX, ECX, DL, DH, EDX, SI, ESI, DI, EDI, BP, EBP,
SP, ESP.
- AL, AX, EAX: registro acumulador.
- BL, BX, EBX: registro base.
- CL, CX, ECX: registro contador.
- DL, DX, EDX: registro de datos.
- SI, ESI: índice de fuente.
- DI, EDI: índice de destino.
- BP, EBP: puntero de base.
- SP, ESP: puntero de pila.
Registros de estado del procesador: FLAGS, EFLAGS.
Registro de segmentos:
- CS: segmento de código.
- DS: segmento de datos.
- ES: segmento extra.
- SS: segmento de pila.
- FS, GS: otros segmentos para uso general en acceso a memoria.
Estructura y Tecnología de Computadores I
11
Además está EIP: registro de 32 bits que se llama registro de puntero de
instrucción y es importante por que contiene la dirección de la siguiente
instrucción a ejecutar.
El contenido del registro va variando, aumentando o disminuyendo según se
va ejecutando el programa.
2.6. El Juego de Instrucciones de IA-32.
Hacemos una clasificación:
1) Instrucciones de movimiento de datos, llevan datos de un lugar a otro.
2) Instrucciones de conversión de datos, realizan transformaciones en la
representación de los datos.
3) Instrucciones aritméticas.
4) Instrucciones lógicas y de manipulación a nivel de bit.
5) Instrucciones de control de flujo de los programas (saltos, llamadas a
subrutinas, interrupciones).
6) Instrucciones de entrada salida, que permiten que la CPU intercambie
datos con los dispositivos de entrada salida.
7) Instrucciones de manipulación de cadenas de caracteres o bloques de
memoria.
8) Instrucciones de aritmética en punto flotante (son instrucciones para
manipular datos almacenados en punto flotante y para realizar
operaciones aritméticas sobre ellos).
9) Instrucciones MMX (extensiones para gestión multimedia)
10) Instrucciones SIMD (extensiones para computación tipo SIMD, array,
vectores).
11) Otras instrucciones.
12
Estructura y Tecnología de Computadores I
Tema 3º - Instrucciones de Movimientos de
Datos.
3.1. Introducción.
Son instrucciones que mueven información entre diversos lugares de
almacenamiento (registros, posiciones de memoria o la pila)
Notación para referirnos a los registros:
- REG: cualquiera de los registros de propósito general.
- REG8, REG16, REG32: nos referimos a registros de 8 o 16 o 32 bits
respectivamente.
Notación para referirnos a la memoria:
- MEM: nos referimos a 1 posición de la memoria (1 byte). Los 4
gigabytes son direccionables con los 32 bits de un registro.
- MEM16: zona de memoria en la que se almacena una palabra (16
bits - 2 bytes). Se almacena en 2 posiciones de memoria
consecutivas.
Byte bajo
MEM16
Byte alto
-
-
MEM16
15
87
0
MEM16+1
MEM32: zona de memoria en la que se almacena una palabra doble
(32 bits – 4 bytes). Tiene cuatro posiciones de memoria
consecutivas.
31
MEM32
24 23
Byte 3
16 15
Byte 2
87
Byte 1
0
Byte 0
MEM32+1
MEM32
MEM32+2
MEM32+3
Byte más significativo
Byte menos significativo
Para referirnos a las posiciones físicas de la memoria, nunca utilizaremos el
valor numérico de la dirección directamente.
Siempre nos referiremos a una posición de memoria por medio de etiquetas.
En los programas hay una zona en la que definimos las etiquetas y lo que van
a almacenar esas etiquetas.
El ensamblador y luego el cargador asignaran el valor numérico a cada
etiqueta cuando se ejecute el programa.
A veces se usa la MEM en sentido general, indicando una ubicación de
cualquier tamaño (que se adivina por el contexto)
13
Estructura y Tecnología de Computadores I
3.2. Instrucciones de copia de datos entre lugares de
almacenamiento.
Mnemónico común: MOV.
Función: MOV destino, origen.
Lo que hay en origen se copia en destino. Se mantiene el contenido de
origen, pero se machaca el contenido de destino, no es un movimiento, es
una copia.
Utilización:
1) MOV REG, MEM
2) MOV MEM, REG
3) MOV REG, MEM
4) MOV MEM, DATO_INMEDIATO
5) MOV REG DATO_INMEDIATO
MEM puede ser “MEM8”, “MEM16”, “MEM32” en función del registro
involucrado.
MOV no puede realizar operaciones de memoria a memoria, no puede copiar
datos entre memoria directamente. Los datos inmediatos son valores que
están incluidos dentro de la propia instrucción, pueden ser números o
cadenas de caracteres.
Formatos soportados por NASM:
- números:
o en base 10: MOV AX, 13
o en hexadecimal:
con sufijo (h): MOV AX, A2h
con prefijo (0x): MOV AX, 0xA2
o en octal: con sufijo (q): MOV AX, 777q
o en binario: con sufijo (b): MOV AX, 01110b
- caracteres: se escribe la codificación en ASCII. Deben ir entre
comillas simples: MOV EAX, ‘abcd’. La forma en que se almacena
es:
d
31
c
24 23
b
16 15
a
87
0
El valor que contiene EAX es 0x 64 63 62 61; ASCII(d)=64,
ASCII(c)=63, ASCII(b)=62, ASCII(a)=61.
3.3. Intercambio de contenidos de dos lugares de
almacenamiento.
XCHG: intercambia el contenido de dos operandos.
Utilización:
1) XCHG REG, MEM
2) XCHG REG, REG
14
Estructura y Tecnología de Computadores I
Los dos operandos deben tener el mismo tamaño en bits. No puedo
intercambiar información entre dos posiciones de memoria directamente (al
igual que antes)
3.4. Instrucción para obtención de las direcciones efectivas de
la memoria.
LEA: instrucción para cargar un registro de propósito general con la dirección
efectiva de una posición de memoria
Utilización:
1) LEA REG16, MEM :copia los 16 bits más bajos de la posición de
memoria etiquetada por MEM en REG16. No copia información sino la
dirección.
2) LEA REG32, MEM: copia los 32 bits más bajos de la posición de
memoria etiquetada por MEM en REG32. No copia información sino la
dirección.
3.5. Instrucciones de manejo de pila.
Que se entiende por “pila” en IA-32 : es una estructura en memoria que
funciona como una pila LIFO.
El siguiente elemento que será sacado o metido en la pila, lo será de la
posición de memoria referida por el registro ESP. ESP indica la cabeza de la
pila.
La pila crece “hacia abajo” en la memoria. Crece hacia posiciones más bajas
de memoria. El comienzo de la pila es en una posición elevada.
En la pila se puede hacer dos tipos de operaciones:
- Introducir valores.
- Extraer valores previamente almacenados.
La pila sirve para almacenar temporalmente el contenido de los registros o de
posiciones de memoria. También se usa para pasar parámetros a llamadas
de procedimientos.
Hay una pila para cada proceso.
Instrucciones:
- PUSH: introducir datos en la pila.
- POP: extraer datos de la pila.
Utilización:
1) PUSH REG16: introduce en la pila 2 byte, comenzando por la parte baja.
Byte 1
Byte 0
**revisar** ¿dónde apunta ESP antes y después de introducir los datos?
15
Estructura y Tecnología de Computadores I
2) POP REG16: saca 2 byte de la pila y los coloca en REG16, el primer byte
que extrae va a la parte alta y el segundo que saca va a la parte baja.
3) PUSH REG32 & POP REG32:al igual que antes, para introducir o extraer de
la pila palabras dobles. Se comienza por la parte más baja.
4) PUSH MEM & POP MEM: MEM puede ser una palabra o una palabra
doble (16 o 32 bits), nunca un byte. Con estas instrucciones se puede
extraer o introducir en la pila palabras o palabras dobles que se
encuentren en la memoria.
5) PUSHA & POPA: Coge todos los registros de propósito general de 16 bits
y los copia en la pila. El orden es: AX, CX, DX, BX, SP, BP, SI, DI. Al
extraerse de la pila estos registros se colocan, lógicamente, en orden
inverso.
6) PUSHAD & POPAD: hacen lo mismo que la instrucción anterior pero con
los registros de 32 bits. El orden es: EAX, ECX, DEX, EBX, ESP, EBP,
ESI, EDI.
7) PUSHF & POPF: introducir o extraer de la pila el contenido del registro
FLAGS (16 bits).
8) PUSHFD & POPFD: introducir o extraer de la pila el contenido del registro
EFLAGS (32 bits).
3.6. Otras instrucciones de movimiento de datos.
LAHF: copia la parte baja (0-7) de FLAGS en la parte alta (8-15)de AH de
EAX
SAHF: copia el contenido de AH de EAX en la parte baja de FLAGS
31
16 15
8 7
0
EFLAGS
LAHF
SAHF
EAX
AH
AL
Estructura y Tecnología de Computadores I
16
Tema 4º - Instrucciones de Conversión de
Datos.
4.1. Instrucciones de la representación con y sin signo.
En la arquitectura IA-32 se pueden representar número con signo. Se utiliza
para ello la representación en complemento a 2.
Si el bit más significativo es 0 un número positivo.
Si el bit más significativo es 1 un número negativo.
Si el número es positivo : 0[número en binario]
Si el número es negativo: se aplica el Ca2.
- Se aplica la inversión a todos los bits del número en binario positivo.
- Se suma 1 al resultado.
Cuando se expresa un número en Ca2 hay que tener presente el número de
bits utilizados en su representación:
0x11 (11 en hexadecimal):
- En 8 bits: EF
- En 16 bits: FFEF
Finalidad de las instrucciones de extensión: convertir la representación de 8 a
16, de 8 a 32, y de 16 a 32 bits, para números representados con o sin signo.
Para números sin signo: los bits de mayor orden del nuevo formato extendido
se rellenan con “0”`s.
Para números con signo: los bits de mayor orden se rellenan con 0`s si el
número era positivo y con “1”`s si el número era negativo.
Instrucciones de extensión con signo:
1) MOVSX REG16, MEM8
2) MOVSX REG16, REG8
3) MOVSX REG32, MEM8
4) MOVSX REG32, REG8
5) MOVSX REG32, MEM16
6) MOVSX REG32, REG16
Instrucciones de extensión sin signo:
Son iguales pero con MOVZX REG16, MEM8.
Otras instrucciones de extensión:
CWD: extiende con signo AX (16 bits) en el par DX:AX.
CDQ: extiende con signo EAX (32 bits) en el par EAX:EDX.
4.2. Conversión Little-Endian Big-Endian.
Notación: big o little indica como se almacena la información que se tiene en
varios bytes.
17
Estructura y Tecnología de Computadores I
Little-Endian: en un conjunto de bytes que representan algo el byte de menor
orden (el menos significativo) aparece en la posición de memoria más baja.
EAX 0−7 → POSICION
EAX

8 −15 → POSICION + 1
EAX → POSICION ⇒ 
EAX16 −23 → POSICION + 2
EAX 24-31 → POSICION + 3
Donde POSICIÓN es una etiqueta de memoria.
Byte 3 31-24
Byte 2 23-16
Byte 1 15-8
Byte 0 7-0
Posición
Posición+1
Posición+2
Posición+3
Big-Endian: en un conjunto de bytes que representan un dato. El byte de
menor orden, aparece en la dirección de memoria más alta.
11 → POSICION
22 → POSICION + 1

0x11223344 → POSICION ⇒ 
33 → POSICION + 2
44 → POSICION + 3
Byte 3 31-24
Byte 2 23-16
Byte 1 15-8
Byte 0 7-0
Posición
Posición+1
Posición+2
Posición+3
En la práctica una arquitectura usa una u otra técnica, no se implementan los
dos sistemas en la misma arquitectura, normalmente.
Instrucción BSWAP: cambia la representación de un número de 32 bits de
little-endian a big-endian y viceversa
Utilización:
BSWAP REG32
Estructura y Tecnología de Computadores I
Interés:
-
18
IA-32 usa little-endian.
Otras maquinas usan big-endian.
Cuando hay que intercambiar datos entre computadoras de
diferentes endian, entonces hay que transformar los datos
almacenados en memoria con BSWAP.
19
Estructura y Tecnología de Computadores I
Tema 5º - Instrucciones Aritméticas
5.1. Introducción.
Instrucciones aritméticas suministradas:
- Suma
- Resta
- Cambio de signo
- Multiplicación
- División con obtención de resto
- Comparación
Registro FLAGS: registro que se encarga de mantener el estado del
procesador
Funciones: mantener el actual modo del procesador. Informar sobre
determinados sucesos que ocurren en la ejecución de ciertas funciones.
Bits utilizados:
15
-
-
-
-
-
14
13
12
11
10
9
8
7
6
O
D
I
T
S
Z
5
4
A
3
2
P
1
0
C
O: bandera de desbordamiento (overflow). Se pone a “1” después
de ejecutar una operación aritmética si el resultado no cabe en el
operador destino, supuesto que estemos considerando que se
utilizan números en representación con signo.
Ej.:
AL 0x7F
AL AL + 1
En “AL” al final queda 0x80, no es el resultado correcto por que la
representación es con signo, el resultado correcto es: 0x080, pero
como eso no cabe en 16 bits (capacidad de AL) la bandera O se
pone a “1”.
S: bandera de signo. Se pone a “1” después de ejecutar una
operación aritmética si el resultado es “1”, esto equivale a un
número negativo en una representación de números con signo.
Z: bandera de cero (zero). Se pone a “1” después de ejecutar una
operación aritmética si el resultado es un cero independientemente
de la operación.
A: bandera de acarreo auxiliar. Se pone a “1” después de ejecutar
una operación aritmética en la que hay un desbordamiento en el
“nibble” (4 bits ó ½ byte) menos significativos del resultado.
P: bandera de paridad. Se pone a “1” después de ejecutar una
operación aritmética si la paridad del byte menos significativo del
resultado es par. Si es impar se pone a “0”.
Estructura y Tecnología de Computadores I
20
5.2. Suma.
5.2.1. instrucciones ADD y ADC.
Formato:
ADD DESTINO, FUENTE
ADC DESTINO, FUENTE
Operación:
ADD: DESTINO DESTINO + FUENTE
ADC: DESTINO DESTINO + FUENTE + C (bandera de acarreo)
Sumo el acarreo de la operación anterior. Se usa cuando sumo
registros por partes
Utilización:
ADD REG, REG
ADD REG, MEM
ADD MEM, REG
ADD REG, DATO_INMEDIATO
ADD MEM, DATO_INMEDIATO
De igual forma para ADC. Los dos operandos deben ser del mismo tamaño.
No se puede sumar dos posiciones de memoria de forma directa.
5.2.2. instrucción INC.
Función:
Suma 1 a un operando. Esta instrucción es más rápida que ‘ADD REG, 1’.
Utilización:
INC REG
INC MEM
REG y MEM pueden ser de cualquier tamaño. No afecta a la bandera de
acarreo.
5.2.3. instrucción XADD.
Instrucción de cambio y suma.
Formato:
XADD DESTINO, FUENTE
Destino y fuente pueden ser REG o MEM, pero no MEM ambos.
Ambos de igual tamaño.
Funcionamiento:
1) temp destino
2) destino destino + fuente
3) fuente temp
Afecta a las banderas de igual forma que ADD.
Estructura y Tecnología de Computadores I
5.3. Substracción.
5.3.1. instrucción SUB y SBB.
SUB:
Formato:
SUB DESTINO, FUENTE
Función:
DESTINO DESTINO – FUENTE
Utilización:
SUB REG, REG
SUB MEM, REG
SUB REG, MEM
SUB REG, DATO_INMEDIATO
SUB MEM, DATO_INMEDIATO
Tanto REG como MEM deben ser de igual tamaño.
SBB:
Formato:
SBB DESTINO, FUENTE
Función:
DESTINO DESTINO – FUENTE – C (bandera de acarreo)
5.3.2. instrucción DEC
Resta 1 a un operando.
Utilización:
DEC REG
DEC MEM
Afecta de forma normal a las banderas de estado menos a la de acarreo.
5.4. Cambio de signo.
Instrucción NEG.
Cambia de signo a lo almacenado en el operando, trabajando en Ca2.
Utilización:
NEG REG
NEG MEM
5.5. Comparación de valores.
5.5.1. instrucción CMP.
21
Estructura y Tecnología de Computadores I
22
Es idéntica a SUB pero no deja el resultado en ningún sitio. Como
consecuencia de la ejecución de la instrucción se modifican las banderas de
estado.
Formato:
CMP DESTINO, FUENTE
Permite hacer una comparación entre fuente y destino. Hay otras
instrucciones que actúan según el resultado de CMP pueden ser:
- Saltos (condicionados).
- Actualización de al algún bit en base a CMP.
Utilización:
CMP REG, REG
(No se puede CMP MEM, MEM)
CMP REG, MEM
CMP MEM, REG
CMP REG, DATO_INMEDIATO
CMP MEM, DATO_INMEDIATO
Los operandos deben ser de igual tamaño.
5.5.2. instrucción CMPXCHG y CMPXCHG8B.
CMPXCHG.
Formato:
CMPXCHG OP1, OP2
Utilización:
CMPXCHG REG, MEM
CMPXCHG MEM, REG
Función:
AL 8 


Compara AX16  con OP1, según sea el tamaño de OP1.
EAX 
32 

Si son iguales:
Pone Z =”1”.
OP2 OP1.
Si son distintos:
AL 8 


AX16  OP1.
EAX 
32 

CMPXCHG8B.
Formato:
CMPXCHG8B MEM64
Función:
Compara la palabra que se forma con 2 registros EDX:EAX (64
bits) con lo almacenado en MEM64.
Si son iguales:
Pone Z = “1”.
ECX:EBX MEM64.
Si son distintos:
MEM64 EDX:EAX
Estructura y Tecnología de Computadores I
23
Sirve para la construcción de semáforos.
5.6. Multiplicación.
5.6.1. instrucción MUL.
Función:
Sirve para multiplicar números en representación sin signo.
Formato:
MUL REG
MUL MEM
Tanto REG como MEM pueden ser de 8, 16 o 32 bits.
Función:
Si REG o MEM son de 8 bits.
AX AL × {REG, MEM}8
Si REG o MEM son de 16 bits.
DX :AX AX × {REG, MEM}16
Si REG o MEM son de 32 bits.
EDX:EAX EAX × {REG, MEM}32
No hay perdida de bits por desbordamiento. Con respecto a las banderas, las
afecta de forma absurda, estropeando los contenidos, excepto de las
banderas “C” y “O”.
5.6.2. instrucción IMUL.
Función:
Instrucciones para multiplicar números en representación con signo.
Formato:
Los mismos que MUL y además.
IMUL REG, REG, DATO_INMEDIATO
IMUL REG, MEM, DATO_INMEDIATO
IMUL REG, DATO_INMEDIATO
IMUL REG, REG
IMUL REG, MEM
Es decir:
IMUL OP1, OP2, DATO_INMEDIATO
IMUL OP1, OP2
IMUL OP1, INMEDIATO
Función:
IMUL OP1, OP2, DATO_INMEDIATO: OP1 OP2 × DATO
IMUL OP1, OP2:
OP1 OP1 × OP2
IMUL OP1, DATO_INMEDIATO:
OP1 OP1 × DATO
24
Estructura y Tecnología de Computadores I
Estas son las combinaciones de tamaños de operación soportados por los
formatos específicos de IMUL:
IMUL OP1, OP2, DATO_INMEDIATO
OP1
OP2
DATO_INMEDIATO
REG16
REG16
MEM16
DATO_INMEDIATO8
DATO_INMEDIATO16
REG32
REG32
MEM32
DATO_INMEDIATO8
DATO_INMEDIATO32
IMUL OP1, DATO_INMEDIATO
OP1
DATO_INMEDIATO
REG16
DATO_INMEDIATO8
DATO_INMEDIATO16
REG32
DATO_INMEDIATO8
DATO_INMEDIATO32
OP1
IMUL OP1, OP2
OP2
REG16
REG16
MEM16
REG32
REG32
MEM32
Hay posibilidad de desbordamiento, se perderían los bits más significativos.
Se activarían las banderas “C” y “O”.
5.7. División.
Instrucciones DIV y IDIV; para divisiones con y sin signo.
Formato:
 DIV REG 



IDIV MEM {8,16,32}
Función:
Ejecuta divisiones de los
bits dividendo
64 32 16
→
:
tamaños:
:
bits divisor
23 16 8
operandos
con
los
siguientes
25
Estructura y Tecnología de Computadores I
No se puede dividir con los siguientes formatos:
64 32 16 8
:
:
:
64 32 16 8
Cociente : AL
AX
→
OPERANDO
Resto : AH
Cociente : AX
DX : AX
2º) Operando de 16 bits:
→
OPERANDO
Resto : DX
1º) Operando de 8 bits:
3º) Operando de 32 bits:
Cociente : EAX
EDX : EAX
→
OPERANDO
Resto : EDX
Para dividir valores con el mismo tamaño de almacenamiento, es necesario
extender (a tamaño doble) el dividendo (numerador). La ejecución de esta
instrucción estropea el estado de las banderas.
Si se produce un error de desbordamiento o por división por 0, el procesador
aborta la ejecución del programa.
Estructura y Tecnología de Computadores I
Tema 6º - Instrucciones Lógicas y de
Manipulación a Nivel de Bit.
6.1. Instrucciones lógicas.
Instrucciones: AND, OR, XOR, NOT.
Formato:
INSTRUCCIÓN DESTINO, FUENTE {Para AND, XOR, OR }
NOT OPERANDO
Funcionalidad:
NOT: invierte bit a bit todos los operandos.
AND, XOR, OR: realizan la operación bit a bit entre destino y fuente.
AND DESTINO, FUENTE: DESTINO DESTINO AND FUENTE
OR DESTINO, FUENTE: DESTINO DESTINO OR FUENTE
XOR DESTINO, FUENTE: DESTINO DESTINO XOR FUENTE
NOT OPERANDO:
OPERANDO NOT OPERANDO
Utilización:
AND REG, REG
AND REG, MEM
AND MEM, REG
AND REG, DATO_INMEDIATO
AND MEM, DATO_INMEDIATO
NOT REG
NOT MEM
XOR y OR de igual manera que AND.
Los dos operandos deben ser de igual tamaño.
6.2. Instrucciones de desplazamiento.
Instrucciones:
SHL: desplazamiento a la izquierda.
SAL: desplazamiento aritmético a la izquierda.
SHR: desplazamiento a la derecha.
SAR: desplazamiento aritmético la derecha.
SHLD: desplazamiento a la izquierda en doble precisión.
SHRD: desplazamiento a la derecha en doble precisión.
Formato:
SHL DESTINO, CONTADOR
SAL DESTINO, CONTADOR
SHR DESTINO, CONTADOR
SAR DESTINO, CONTADOR
26
Estructura y Tecnología de Computadores I
27
SHLD DESTINO, FUENTE, CONTADOR
SHRD DESTINO, FUENTE, CONTADOR
Funcionalidad:
SHL – SAL: desplazan el contenido DESTINO tantas veces a la
izquierda como indique el contador. El hueco de la derecha se
rellana con 0´s. Ambas instrucciones son idénticas. El bit que se
“pierde” lo “coge” la bandera de acarreo.
SHR – SAR: desplazan el contenido DESTINO tantas veces a la
derecha como indique el contador. El “hueco” SHR lo rellena de
0´s pero SAR lo que hace es rellenar del bit + significativo que
había al inicio. El bit que se pierde se queda en la bandera “C”.
SHLD – SHRD:
SHLD: 1º) coloca el 2º operando a la derecha del 1º operando y
construye con ambos una cadena de bits.
1º Operando
2º Operando
2º) desplaza la cadena entera hacia la izquierda tantas
veces como indica el contador.
3º) copia la parte alta de la cadena resultante en el 1º
operando. El 2º operando se deja intacto.
SHRD: 1º) coloca el 2º operando a la izquierda del 1º operando y
con ambos crea una cadena.
2º Operando
1º Operando
2º) desplaza hacia la derecha tantas veces como indica el
contador.
3º) se copia la parte baja de la cadena en el 1º operando
y se deja intacto el 2º operando.
Utilización:
SHL REG DATO_INMEDIATO
SHL MEM, DATO_INMEDIATO
SHL REG, CL (registro contador)
SHL MEM, CL
SHLD REG, REG, DATO_INMEDIATO
SHLD MEM, REG, DATO_INMEDIATO
SHLD REG, REG, CL
SHLD MEM, REG, CL
SHR, SAR, SAL son igual que SHL.
SHRD igual que SHLD.
La bandera de acarreo siempre tiene el bit expulsado en el último
desplazamiento.
28
Estructura y Tecnología de Computadores I
6.3. Instrucciones de rotación.
Instrucciones:
RCL: rotación a la izquierda pasando a través de la bandera “C”.
RCR: rotación a la derecha pasando a través de la bandera “C”.
ROL: rotación a la izquierda sin pasar por la bandera “C”.
ROR: rotación a la derecha sin pasar por la bandera “C”.
Formato:
RCL DESTINO, CONTADOR
RCR DESTINO, CONTADOR
ROL DESTINO, CONTADOR
ROR DESTINO, CONTADOR
Funcionalidad:
Rota tantas veces como expresa el contador.
RCL:
C
DESTINO
RCR:
DESTINO
C
ROL:
DESTINO
C
ROR:
DESTINO
C
Utilización:
RCL REG, DATO_INMEDIATO
RCL MEM, DATO_INMEDIATO
RCL REG, CL
RCL MEM, CL
RCR, ROL y ROR igual que RCL.
Estructura y Tecnología de Computadores I
29
6.4. Instrucciones de manipulación de bit.
6.4.1. instrucciones de manipulación de bit de un operando.
TEST.
Formato:
TEST DESTINO, FUENTE
Realiza una operación AND bit a bit entre destino y fuente sin almacenar el
resultado, sirve para modificar la bandera de estado “Z”.
Utilización:
TEST REG, REG
TEST REG, MEM
TEST MEM, REG
TEST REG, DATO_INMEDIATO
TEST MEM, DATO_INMEDIATO
BT.
Formato:
BT FUENTE, INDICE
Copia en la bandera “C” el contenido de la posición índice dentro del
operando fuente.
Utilización:
BT REG, REG
BT MEM, REG
BT REG, DATO_INMEDIATO
BT MEM, DATO_INMEDIATO
Empieza del bit menos significativo.
BTR, BTS, BTC.
Formato:
BTR 


BTS  FUENTE, INDICE
BTC 


Estas instrucciones hacen lo mismo que BT y además:
BTR: pone el bit implicado a 0.
BTC: complementa el bit implicado.
BTS: pone el bit a 1.
Utilización:
Igual que BT.
{BTR, BTS, BTC} REG, REG
{BTR, BTS, BTC} MEM, REG
{BTR, BTS, BTC} REG, DATO_INMEDIATO
{BTR, BTS, BTC} MEM, DATO_INMEDIATO
BSF.
Formato:
BSF DESTINO, FUENTE
Estructura y Tecnología de Computadores I
30
Busca en fuente el primer bit en “1” comenzando por el menos significativo y
terminando por el más significativo. Si lo encuentra pone Z=0 y almacena la
posición de ese bit en destino.
Utilización:
BSF REG, REG
BSF REG, MEM
BSR.
Formato:
BSR DESTINO, FUENTE
Busca en fuente el primer bit en “1” comenzando por el más significativo y
terminando por el menos significativo.
Tamaño de operandos:
TEST: 8, 16, 32 bits.
El resto: 16 o 32 bits.
6.4.2. instrucción de “poner en 1 si se cumple una condición”.
Escribir 1 o 0 en un operando (registro o memoria) de 8 bits si se cumple una
condición determinada.
Formato general:
INSTRUCCIÓN REG8
INSTRUCCIÓN MEM8
Las condiciones:
Basadas en banderas de estado:
- SETC: pone en 1 si C=1.
- SETNC: pone en 1 si C=0.
- SETZ: pone en 1 si Z=1.
- SETNZ: pone en 1 si Z=0.
- SETS: pone en 1 si S=1.
- SETNS: pone en 1 si S=0.
- SETO: pone en 1 si O=1.
- SETNO: pone en 1 si O=0.
- SETP: pone en 1 si P=1.
- SETNP: pone en 1 si P=0.
Según el resultado de una comparación sin signo:
Deben ejecutarse inmediatamente después de una operación CMP en
la que se compara 2 valores representados sin signo.
- SETA: pone en 1 si el resultado es >.
- SETNBE: pone en 1 si el resultado no es ≤.
- SETAE: pone en 1 si el resultado es ≥.
- SETNB: pone en 1 si el resultado no es <.
- SETB: pone en 1 si el resultado es <.
- SETNAB: pone en 1 si el resultado no es ≥.
- SETBE: pone en 1 si el resultado es ≤
- SETNA: pone en 1 si el resultado no es >.
- SETE: pone en 1 si el resultado es =.
- SETNE: pone en 1 si el resultado es ≠.
Estructura y Tecnología de Computadores I
31
Según el resultado de una comparación con signo:
Deben ejecutarse inmediatamente después de una operación CMP en
la que se compara 2 valores representados con signo.
- SETG: pone en 1 si el resultado es >.
- SETNLE: pone en 1 si el resultado no es ≤.
- SETGE: pone en 1 si el resultado es ≥.
- SETNL: pone en 1 si el resultado no es <.
- SETL: pone en 1 si el resultado es <.
- SETNGE: : pone en 1 si el resultado no es ≥.
- SETLE: pone en 1 si el resultado es ≤.
- SETNG: pone en 1 si el resultado no es >.
- SETE: pone en 1 si el resultado es =.
- SETNE: pone en 1 si el resultado es ≠.
Estructura y Tecnología de Computadores I
32
Tema 7º - Instrucciones de Salto.
7.1. Introducción.
Sirven para continuar la ejecución de un programa en una instrucción que no
es la que está inmediata después en el código.
Modifican el registro de puntero que contiene la siguiente instrucción a
ejecutar. Son de tres tipos:
- Salto incondicional.
- Salto condicionado.
- De construcción de bucles.
7.2. Saltos incondicionales.
Formato:
JMP ETIQUETA
Continuar la ejecución del código en la posición de memoria marcada como
etiqueta.
Hay que colocar esa etiqueta en un punto del código.
7.3. Saltos condicionales.
Formato:
J[CC] ETIQUETA
[CC] Representa a los neumónicos de salto condicional.
Función:
Se continua la ejecución de la instrucción que está en la posición
“etiqueta” si se cumple la condición. Si no se cumple la condición se ejecuta la
siguiente a la instrucción de salto.
Tipos de condición:
- Basadas en banderas.
- Basadas en comparaciones con signo.
- Basadas en comparaciones sin signo.
- Basadas en el contenido del registro ECX.
Instrucciones de salto condicional basado en banderas.
- JC [ETIQUETA]: salta si C=1.
- JNC [ETIQUETA]: salta si C=0.
- JZ [ETIQUETA]: salta si Z=1.
- JNZ [ETIQUETA]: salta si Z=0.
- JS [ETIQUETA]: salta si S=1.
- JNS [ETIQUETA]: salta si S=0.
- JO [ETIQUETA]: salta si O=1.
- JNO [ETIQUETA]: salta si O=0.
- JP [ETIQUETA]: salta si P=1.
Estructura y Tecnología de Computadores I
-
33
JPE [ETIQUETA]: salta si P=1.
JNP [ETIQUETA]: salta si P=0.
JPO [ETIQUETA]: salta si P=1.
Instrucciones de salto condicional basado en operaciones sin signo; deben ir
después de instrucciones CMP. Se considera que se compara dos valores
representados sin signo.
- JA [ETIQUETA]: salta si >.
- JNA [ETIQUETA]: salta si no >.
- JAE [ETIQUETA]: salta si ≥.
- JNAE [ETIQUETA]: salta si no ≥.
- JB [ETIQUETA]: salta si <.
- JNB [ETIQUETA]: salta si no <.
- JBE [ETIQUETA]: salta si ≤.
- JNBE [ETIQUETA]: salta si no ≤.
- JE [ETIQUETA]: salta si =.
- JNE [ETIQUETA]: salta si ≠.
Instrucciones de salto condicional basado en operaciones con signo; deben ir
después de instrucciones CMP. Se considera que se compara dos valores
representados sin signo.
- JG [ETIQUETA]: salta si >.
- JG [ETIQUETA]: salta si no >.
- JGE [ETIQUETA]: salta si ≥.
- JNGE [ETIQUETA]: salta si no ≥.
- JL [ETIQUETA]: salta si <.
- JNL [ETIQUETA]: salta si no <.
- JLE [ETIQUETA]: salta si ≤.
- JNLE [ETIQUETA]: salta si no ≤.
- JE [ETIQUETA]: salta si =.
- JNE [ETIQUETA]: salta si ≠.
Instrucciones basadas en el contenido del registro ECX.
- JCXZ [ETIQUETA]: salta si CX=0.
- JECXZ [ETIQUETA]: salta si ECX=0.
Estructura y Tecnología de Computadores I
34
7.4. Instrucciones de construcción de bucles.
Sirven para construir los saltos que permiten cerrar un bucle. Se suele usar
como contador de vueltas el registro ECX.
Tipo:
- LOOP
o Formato: LOOP [ETIQUETA]
1º) ECX ECX – 1.
2º) Si ECX≠0 salta a etiqueta
Si ECX=0 ejecuta la siguiente instrucción después
de LOOP.
- LOOPE
o Formato: LOOPE [ETIQUETA]
1º) ECX ECX – 1.
2º) Si ECX≠0 y Z=1 salta a la etiqueta.
Sino ejecuta la siguiente instrucción después de
LOOPE.
- LOOPNE
o Formato: LOOPNE [ETIQUETA]
1º) ECX ECX –1.
2º) Si ECX≠0 y Z=0 salta a etiqueta.
Sino ejecuta la siguiente instrucción después de
LOOPNE.
Debido a la forma en que trabajan estos bucles, para que una acción se repita
n veces, debemos inicializar el contador con n+1.
Estructura y Tecnología de Computadores I
35
Tema 8º - Llamadas a Subrutinas.
8.1. Introducción.
Subrutinas:
- Es un trozo de código que se accede por medio de un salto que se
ejecuta en un determinado punto del programa.
- Cuando se termina la ejecución de la subrutina, se debe ejecutar la
instrucción que está inmediatamente después de la llamada a la
subrutina.
- Criterio Básico: el estado del procesador debe ser igual al final de la
subrutina que al inicio. Cuando se entre en la subrutina se
almacena el estado del procesador y cuando se sale de la
subrutina, se recupera el estado.
8.2. Instrucción CALL.
Sirve para continuar la ejecución en el comienzo de una subrutina.
Formato:
CALL [ETIQUETA]
Función:
1º) Recordar donde saltar cuando finalice la subrutina. Almacena en la pila la
dirección de la instrucción que está después de la CALL.
2º) Salta a la posición indicada por la etiqueta.
8.3. Instrucción RET.
Es la instrucción que se coloca al final de una subrutina.
Formato:
RET
Función:
1º) Saca 4 byte de la pila y los interpreta como la dirección de retorno. Es una
gran fuente de fallos de programación.
2º) Salta a ese punto de retorno.
8.4. Instrucciones de Interrupción.
Sirven para llamar a un tipo especial de subrutinas, las RUTINAS DE
SERVICIO DE INTERRUPCION.
El objetivo es invocar procedimientos suministrados por el fabricante.
Ej.:
- Leer de teclado, acceder a disco, escribir en un puerto serie, etc.
Estructura y Tecnología de Computadores I
36
Tema 9º - Otras Instrucciones.
9.1. Manipulación directa de Banderas de Estado.
CLC: C 0
SETC: C 1
CMC: invertir la bandera; C ¬ C
9.2. Instrucción NOP.
Esta instrucción no produce ningún efecto. No hace nada. Se usa para dejar
huecos en los binarios cuando están en memoria. Sirve a efectos de
depuración de código.
9.3. Instrucción RDTSC.
Nos permite medir el tiempo de ejecución. Almacena en EDX:EAX el número
de ciclos de reloj transcurridos desde el último “reset” sufrido por el
procesador, no desde que el proceso se ejecuta.
9.4. Instrucción de manipulación del Modo Protegido.
Para programas del sistema operativo.
9.5. Instrucciones de Entrada / Salida.
Instrucciones:
IN OPERANDO
OUT OPERANDO
Se usa para leer / escribir datos en direcciones del subsistema de entrada /
salida. A las direcciones de entrada / salida se las conoce como PUERTOS.
No se utilizan.
Estructura y Tecnología de Computadores I
37
Tema 10º - Acceso a los Recursos del
Sistema Operativo.
10.1. Concepto y necesidad de las llamadas al Sistema
Operativo.
El sistema operativo suministra una serie de funciones. Estas funciones sirven
para:
- Realización de diversas tareas de índole general.
o Lanzamiento de procesos.
o Finalización de procesos...
- Acceso al sistema de entrada / salida:
o Teclado
o Pantalla
o Dispositivos de i/o
o Discos
Gestión de archivos
Gestión de directorios...
Y la realización de todas estas tareas con seguridad.
Sólo a través de esas funciones se puede acceder a esos recursos. Además
hay funciones para ayudar al usuario en ciertas tareas, no necesariamente
hay que recurrir a ellas.
10.2. Funciones de Biblioteca del Sistema Operativo y su
utilización.
Apéndice D: “Curso de C bajo Unix”; funciones ANSI-C. Dentro del archivo en
ensamblador se invoca a la función CALL.
Ej.: llamar a la función printf
CALL printf
Los nombres de las funciones que se invocan han de ser declaradas como
EXTERN.
El paso de parámetros a las funciones: se realiza a través de la pila. Cuando
se invoca a la función se leen los parámetros pero no son sacados de la pila.
Si el parámetro es una cadena de caracteres:
1) se almacena a partir de una posición de memoria,
2) se coloca al final un byte con “0”, para indicar el final de la cadena y
después un LF (1010).
3) Se introduce en la pila como parámetro la dirección de almacenamiento
del comienzo de la cadena.
Estructura y Tecnología de Computadores I
38
Si hay varios parámetros: se deben ir introduciendo en la pila en orden
inverso al de su aparición en el formato de la función.
Devolución de resultados de las funciones:
- Si sólo devuelve un número, lo hacen en AL o AX o EAX según sea
el tamaño del resultado.
- Si es una cadena de caracteres, le debemos haber suministrado
como parámetro una dirección de la memoria que esté al inicio de
un espacio reservado para almacenar la cadena.
Después de invocar CALL (llamada al sistema) hay que eliminar de la pila los
parámetros introducidos para ello se puede usar una de las siguientes vías:
- realizar tantos “POP” como “PUSH” de palabras se haya realizado
para introducir esos parámetros.
- Modificar directamente ESP (el puntero de cabeza de la pila). Se le
hace volver a su valor original antes de introducir los parámetros de
la función.
Ej.: Escribir en pantalla: “Resultado = (entero)”
EXTERN PRINTF
SECTION .TEXT
PUSH EAX
PUSH DWORD CADENA
CALL PRINTF
POP EAX 
 ≡ ADD ESP,8
POP EAX 
SECTION .DATA
CADENA
DB 'Resultado = %d', 10, 0
Estructura y Tecnología de Computadores I
39
Tema 11º - Los Modos Indirectos.
11.1 Introducción.
Concepto: una instrucción utiliza un modo indirecto si para referirse a una
determinada posición de memoria, en lugar de expresar directamente el
número de dicha dirección, se refiere a ella a través de un lugar de
almacenamiento en el que está escrito el número que expresa dicha
dirección.
Utilización:
- En
direccionamiento
para
la
instrucción
MOV
DIRECCIONAMIENTO INDIRECTO.
- En instrucciones de salto para expresar la dirección de destino SALTOS INDIRECTOS.
- En las llamadas de subrutinas para indicar el punto de comienzo de
la subrutina LLAMADAS INDIRECTAS A SUBRUTINAS.
11.2. Direccionamiento Indirecto.
En una instrucción MOV, se puede hacer referencia a una dirección de
memoria que:
- Esté cargada en un registro de 32 bits.
- Se puede construir en base a operaciones aritméticas sobre
números cargados en registros.
Hay cuatro modos:
- Direccionamiento indirecto por registro: un registro de 32 bits
contiene la dirección involucrada.
LEA EBX, [dato]
MOV EAX, [EBX] ≡ MOV EAX, [dato]
- Direccionamiento indirecto indexado: se hace referencia a una
posición de la memoria que se obtiene sumando un número al
contenido de un registro.
Formato general:
MOV destino, [REG + desplazamiento]
- Direccionamiento indirecto con base + índice: se hace referencia a
una posición de memoria que se obtiene en base a una expresión
del tipo:
REG1 + REG2
REG1 + A{=2,4,8}× REG
- Direccionamiento indirecto con base, índice y desplazamiento: lo
mismo que el anterior pero añadiendo un desplazamiento dentro del
índice.
REG1 + REG2 + desplazamiento
REG1 + A{=2,4,8} × REG + desplazamiento
Estructura y Tecnología de Computadores I
40
11.3. Saltos Indirectos.
Se establece la dirección destino de un salto en base al contenido de:
- un registro:
JMP REG32
Ej.:
LEA EAX, [destino]
JMP EAX (saltará a la dirección ‘destino’)
- una dirección almacenada en memoria como palabra doble a partir
de una ubicación determinada:
Ej.:
JMP MEM32
LEA EAX, [destino]
MOV [dato], EAX
JMP [dato]
11.4. Llamadas Indirectas a Subrutinas.
Análogas a saltos indirectos.
Formato:
CALL REG32: Contiene la dirección (en 32 bits) de comienzo de la
subrutina.
CALL MEM32: Etiqueta hacia una posición de memoria a partir de la
que se almacena una dirección de 32 bits que es la dirección de
comienzo de la subrutina.
Estructura y Tecnología de Computadores I
41
Tema 12º - La Unidad Aritmético Lógica de
Punto Flotante.
12.1. Introducción.
En IA-32 existen una serie de instrucciones para utilizar la unidad aritmética
de punto flotante FPU.
Está dentro de la CPU.
Es una unidad aritmética especializada en trabajar con punto flotante. La FPU
posee sus propios registros internos; tiene ocho registros de datos, un registro
de estado y otros.
12.2. Tipos de Datos manejados por la FPU.
IA-32 soporta 3 formatos de representación de número en punto flotante.
a) Formato de Precisión Simple: 32 bits – 1/8/23
32 bits
EXPONENTE (30-23)
MANTISA (22-0)
SIGNO (31)
Numero = (signo) 1. [mantisa] × 2 [exponente -127]
Se obtienen 6 dígitos de precisión.
Rango: ± 2±128
b) Formato de Precisión Doble: 64 bits – 1/11/52
64 bits
EXPONENTE (63-52)
MANTISA (51-0)
SIGNO (63)
Se obtiene 14 dígitos de precisión.
Rango: ± 2±1.023
Bit_exponente = exponente + 1.023
c) Formato Precisión Extendida: 80 bits – 1/15/64
Estructura y Tecnología de Computadores I
42
80 bits
EXPONENTE (78-64)
MANTISA (63-0)
SIGNO (79)
El primer bit representa la parte entera es una representación no
normalizada.
Número = (signo) [mantisa] × 2 [exponente]
Bit_exponente = exponente +16.383
Se obtienen 19 dígitos de precisión.
Rango: ±2±16.383
Internamente la FPU siempre utiliza los números expresados en precisión
extendida.
IA-32 suministra instrucciones de punto flotante para manipular números
representados en cualquier de las tres precisiones. FPU lo convierte a
precisión extendida y opera con ellos.
12.3. Registros de FPU.
REGISTROS DE DATOS: Son ocho registros con un tamaño cada uno de 80
bits. Almacena un número expresado en precisión extendida. No funciona
como los registros de propósito general.
- Están organizados como una pila lifo.
- Se les denomina ST0, ST1, ..., ST7.
- ST0 es la cabecera de la pila y ST7 el fondo de la pila. ST0
corresponde con el número que está en la cabeza, no con la
siguiente posición.
Cuando se introduce un dato en ST0, lo que había antes pasa a ST1 y así
sucesivamente.
También se conoce a estos registros como pila-FPU.
REGISTRO DE ESTADO FPU: es de 16 bits. Descripción:
- 0 a 7 : Banderas de excepción.
- Bits de código de condición: 8,9,10,14.
o 8 – C0
o 9 – C1
o 10 – C2
o 14 – C3
Estructura y Tecnología de Computadores I
43
12.4. Instrucciones de Movimiento de Datos de la FPU.
FLD.
Carga en la pila-FPU un número expresado en punto flotante
almacenado en:
- memoria en {32, 64, 80 bits}
- otro registro de la pila, se reintroduce ese valor en la pila.
Los de 32 y 64 bits los convierte en uno de 80 bits, hay que
recalcularlos de nuevo.
Formato y utilización:
FLD MEM32
FLD MEM64
FLD MEM80
FLD STi
i=0, 1, ...,7.
FSTP.
Saca el contenido de ST0 y lo lleva a la memoria (32, 64, 80) o un
registro de P-FPU (pila FPU).
Al sacar el dato el resto de los datos “suben” una posición.
El número que está en 32 o 64 bits pierde precisión ya que se
almacena en 80 bits.
Pasos:
1º) Se copia ST0 en STi
2º) Se “saca” ST0 (ojo que STi pasa a ser STi-1)
Formato y utilización:
FSTP MEM{32, 64, 80}
FSTP STi
FST.
F:Hace lo mismo que FSTP, pero no saca el valor de ST0 de la pila.
Sólo trabaja con dirección de memoria de 32 o de 64 bits, pero nunca
con 80 bits.
FXCH.
Función: Intercambia el contenido de ST0 y STi.
Formato:
FXCH STi
Uso especial: FXCH (sin argumentos, lo que hace es
intercambia ST0 y ST1)
12.5. Instrucciones de Conversión de Datos.
Sirven para realizar conversiones de valores almacenados como enteros (en
Ca2) a valores almacenados en punto flotante.
Estructura y Tecnología de Computadores I
44
FILD.
Formato:
FILD MEM{16, 32, 64}
El entero que está en MEM debe estar almacenado en 16, 32 o
64 bits.
Función: Convierte de entero a formato extendido y lo mete en ST0
FISTP.
Función: Saca el contenido de ST0 y lo almacena en formato de entero
en memoria (16, 32, 64)
Formato:
FISTP MEM{16, 32, 64}
12.6. Instrucciones Aritméticas.
12.6.1. suma en punto flotante.
FADD.
FADD MEM{32, 64} ≡ ST0 ST0 + MEM (El dato que está en
MEM debe estar ya en punto flotante)
FADD STi ≡ ST0 ST0 + STi (Estas operaciones no hacen que
el resto de valores “descienda” en la pila)
FADD TO STi ≡ STi ST0 + STi
FADDP.
FADDP STi ≡
1º) STi ST0 + STi
2º) “saca” el valor de ST0 y el resto de
valores “suben”.
12.6.2. substracción en punto flotante.
FSUB.
FSUB MEM{32, 64} ≡ ST0 ST0 - MEM
FSUB STi ≡ ST0 ST0 - STi
FSUB TO STi ≡ STi ST0 - STi ≡ (FSUB STi, ST0)
FSUBR.
FSUBR MEM{32, 64} ≡ ST0 MEM - ST0
FSUBR TO STi 
 ≡ STi ← STi - ST0
FSUBT STi , ST0 
FSUBP.
FSUBP STi ≡
FSUBRP.
FSUBRP STi ≡
1º) STi ST0 – STi
2º) saca ST0 de la pila.
1º) STi STi - ST0
2º) saca ST0 de la pila.
Estructura y Tecnología de Computadores I
45
12.6.3. multiplicación en punto flotante.
FMUL.
FMUL MEM{32, 64} ≡ ST0 ST0 × MEM
FMUL STi ≡ ST0 ST0 × STi
FMUL TO STi ≡ STi ST0 × STi
FMULP.
FMULP STi ≡
1º) STi ST0 × STi
2º) saca ST0 de la pila.
12.6.4. división en punto flotante.
FDIV.
FDIV MEM{32, 64} ≡ ST0 ST0 / MEM
FDIV STi ≡ ST0 ST0 / STi
FDIV TO STi ≡ STi ST0 / STi
FDIVR.
FDIVR MEM ≡ ST0 MEM / ST0
FDIVR STi ≡ ST0 STi / ST0
FDIVR TO STi ≡ STi STi / ST0
FDIVP.
FDIVP STi ≡ 1º) STi ST0 / STi
2º) saca ST0 de la pila.
FDIVPR.
FDIVPR STi ≡
1º) STi STi / ST0
2º) saca ST0 de la pila.
12.6.5. otras instrucciones aritméticas.
FSQRT.
FSQRT ≡ ST0 ST0½
FXTRACT.
1º) saca el valor de ST0.
2º) mete en la pila el exponente.
3º) mete en la pila la mantisa.
Al final en ST0 queda la mantisa y en ST1 queda el exponente,
almacenados en punto flotante.
FSCALE.
Es la inversa de FXTRACT.
Entiende ST1 y ST0 como el exponente y la mantisa. Deja el
número en ST0.
FRNDINT.
Redondea a entero el valor de ST0.
FABS.
Calcula el valor absoluto de ST0. Pone a 0 el bit de signo.
FCHS: cambia el signo de ST0.
Estructura y Tecnología de Computadores I
46
12.7. Instrucciones de Comparación.
Sirve para comparar números en formato de punto flotante. El resultado va a
las banderas C3, C2 y C0.
C3
C2
C0
ST0 > operando
0
0
0
ST0 < operando
0
0
1
ST0 = operando
1
0
0
FCOM.
FCOM MEM{32, 64}
FCOM STi
Compara ST0 con el operando.
FCOMP.
FCOMP MEM{32, 64}
FCOMP STi
Compara ST0 con operando, deja el resultado de las banderas C3, C2,
C0 y saca ST0 de la pila.
FCOMPR.
Compara ST0 con ST1 y saca los dos de la pila. ST2 pasa a ST0 y ST3
pasa a ST1.
FCOMI & FCOMIP.
FCOMI STi
FCOMIP STi
Compara ST0 con STi y deja el resultado de la comparación en el
registro EFLAGS. El interés de esta instrucción es que pueden ser
seguidas inmediatamente por otras instrucciones de salto condicional.
FTST.
Compara ST0 con 0.
12.8. Predefinición de constantes.
Colocar en ST0 ciertas constantes útiles.
FLDZ. FLDZ ≡ ST0 +0
FLD1. FLD1 ≡ ST0 +1
FLDPI. FLDPI ≡ ST0 π
FLD2T. FLD2T ≡ ST0 log2(10)
FLD2E. FLD2E ≡ ST0 log2(e)
FLDG2. FLDG2 ≡ ST0 log10(2)
FLDN2. FLDN2 ≡ ST0 ln(2)
12.9. Instrucciones sobre operaciones transcendentales.
Funciones trigonométricas.
FSIN.
FSIN ≡ ST0 sen(ST0)
FCOS.
FCOS ≡ ST0 cos (ST0)
Estructura y Tecnología de Computadores I
47
FSINCOS.
FSINCOS ≡ ST0 sen(ST0)
ST1 cos(ST0)
FPTAN.
FPTAN ≡ ST0 tg(ST0)
FPATAN.
1º) saca ST0 y ST1 de la pila.
2º) ST0 arctg (ST1/ST0)
Condiciones:
1º) ST0 debe estar en radianes.
2º) ST0 debe estar en un rango de ± 263
Funciones logarítmicas.
FYL2X.
FYL2X ≡ ST0 ST1 × log2(ST0)
Saca ST0 y ST1 de la pila, realiza la multiplicación y
almacena el resultado en ST0.
12.10. Operaciones con enteros en la unidad de punto flotante.
Instrucciones: FIADD, FISUB, FISUBR, FIMUL, FIDIV, FIDIVR, FICOM,
FICOMP.
Formato:
[INSTRUCCION] MEM{16,32}
Función:
Hacen lo mismo que sus homónimos sin la “I” considerando que el
operando es un entero de 16 o 32 bits. Siempre usan ST0 como
destino.
12.11. Otras instrucciones.
FXAM.
Examina el valor de ST0 y devuelve el resultado en C3, C2, C1, C0.
Si ST0 es + C1=0
Si ST0 es - C1=1
C3
C2
C1
C0
0
1
0
1
+∞ en ST0.
0
1
1
1
-∞ en ST0.
1
0
0
0
+0
1
0
1
0
-0
FSTSW.
Copia el contenido del registro de estado FPU.
FSTSW AX ≡ copia el contenido del registro de estado hacia AX.
FSTSW MEM16 ≡ copia el contenido del registro de estado hacia MEM.
FINIT.
Inicializa FPU al estado por defecto.
1º) Deja el registro de estado FPU a 0.
Estructura y Tecnología de Computadores I
2º) Deja la pila de FPU vacía.
48
Estructura y Tecnología de Computadores I
49
Tema 13º - Manipulación de Cadenas y
Conjuntos de Caracteres.
13.1. Introducción.
CADENA: colección de objetos almacenados en posiciones consecutivas de
memoria.
Los objetos pueden ser byte, palabras, dobles palabras.
Existen instrucciones especificas para manipulación. Útiles para manipulación
de array...
13.2. Instrucción de Manipulación de Cadenas.
Operan sobre conjuntos de posiciones contiguas de la memoria. Operan en
memoria. No se suministra explícitamente ningún operando. Los datos que
controlan el funcionamiento de estas instrucciones están almacenados en
registros de propósito general.
Funciones:
- Copiar secuencias de byte de una ubicación de memoria a otra.
- Comparar secuencias almacenadas en memoria.
- Buscar un valor en una secuencia.
- Inicializar zonas de memoria a un determinado valor.
Formato:
[prefijo] [función]
Operación:
Suele ser una acción repetitiva. Controlada por:
- ESI: Contiene la dirección inicial del bloque de datos fuente.
- EDI: Dirección inicial del bloque de datos destino.
- ECX: Contador. Especifica el número de veces que se ejecuta la
operación repetitiva.
- Bandera de dirección: bandera “D” (bit 10º) del registro EFLAGS.
Controla como varía si hacia delante o hacia atrás:
o D=0: ESI y EDI se incrementan después de cada operación
unitaria.
o D=1: ESI y EDI se decrementan después de cada operación
unitaria.
CLD : D ← 0
o Manipulación de D 
 STD : D ← 1
- EAX: asume diferentes funciones.
[prefijo]: Especifica la repetición.
REP
REPE
REPNE
[funcion]
50
Estructura y Tecnología de Computadores I
MOVS: mover
CMPS: comparar
SCAS: escanear
LODS: cargar en memoria
STOS: almacena desde memoria
B − 8 


Llevan el sufijo W − 16 para especificar el tamaño de la operación unitaria.
D − 32 


13.3. Instrucciones derivadas de MOVS
Copia un bloque de memoria sobre otro bloque.
REP MOVSB Copia byte a byte.
REP MOVSW Copia palabra a palabra.
REP MOVSD Copia de palabra doble a palabra doble.
Sólo se puede usar el prefijo REP o no usarlo, pero entonces lo operación
sólo se hace una vez.
13.4. Instrucciones derivadas de CMPS.
Compara dos cadenas, la que comienza en la posición indicada por ESI con
la que comienza en la posición indicada por EDI.
1º) Se resta el valor de la posición EDI y de la posición ESI.
2º) Se actualiza las banderas de resultado.
1
 
3º) ESI y EDI varían en 2 según indique el sufijo de CMPS sea
4
 
B 
 
W 
D 
 
REPE 
Si se coloca prefijo puede ser 
 . ECX debe tener la longitud de la
REPNE
cadena.
REPE la operación de comparación se repite mientras se detecte
igualdad entre los elementos comparados.
REPNE la operación de comparación se repite mientras se detecte
desigualdad entre los elementos comparados.
Las banderas se actualizan. Puede ser actualizado análogamente a la
instrucción CMP.
La utilidad principal es comparar cadenas de caracteres para su ordenación
alfabética.
EDI inicio de palabra1
ESI inicio de palabra2
REPE CMPSB
Si > palabra1 precede a palabra2
Si < palabra2 precede a palabra1
Si = Palabra1 = palabra2
Estructura y Tecnología de Computadores I
51
13.5. Instrucción derivadas de SCAS.
Sirve para identificar un elemento (B, W, D) dentro de una cadena.
La cadena sobre la que se busca está en EDI.
Funcionamiento:
SCASB: busca AL en [EDI] Contenido de la dirección que contiene EDI
SCASW: busca AX en [EDI]
SCASD: busca EAX en [EDI]
Se activa las banderas; si Z=1 igualdad.
REPE : se repite la comp mientras se detecta igualdad
Con repetición 
 REPNE : se repite la comp. mientras sea desigualda d
Se repite el número de veces que indique ECX.
13.6. Instrucciones derivadas de STOS.
Almacena en memoria el valor especificado en AL (STOSB), AX (STOSW),
EAX (STOSD) en la posición indicada por EDI. Luego se in/decrementa EDI
según la bandera ‘D’.
Puede ser repetitivo, sólo con REP y se repite tantas veces como se haya
especificado en ECX.
Sirve para iniciar una zona de memoria con un valor constante.
13.7. Instrucción derivada LODS.
AL → MOVSB

Copia el valor contenido [EDI] sobre AX → MOVSW e in/decrementa EDI
EAX → MOVSD

según ‘D’.
Se puede colocar REP.
52
Estructura y Tecnología de Computadores I
Tema 14º - Desarrollo de Aplicaciones.
Ejemplo 1º.
main()
{
int a, b, c;
a:= 27;
b:= 54;
c:= a+b;
b:= a;
printf (“suma = %d\n”,c);
}
bits 32
global main
extern exit
extern printf
section .text
main
mov dword [a], 27
mov dword [b], 54
mov EAX, [a]
add EAX, [b]
mov [c], EAX
mov [b], EAX
push dword, [c]
push dword cadena
call printf
add ESP, 8 {para dejar la pila
8=4*número_push_dword}
call exit
como
section .data
cadena ‘suma = %d’, 10, 0
section .bss
a resd 1 {reservo un espacio de palabra doble}
b resd 1
c resd 1
estaba
Estructura y Tecnología de Computadores I
Ejemplo 2º.
main()
{
int a, b, c;
a:= 27;
b:= 54;
c:= 32;
a:= (a+b)/c;
printf (“resultado = %d\n”,a);
}
bits 32
global main
extern exit
extern printf
section .text
main
mov dword [a], 27
mov dword [b], 54
mov dword [c], 32
mov EAX, [a]
add EAX, [b] {hace la suma EAXa+b}
cdq {extiende EAX de 32 a 64}
idiv dword [c]
mov [a], EAX
push dword [a]
push dword cadena
call printf
add ESP, 8
call exit
section .data
cadena db ‘resultado = %d’,10,0
section .bbs
a resd 1 {reservo un espacio de palabra doble}
b resd 1
c resd 1
53
Estructura y Tecnología de Computadores I
54
Ejemplo 3º.
float a,c; int b;
a:= -1’23e-3;
b:= 7;
c:=a×b; {debo multiplicar en punto flotante}
printf (“producto de a×b = %f \n”,c)
printf (“producto de a×b = %e \n”,c)
bits 32
global main
extern exit
extern printf
section .text
main
mov EAX, [dato]
mov [a], EAX
mov dword [b], 7
fld dword [a] {aquí
tengo el contenido de la
memoria en ST0}
fld dword [b] {después de esto tendré “b” en ST0 y
“a” en ST1}
fmul ST1 {en ST0 se queda a*b}
fstp dword [c]
fld [dword]
fstp qword [aux]
push dword [aux + 4]
push dword [aux]
push dword cadena1
call printf
add ESP, 12
push dword [aux + 4]
push dword [aux]
push dword cadena2
call printf
add ESP, 12
call exit
section .data
dato dd –1’23e-3
cadena1 db ‘Producto de a×b = %f”,10,0
cadena2 db ‘Producto de a×b = %e”,10,0
section .bbs
a resd 1
b resd 1
c resd 1
aux resq 1
Estructura y Tecnología de Computadores I
55
Ejemplo 4º.
main ()
{
int a; {aquí se dice que primero reserva espacio para
“a” que luego le doy el valor 0. si pusiera
a:=0 directamente ya lo habría inicializado en
la section data}
int i;
a:=0;
for (i=0;i<10;i++)
{
a:=a+1;
printf (“Contador = %d\n”,a)
}
}
bits 32
global main
extern exit
extern printf
section .text
main
mov dword [a], 0
mov dword [i],0
lazo
cmp dword [i],10
{compara 1 con 10}
jnb fin_lazo
{controla cada vuelta}
inc dword [a]
push dword [a]
push dword cadena
call printf
add ESP, 8
{incrementa el contador}
inc dword [i]
jmp lazo
{retorno al inicio}
fin_lazo
call exit
section .data
cadena db ‘Contador = %d’,10,0
{se pone db por
que se quiere almacenar un entero que
es “a” y es de 32 bits}
section .bbs
a resd 1
i resd 1
Otra forma de hacerlo.
bits 32
global main
extern exit
56
Estructura y Tecnología de Computadores I
extern printf
section .text
main
mov dword [a,], 0
mov ECX, 10
{atención a la
entre corchetes}
coma
que
lazo
inc dword [a]
push ECX
push dword [a]
push dword cadena
call printf
add ESP, 8
pop ECX
loop lazo
Ejemplo 5º.
int lista [20] = {2,3,5,8,1,27,...}
int r, i;
r:=1;
while (r==1)
{
r:=0
for (i=0; i<10;i++)
{
if (lista[i] > lista [i+1])
{
intercambiar (lista[i], lista[i+1]);
r:=1;
}
}
}
for (i=0; i<20; i++)
printf (“lista(%d) = %d \n)”,i, lista[i]);
bits 32
global main
extern exit
extern printf
section .text
main
mov dword [r], 1
lazo_while
cmp dword [r],1
jne fin_lazo_while
está
Estructura y Tecnología de Computadores I
57
mov dword [r],0
mov dword [i],0
lazo_for_1
cmp dword[i],10
jnb fin_lazo_for_1
lea EBX, [lista]
mov ECX, [i]
mov EAX, [EBX + 4×ECX] {direccionamiento indirecto}
mov EDX, [EBX + 4×ECX+4] {direccionamiento indirecto
base+indice+desplazamiento}
cmp EAX, EDX
jbe fin_if
xchg EAX, EDX
mov [EBX +4×ECX], EAX
mov [EBX + 4×ECX+4], EDX
mov dword [r], 1
fin_if
inc dword [i]
jmp lazo_for_1
fin_lazo_for_1
jmp lazo_while
fin_lazo_while
mov dword [i], 0
lea EBX, [lista]
lazo_for_2
cmp dword [i], 20
jnb fin_lazo_for_2
mov EAX, [i]
push dword [EBX + 4× EAX]
push EAX
push dword cadena
call printf
add ESP, 12
inc dword [i]
jmp lazo_for_2
fin_lazo_for_2
call exit
section .data
lista dd 2,3,5,8,1,27,...
cadena db ‘lista (%d)= %d’,10,0
section .bbs
r resd 1
i resd 1
Siempre que queramos recuperar una dirección lo haremos con “lea” y no con
etiquetas por que puede dar problemas. Cuando uno de los operando es un
registro se supone que el almacenarlo en memoria el tamaño que se pone es
el del registro y por eso no hace falta poner dword.
Sin embargo cuando tengo que almacenar un inmediato en memoria tengo
especificar el tamaño con el que lo quiero almacenar.
Estructura y Tecnología de Computadores I
Ejemplo 6º.
y=
5 .0 × X − 7 .0
X + 2 .5
bits 32
global main
extern exit
extern printf
extern scanf
extern atof
{cambia de ASCII a float}
section .text
main
push dword formato1
call printf
add ESP, 4
push dword cadena_leida
push dword formato_scanf
call scanf
add ESP, 8
push dword cadena_leida
call atof
add ESP, 4
fstp tword [x]
fld tword [x]
fmul qword [dato1]
fsub tword [dato2]
fld tword [x]
fado dword [dato3]
fdivr ST1
fstp tword [y]
push word [y+8]
push dword [y+4]
push dword [y]
push dword formato2
call printf
add ESP, 14
section .data
dato1 dq 5.0
dato2 dq 7.0
dato3 dd 2.5
formato1 db ‘Introduzca un número real:’,0
formato_scanf db ‘%s’,0
cadena_leida db ‘_ _ _ _ _ _ _ _ _ _’,0
formato2 db ‘Resultado % 20,7 Le’10,0
section .bbs
x rest 1
y rest 1
58
Descargar