Beruflich Dokumente
Kultur Dokumente
=============================================================================
1.1 Concepto de computador.
=============================================================================
-1-
=============================================================================
1.2 Niveles de estudio de un computador.
=============================================================================
=============================================================================
1.3 Concepto de arquitectura de computadores y de organizacin de computadores.
=============================================================================
-2-
=============================================================================
TEMA 2. Componentes y funcionamiento de un computador. La arquitectura IA-32.
=============================================================================
=============================================================================
2.1 La arquitectura Von Neumann.
=============================================================================
Un computador construido segn la arquitectura Von Neumann se caracteriza
porque:
a) Est integrado por tres elementos: la CPU, la memoria y el conjunto de
unidades de entrada/salida (E/S).
b) Los datos e instrucciones se almacenan en una memoria sobre la que se puede
leer y escribir.
c) Se accede a los contenidos de la memoria utilizando una direccin. Cada dato
se almacena en un lugar de la memoria que tiene asociado una direccin, y para
acceder al dato se suministra la direccin a la memoria, la cual a su vez
devuelve el dato.
d) Las instrucciones de un programa se ejecutan en un orden que coincide con la
secuencia de almacenamiento del programa dentro de la memoria.
=============================================================================
2.1.2 La CPU.
=============================================================================
La CPU est integrada por un conjunto de componentes lgicos que sirven para
almacenar datos y realizar operaciones aritmticas y lgicas con ellos.
-3-
=============================================================================
2.1.3 La memoria.
=============================================================================
En la memoria se almacena la secuencia de instrucciones o programa y los datos
que van a ser utilizados en la ejecucin de ese programa.
Su funcionalidad se resume as:
a) En ella se leen las instrucciones que constituyen el programa.
b) En ella se leen los datos necesarios para la ejecucin.
c) En ella se escriben los resultados de la ejecucin de las instrucciones de la
memoria.
Dentro de la memoria hay ubicaciones en las que se puede almacenar informacin.
Cada una de ellas tiene asignado un nombre o direccin. Para acceder a esa
ubicacin se suministra a la memoria esa direccin. Por ello a veces se dice
simplemente que "la CPU accede a la direccin".
=============================================================================
2.1.4 Las unidades de entrada/salida.
=============================================================================
Sirven para intercambiar datos entre los dispositivos externos y la memoria del
computador, o en ocasiones entre ellos y la CPU directamente. Ese intercambio
puede ser de entrada de datos hacia el computador o de salida de los mismos
hacia el exterior. A esos dispositivos externos se los denomina dispositivos
perifricos del computador o simplemente perifricos.
En general la CPU accede a los dispositivos de entrada/salida anlogamente a
como lo hace a la memoria: los dispositivos de entrada/salida tienen asociadas
unas ubicaciones especficas sobre las que la CPU puede leer o escribir. Cada
ubicacin tiene una direccin. El conjunto de todas ellas es el conjunto de
direcciones del sistema de entrada/salida de ese computador. As, la CPU puede
-4-
=============================================================================
2.2 La arquitectura Intel de 32 bits: IA-32.
=============================================================================
=============================================================================
2.2.1 Introduccin.
=============================================================================
=============================================================================
2.2.2 El bus del sistema.
=============================================================================
-5-
las que puede acceder), 2) internamente pone en marcha las acciones necesarias
para leer el dato y colocar dicho dato en el bus de datos, en una operacin de
lectura, o tomar el dato del bus de datos y almacenarlo en la ubicacin que
corresponda, en una operacin de escritura. El bus de direcciones tiene 32 bits
(salvo extensiones).
El bus de control est integrado por seales que
procesador con el resto del sistema. Entre estas
seales de lectura y escritura sobre la memoria,
lneas de interrupcin y las lneas de estado, y
El reloj del sistema es una seal elctrica alterna entre dos niveles lgicos.
Es la responsable de toda la sincronizacin dentro del computador; su
importancia deriva de que la CPU internamente es un complejo sistema lgico
sncrono. La frecuencia de esa seal alterna es lo que se denomina la frecuencia
de reloj del sistema. A un perodo completo de esa seal es a lo que se denomina
el ciclo de reloj del sistema. La ejecucin de cada instruccin mquina consume
varios ciclos de reloj (pueden ser menos de 10, decenas, centenas o incluso ms
de 1000 ciclos).
=============================================================================
2.2.3 El subsistema de memoria.
=============================================================================
La memoria es direccionable a nivel de byte: con una direccin de 32 bits
referenciamos una posicin de memoria en la que se almacena 1 byte.
La memoria es equivalente a una array de 4x2^30 posiciones, cada una capaz de
almacenar 1 byte, por tanto son 4 Gigabytes. (1 Gigabyte=2^30 bytes).
Para ejecutar "leer el contenido de la direccin X de memoria" cosa que
representamos simplemente como:
CPU <--- Memoria(X)
se siguen tres pasos:
1) La CPU coloca en el bus de direcciones la direccin X.
2) La CPU activa la lnea de lectura del bus de control.
3) La CPU lee el dato que aparece en el bus de datos, despus de haberlo
colocado en l la memoria.
Definiciones de trminos habitualmente utilizados en relacin a la memoria:
1)
2)
3)
4)
-6-
pequea que la memoria principal, para ser ms rpida que sta); a ello se le
denomina un fallo de la cach. Cuando hay un fallo de la cach, la informacin
que necesita el procesador hay que ir a buscarla a la memoria principal. Se
tarda mucho menos tiempo en leer o escribir algo en la cach que en hacerlo en
la memoria principal del sistema.
=============================================================================
2.2.4 El subsistema de entrada/salida.
=============================================================================
Funcionalmente es anlogo al subsistema de memoria. Se direccionan sus
posiciones a travs del bus de direcciones. Utiliza direcciones de un ancho de
16 bits, lo que permite un total de 65536 direcciones de entrada/salida.
=============================================================================
2.3 Caractersticas de la CPU en IA-32.
=============================================================================
Comentamos a continuacin los elementos ms representativos de la CPU.
=============================================================================
2.3.1. Los registros de la CPU.
=============================================================================
Los registros son lugares de almacenamiento de informacin que estn dentro de
la CPU.
De ellos se toman datos para las operaciones aritmticas y lgicas de la CPU, y
sobre ellos se escriben los resultados. En ocasiones, algunos datos de esas
operaciones la CPU los toma directamente de la memoria, o deposita directamente
en la memoria los resultados.
Los principales registros de la CPU en IA-32 son:
1) El conjunto de registros de propsito general. Son registros de 32 bits de
ancho. Sirven para almacenar datos temporalmente. Los principales son: registro
EAX o registro acumulador, EBX o registro de direccin base, ECX o registro
contador y EDX o registro de datos.
2) El registro de puntero de instruccin. Es un registro de 32 bits. Contiene la
direccin de la memoria a partir de la que est almacenada la siguiente
instruccin a ejecutar.
3) El registro de banderas ("flags"). Es un registro de 32 bits. Sus bits
informan sobre el estado de funcionamiento del procesador o sobre el resultado
de ciertas operaciones.
=============================================================================
2.3.2 La unidad aritmtico-lgica (ALU).
=============================================================================
Es la parte de la CPU en la que tienen lugar la mayora de las operaciones
ejecutadas por ella.
Por ejemplo, para realizar lo siguiente:
"sumar 5 al contenido del registro EAX"
La CPU hara:
1) Copiar el valor del registro EAX en una entrada de la ALU.
2) Enviar el valor 5 a otra entrada de la ALU.
3) Ordenar a la ALU que sume los valores que tiene depositados en sus entradas.
-7-
=============================================================================
2.4 Organizacin fsica de la memoria en IA-32.
=============================================================================
Consideraremos siempre un espacio de memoria de 4 Gigabytes.
-8-
Hay otros registros de 32 bits, que a su vez contienen registros de 16 bits, que
son los siguientes:
-9-
ESI: bits 0 al 31 (todos los bits del registro). SI, bits 0 al 15. Se denomina
registro ndice de fuente.
EDI: bits 0 al 31 (todos los bits del registro). DI, bits 0 al 15. Se denomina
registro ndice de destino.
EBP: bits 0 al 31 (todos los bits del registro). BP, bits 0 al 15. Se denomina
registro puntero de base.
ESP: bits 0 al 31 (todos los bits del registro). SP, bits 0 al 15. Se denomina
registro de puntero de pila.
EFLAGS: bits 0 al 31 (todos los bits del registro). FLAGS, bits 0 al 15. Se
denomina registro de banderas o de estado.
Adems hay otros registros de 16 bits, que no vamos a utilizar en este curso, y
que se denominan CS, DS, ES, FS, GS y SS. Se les denomina registros de segmento.
Finalmente est el registro de 32 bits EIP, al que se denomina registro de
puntero de instruccin. En dicho registro se almacena la direccin de la
siguiente instruccin a ejecutar. Va variando (aumentando o disminuyendo)
durante la ejecucin del programa, para estar apuntando siempre a la direccin
que en cada momento corresponda.
=============================================================================
2.6 El juego de instrucciones en IA-32.
=============================================================================
Podemos clasificar las principales instrucciones de IA-32 dentro de los
siguientes grupos:
1) De movimiento de datos.
2) De conversin de datos.
3) Aritmticas.
4) Lgicas y de manipulacin de datos a nivel de bit.
5) De control de flujo de los programas (saltos, llamadas a subrutinas e
interrupciones).
6) De entrada/salida.
7) De manipulacin de cadenas de caracteres o de bloques de memoria.
8) De aritmtica de punto flotante.
9) MMX (extensiones para gestin de multimedia).
10) SSE (extensiones para computacin tipo SIMD)
En el resto de la asignatura estudiaremos la funcionalidad de la mayor parte de
los grupos de instrucciones mencionados.
- 10 -
- 11 -
=============================================================================
TEMA 3. Instrucciones de movimiento de datos.
=============================================================================
=============================================================================
3.1 Introduccin.
=============================================================================
Son instrucciones que mueven informacin entre diversos lugares de
almacenamiento.
Los lugares de almacenamiento involucrados pueden ser: registros, posiciones de
la memoria, la pila (que es una zona de la memoria que soporta un tipo de
manipulacin especial).
En general, a lo largo de la asignatura vamos a utilizar la siguiente notacin:
1) Para referirnos a registros:
- Con "reg" nos referiremos a cualquiera de los registros de propsito general,
de cualquier tamao.
- Con "reg8", "reg16" o "reg32" nos referiremos respectivamente a registros de
8, 16 o 32 bits.
- 12 -
=============================================================================
3.2 Instrucciones de copia de datos entre lugares de almacenamiento.
=============================================================================
Tienen el mnemnico comn MOV.
Funcin: "mov destino, fuente" hace que se copie el contenido de fuente en
destino, sin que se modifique el contenido de fuente.
Utilizacin:
1)
2)
3)
4)
5)
mov
mov
mov
mov
mov
reg,
mem,
reg,
mem,
reg,
reg
reg
mem
dato inmediato
dato inmediato
mem y reg pueden ser ambos de 8, 16 y 32 bits. Ambos deben tener el mismo
tamao.
mov no permite copiar directamente de una ubicacin de memoria hacia otra. Para
llevar algo de una posicin de memoria hacia otra es necesario hacer una copia
intermedia de los datos en un registro.
Los "datos inmediatos" son valores que estn incluidos dentro de la propia
instruccin. Por ejemplo "mov al,5" indica cargar el valor 5 en al, y ese 5 se
expresa dentro de la instruccin. Los datos inmediatos pueden ser nmeros o
cadenas de caracteres. El ensamblador que utilizaremos en la asignatura soporta
los siguientes formatos para la codificacin de los datos inmediatos:
- 13 -
=============================================================================
3.4 Obtencin de direcciones efectivas de la memoria.
=============================================================================
Instruccin: LEA
Sirve para cargar un registro de propsito general con la direccin efectiva de
una posicin de memoria.
Utilizacin:
1) lea reg16, mem : copia en reg16 los 16 bits ms bajos de la direccin de
memoria etiquetada como mem (esto es, no de lo almacenado en la memoria, sino
los 16 bits ms bajos de los 32 bits que expresan esa direccin).
2) lea reg32, mem
memoria mem.
En los dos casos anteriores, mem puede ser, por ejemplo, una etiqueta.
=============================================================================
3.5 Instrucciones de manejo de la pila.
=============================================================================
En IA-32 la pila es una zona de la memoria sobre la que se construye una pila
LIFO. Cuando se copian datos en la pila, la pila "crece hacia abajo" en la
memoria, esto es, el ltimo byte cargado se carga siempre en una direccin de
memoria que se obtiene restando 1 a la direccin de memoria en la que se carg
- 14 -
POP
- 15 -
- 16 -
- 17 -
=============================================================================
TEMA 4. INSTRUCCIONES DE CONVERSIN DE DATOS.
=============================================================================
=============================================================================
4.1 Instrucciones de extensin de la representacin con y sin signo.
=============================================================================
En IA-32 se pueden representar nmeros con signo. Para ello se utiliza la
representacin en complemento a 2.
Caractersticas de la representacin en complemento a 2:
- Consideremos que los nmeros son codificados utilizando n bits.
- Si el bit ms significativo es 0, se trata de un nmero positivo. Si es 1, se
trata de un nmero negativo.
- La representacin de un nmero positivo se obtiene representando ese nmero
ocupando (n-1) bits y colocando un cero a la izquierda de ese grupo de n-1 bits.
- Para representar un nmero negativo con n bits en complemento a 2 se hace lo
siguiente:
1)
2)
en n
3)
4)
- 18 -
Nota: cuando se expresa un nmero en complemento a 2 hay que tener muy presente
el nmero de bits utilizados para su representacin. Por ejemplo, -17 en 8 bits
sera (expresado en hexadecimal y complemento a 2) 0xef, mientras que en 16 bits
sera 0xffef.
La finalidad de las instrucciones de extensin es convertir representaciones de
nmeros de 8 a 16 bits, de 8 a 32 bits o de 16 a 32 bits para nmeros
representados con signo o sin signo. En general la extensin de la
representacin de un nmero sin signo simplemente se obtiene rellenando con 0
los bits de mayor orden del nuevo formato. Y la extensin de la representacin
de un nmero con signo se llevar a cabo de acuerdo con las reglas de la
representacin en complemento a 2.
Las instrucciones de extensin sin signo se construyen como MOVZX destino,
fuente. Su funcionalidad es copiar en destino el valor almacenado en fuente con
la extensin correspondiente al tamao destino.
Anlogamente, las instrucciones de extensin con signo se construyen como MOVSX
destino, fuente. Su funcionalidad es anloga.
Las instrucciones MOVSX se utilizan as:
movsx
movsx
movsx
movsx
movsx
movsx
reg16,
reg16,
reg32,
reg32,
reg32,
reg32,
mem8
reg8
mem8
reg8
mem16
reg16
=============================================================================
4.2 Conversin "little endian" / "big endian".
=============================================================================
Para almacenar el contenido de registros, palabras o palabras dobles en la
memoria hay dos posibles convenciones que se denominan "little endian" y "big
endian". Unas arquitecturas siguen una convencin, y otras la otra.
- Convencin "little endian": en un conjunto de bytes que representan algo, el
byte menos significativo aparece almacenado en la posicin de memoria ms baja.
Por ejemplo, al almacenar el contenido del registro eax en la memoria a partir
de la direccin X, los bits eax(0-7) se almacenaran en X, los eax(8-15) en X+1,
los eax(16-23) en X+2 y los eax(24-31) en X+3.
- Convencin "big endian": en un conjunto de bytes que representan algo, el byte
de menor orden aparece en la direccin de memoria ms alta. Por ejemplo, si se
desea almacenar la palabra doble 0x11223344 a partir de la direccin de memoria
Y, en la memoria encontraramos 0x11 en Y, 0x22 en Y+1, 0x33 en Y+2, y 0x44 en
Y+3.
- 19 -
La instruccin BSWAP sirve para realizar los cambios necesarios para pasar de
valores almacenados segn la convencin "little endian" a "big endian" y
viceversa.
Utilizacin: bswap reg32.
Funcionalidad: intercambia el contenido del byte 0 de reg32 con el del byte 3, y
el del byte 1 con el del byte 2.
El inters de este concepto y esta instruccin es que IA-32 (y en general, los
procesadores de Intel) utiliza convencin little-endian (lo mismo que otras
arquitecturas), pero hay otras que utilizan convencin big-endian (por ejemplo,
procesadores de Motorola). Cuando hay que intercambiar datos almacenados en
memoria entre computadores con diferente convencin, hay que realizar cuidadosas
transformaciones de los datos utilizando bswap.
- 20 -
=============================================================================
- 21 -
0
2
4
6
7
11
- 22 -
=============================================================================
5.2 Suma.
=============================================================================
=============================================================================
5.2.1 Instrucciones ADD y ADC.
=============================================================================
Formato:
add destino, fuente
adc destino, fuente
Ambos operandos (destino y fuente) deben ser del mismo tamao.
Operacin:
add:
adc:
reg,
reg,
mem,
reg,
mem,
reg
mem
reg
dato inmediato
dato inmediato
=============================================================================
5.2.2 Instruccin INC.
=============================================================================
Suma uno a su operando.
Formato: inc operando
Utilizacin:
inc reg
inc mem
Afecta a las banderas de estado igual que add operando,1 excepto a la bandera C
(bit de acarreo) a la que no afecta.
=============================================================================
5.2.3 Instruccin XADD.
=============================================================================
Instruccin de intercambio y suma.
- 23 -
=============================================================================
5.3 Instrucciones de sustraccin.
=============================================================================
=============================================================================
5.3.1 Instrucciones SUB y SBB.
=============================================================================
1) Instruccin SUB:
Formato: sub destino, fuente.
Ambos operando pueden ser reg o mem, pero no mem los dos a la vez, y deben ser
del mismo tamao.
Funcin:
Utilizacin:
sub
sub
sub
sub
sub
reg,
reg,
mem,
reg,
mem,
reg
mem
reg
dato inmediato
dato inmediato
2) Instruccin SBB:
Formato: sbb destino, fuente
Funcin: destino <-- destino - fuente - C
Todo lo dems anlogo a SUB.
=============================================================================
5.3.2 Instruccin DEC.
=============================================================================
Resta 1 a su operando.
Formato: dec operando
Utilizacin:
dec reg
dec mem
Afecta a las banderas igual que sub op,1 excepto a la bandera C (bandera de
acarreo), a la que no afecta.
- 24 -
=============================================================================
5.4 Instruccin de cambio de signo (NEG).
=============================================================================
Formato: neg operando
Cambia de signo lo almacenado en el operando, utilizando representacin en
complemento a 2.
Utilizacin:
neg reg
neg mem
Afecta a las banderas igual que sub (equivale a hacer operando <-- 0-operando).
=============================================================================
5.5 Comparacin de valores
=============================================================================
Para comparar valores enteros se utiliza la instruccin CMP. CMP es idntica a
SUB, pero no deja el resultado de la resta en ningn sitio; nicamente afecta al
contenido del registro EFLAGS. Su inters consiste en que estudiando el
contenido final de EFLAGS se puede deducir el resultado de la comparacin entre
los dos operandos (esto es, mayor que, menor que o igual).
Formato: cmp operando1, operando2
Funcin:
(ningn sitio) <-- operando1 - operando2, afectando a EFLAGS como SUB.
Utilizacin:
cmp
cmp
cmp
cmp
cmp
reg,
reg,
mem,
reg,
mem,
reg
mem
reg
inmediato
inmediato
La instruccin cmp nunca se utiliza aisladamente, sino como paso previo para
otra instruccin que tome una decisin basndose en el resultado de la
comparacin realizada por CMP. Esas instrucciones son las de puesta a 1
condicional y las de salto condicional (que comentaremos ms adelante).
=============================================================================
5.6 Instrucciones de multiplicacin de enteros.
=============================================================================
=============================================================================
5.6.1 Instruccin MUL.
=============================================================================
Instruccin de multiplicacin de nmeros enteros en representacin sin signo.
Formato: mul operando
- 25 -
Utilizacin:
mul reg
mul mem
(el operando reg o mem pueden ser de 8, 16 o 32 bits).
Funcin:
1) Operando de 8 bits:
ax <-- al * (operando de 8 bits)
2) Operando de 16 bits:
dx:ax <-- ax * (operando de 16 bits)
3) Operando de 32 bits:
edx:eax <-- eax * (operando de 32 bits)
En una operacin MUL nunca hay prdidas de informacin por desbordamiento.
Afecta al estado de las banderas de forma que no corresponde a la funcionalidad
de las mismas ("estropea" el estado de las banderas).
=============================================================================
5.6.2 Instruccin IMUL.
=============================================================================
reg,
reg,
reg,
reg,
reg,
reg, inmediato
mem, inmediato
inmediato
reg
mem
Esto es, adems de la operacin soportada por mul, imul soporta lo siguiente:
imul operando1, operando2, inmediato
imul operando1, inmediato
imul operando1, operando2
Funcionalidad, adems de la misma de mul:
1) imul operando1, operando2, inmediato:
operando1 <-- operando2 * inmediato
2) imul operando1, inmediato:
operando1 <-- operando1 * inmediato
3) imul operando1, operando2:
operando1 <-- operando1 * operando 2
- 26 -
- 27 -
- 28 -
=============================================================================
- 29 -
Funcionalidad:
and destino,fuente
or destino,fuente
xor destino,fuente
not destino
destino
destino
destino
destino
<-<-<-<--
Utilizacin:
and
and
and
and
and
(or
not
not
reg,reg
mem,reg
reg,mem
reg,inmediato
mem,inmediato
y xor lo mismo que and)
reg
mem
reg y mem deben ser los dos del mismo tamao, pero ste puede ser 8, 16 o 32
bits.
=============================================================================
6.2 Instrucciones de desplazamiento.
=============================================================================
- 30 -
reg,inmediato
mem,inmediato
reg,cl
mem,cl
reg,reg,inmediato
mem,reg,inmediato
reg,reg,cl
mem,reg,cl
=============================================================================
6.3 Instrucciones de rotacin
=============================================================================
Son las siguientes:
rcl:
rcr:
rol:
ror:
rotacin
rotacin
rotacin
rotacin
a
a
a
a
la
la
la
la
- 31 -
Formato general:
instruccin destino,contador
(donde instruccin puede ser rcl, rcr, rol, ror).
Funcionalidad: todas ellas generan una rotacin de tantos pasos como exprese el
contador.
a) rcl: se puede modelar como si la bandera C se hubiera "pegado" a la izquierda
del operando destino y se hace rotar esa estructura tantos bits hacia la
izquierda como exprese el contador.
b) rcr: se puede modelar como si la bandera C se hubiera "pegado" a la derecha
del operando destino y se hace rotar esa estructura tantos bits hacia la derecha
como exprese el contador.
c) rol: se hace rotar el operando destino tantas veces hacia la izquierda como
exprese el contador. El ltimo bit que sale por la izquierda para volver a
entrar por la derecha queda copiado en la bandera C.
d) ror: se hace rotar el operando destino tantas veces hacia la derecha como
exprese el contador. El ltimo bit que sale por la derecha para volver a entrar
por la izquierda queda copiado en la bandera C.
Por tanto, la bandera C contiene el ltimo bit que "sale" del operando destino
debido a la rotacin (sale de ste para ir a C en rcl o rcr, o para volver a
entrar en destino por un extremo de ste).
Utilizacin:
rcl
rcl
rcl
rcl
reg,inmediato
mem,inmediato
reg,cl
mem,cl
reg,reg
reg,mem
mem,reg
reg,inmediato
mem,inmediato
- 32 -
b) Instruccin BT.
Formato: bt fuente,ndice
Copia en C el bit de posicin "ndice" del operando fuente.
Utilizacin:
bt
bt
bt
bt
reg,reg
mem,reg
reg,inmediato
mem,inmediato
c) Instruccin BTR.
Es anloga a BT y adems pone a 0 el bit de la posicin "ndice" del operando
fuente.
d) Instruccin BTC.
Es anloga a BT y adems invierte el bit de la posicin "ndice" del operando
fuente.
e) Instruccin BTS.
Es anloga a BT y adems pone a 1 el bit de la posicin "ndice" del operando
fuente.
f) Instruccin BSF.
Formato: bsf destino,fuente
Busca en el operando fuente el primer bit en 1, comenzando por el bit menos
significativo (el bit 0) y terminando por el bit ms significativo. Si encuentra
un bit en 1, pone la bandera Z en cero y almacena la posicin de ese bit (un
nmero entre 0 y 31) en el operando destino. Si no lo encuentra, pone Z en uno.
Utilizacin:
bsf reg,reg
bsf reg,mem
g) Instruccin BSR.
Es anloga a la instruccin BSF pero comenzando la bsqueda por el bit ms
significativo del operando fuente.
- 33 -
Formato general:
instruccin reg
instruccin mem
Clasificamos estas instrucciones segn la condicin que codifiquen. En concreto,
la condicin se puede apoyar sobre:
a) El contenido de las banderas de estado:
(se indica
setc setnc setz setnz sets setns seto setno setp setnp -
mayor que.
no mayor que.
mayor o igual que.
no mayor o igual que.
menor que.
no menor que.
menor o igual que.
no menor o igual que.
igual que.
no igual que.
- 34 -
=============================================================================
=============================================================================
7.1 Introduccin.
=============================================================================
Las instrucciones de salto sirven para continuar la ejecucin de un programa en
otra instruccin que no es la que est almacenada inmediatamente despus dentro
de la secuencia almacenada en memoria. Su funcin consiste, por lo tanto, en
modificar el registro de puntero hacia instruccin de una forma especial que
viene establecida por el destino del salto.
Las instrucciones de salto las clasificamos en tres grupos:
- la instruccin de salto incondicional,
- las instrucciones de salto condicional y
- las instrucciones de construccin de bucles.
=============================================================================
7.2 Instruccin de salto incondicional.
=============================================================================
Su formato es: jmp etiqueta
- 35 -
Hace que la ejecucin del cdigo contine en la posicin de memoria marcada como
"etiqueta". Para poder utilizarla, hay que marcar previamente con "etiqueta" la
posicin de destino del salto. Por esa razn se colocan etiquetas dentro del
cdigo del programa.
=============================================================================
7.3 Instrucciones de salto condicional.
=============================================================================
Su formato general es: instruccin etiqueta. La instruccin se escribe como
j[condicin], donde [condicin] son unos caracteres que codifican la condicin
que se debe cumplir para saltar (por ejemplo, nc para indicar que la condicin
es que C est en 0). Por ejemplo, si "sigue" es una etiqueta, una instruccin de
salto condicional podra escribirse as: jnz sigue.
Su funcin es que se contine ejecutando el cdigo en la posicin "etiqueta" si
se cumple la condicin, y si no se cumple la condicin se debe continuar en la
instruccin que sigue a j[condicin].
Se pueden considerar cuatro tipos de condiciones:
-
salta
salta
salta
salta
salta
salta
salta
salta
salta
salta
si
si
si
si
si
si
si
si
si
si
C=1.
C=0.
Z=1.
Z=0.
S=1.
S=0.
O=1.
O=0.
P=1.
P=0.
salta
salta
salta
salta
salta
salta
salta
salta
salta
salta
si
si
si
si
si
si
si
si
si
si
salta
salta
salta
salta
si
si
si
si
"mayor que".
"no mayor que".
"mayor o igual que".
"no mayor o igual que".
- 36 -
jl
jnl
jle
jnle
je
jne
salta
salta
salta
salta
salta
salta
si
si
si
si
si
si
"menor que".
"no menor que".
"menor o igual que".
"no menor o igual que".
"igual que".
"no igual que".
=============================================================================
7.4 Instrucciones de construccin de bucles.
=============================================================================
Sirven para establecer los saltos que permiten cerrar un bucle o grupo de
instrucciones que se ejecuta de manera repetitiva. Estos bucles utilizan el
registro ecx como "contador de vueltas".
Estas instrucciones son:
a) LOOP:
Formato: loop etiqueta
Funcin: en primer lugar decrementa ecx en una unidad (ecx <-- ecx-1), y despus
comprueba ecx; si ecx es distinto de cero salta a etiqueta, y si no contina en
la instruccin que venga a continuacin.
b) LOOPE (o su sinnimo LOOPZ)
Formato: loope etiqueta
Funcin: en primer lugar decrementa ecx en uno, y despus hace una comprobacin
de ecx y la bandera Z. Si ecx es distinto de cero y la bandera Z est en 1,
salta a etiqueta.
c) LOOPNE (o su sinnimo LOOPNZ)
Formato: loopne etiqueta
Funcin: en primer lugar decrementa ecx en uno, y despus hace una comprobacin
de ecx y la bandera Z. Si ecx es distinto de cero y la bandera Z est en 0,
salta a etiqueta.
- 37 -
=============================================================================
=============================================================================
8.1 Introduccin.
=============================================================================
Una subrutina es una determinada porcin de cdigo. Se entra en ella por medio
de un salto que se ejecuta en un punto del programa al que se denomina "llamada
de la subrutina". Cuando se termina su ejecucin se debe continuar ejecutando la
instruccin que viene inmediatamente despus de la de llamada de la subrutina.
El inicio de una subrutina estar marcado dentro del cdigo por medio de una
etiqueta.
Un criterio bsico: habitualmente el estado del procesador al terminar la
ejecucin de una subrutina debe ser el mismo que cuando se llam a esa
subrutina. Por ello, cuando se entra en una subrutina es preciso almacenar el
estado del procesador, con el fin de que al salir o retornar de ella el
procesador recupere ese mismo estado.
- 38 -
=============================================================================
8.2 Instruccin CALL.
=============================================================================
Sirve para continuar la ejecucin en el comienzo de una subrutina (por tanto,
para construir una llamada de subrutina).
Formato: call etiqueta, donde etiqueta es la etiqueta que marca el comienzo de
la subrutina.
Funcin:
1) Almacena en la pila la direccin de la instruccin que est en el cdigo
inmediatamente despus de esa instruccin call. Esa direccin es el punto de
retorno, al que debe irse en cuanto se termine la ejecucin de la subrutina. Por
tanto, para hacer eso introduce 4 bytes dentro de la pila. ESP disminuye en
cuatro unidades despus de haberse ejecutado call.
2) Salta a la posicin marcada con etiqueta.
=============================================================================
8.3 Instruccin RET.
=============================================================================
Es la instruccin que se coloca al final de una subrutina.
Formato: ret
Funcin:
1) Saca de la pila 4 bytes. Interpreta que esos 4 bytes integran la direccin
del punto de retorno que una anterior llamada call introdujo en la pila, en
concreto la llamada que motiv la entrada en esa subrutina.
2) Salta a la direccin de memoria que se construye con esos 4 bytes.
Observacin: Si la subrutina maneja inadecuadamente la pila (por ejemplo, mete
algo en la pila de manera que se termina sin haberlo sacado ni haber restaurado
ESP antes de llegar a ret), ret no sacar la direccin de retorno adecuada. El
retorno ser hacia una posicin errnea, y ello producir un fallo en la
ejecucin del programa.
- 39 -
=============================================================================
TEMA 9. OTRAS INSTRUCCIONES.
=============================================================================
=============================================================================
9.1 Instrucciones de manipulacin directa de las banderas de estado.
=============================================================================
=============================================================================
9.2 Instruccin NOP.
=============================================================================
=============================================================================
9.3 Instruccin RDTSC.
=============================================================================
- 40 -
=============================================================================
Teclado
Pantalla
Dispositivos de comunicaciones
Discos, y en concreto gestin de archivos, manejo de directorios, etc.
- 41 -
=============================================================================
10.2 Funciones de biblioteca del S.O. y su utilizacin.
=============================================================================
- 42 -
extern printf
section .text
push eax
push dword cadena
call printf
add esp, 8
cadena
section .data
db 'Resultado = %d',10,0
- 43 -
=============================================================================
- 44 -
=============================================================================
11.2 Direccionamiento indirecto.
=============================================================================
Para fijar ideas, en este apartado mencionaremos ejemplos con la instruccin
mov, pero anlogamente podra utilizarse todo lo que se comente aqu para
cualquier otra instruccin que acceda a alguna posicin de la memoria.
En una instruccin (por ejemplo, mov) se puede hacer referencia a una direccin
de memoria que:
1) Est cargada en un registro de 32 bits.
2) Se puede construir en base a operaciones aritmticas sobre nmeros
cargados en registros.
Hay cuatro maneras de realizar el direccionamiento indirecto:
a) Direccionamiento indirecto por registro:
Un registro de 32 bits contiene la direccin involucrada. Por ejemplo, si se
desea cargar los 32 bits que estn almacenados en la memoria a partir de la
posicin de memoria etiquetada como "a" podemos hacer lo siguiente:
lea ebx, [a]
mov eax, [ebx]
b) Direccionamiento indirecto indexado:
Se referencia una posicin de la memoria que se obtiene sumando un nmero (al
que se denomina desplazamiento) al contenido de un registro. El formato general
sera:
mov destino, [reg+desplazamiento]
donde desplazamiento es un nmero. Puede ponerse reg+desplazamiento o regdesplazamiento.
c) Direccionamiento indirecto con base ms ndice:
Se referencia a una posicin de la memoria que se obtiene en base a alguna de
las siguientes expresiones:
registro1+registro2
registro1+a*registro2 donde a puede ser 2, 4 u 8.
(Nota: no se puede poner registro1-registro2 ni registro1-a*registro2).
d) Direccionamiento indirecto con base, ndice y desplazamiento.
Se referencia una posicin por la suma del contenido de dos registros ms un
desplazamiento:
registro1+registro2+desplazamiento
registro1+a*registro2+desplazamiento (donde a puede ser 2, 4 u 8)
registro1+a*registro2-desplazamiento
- 45 -
=============================================================================
11.3 Saltos indirectos.
=============================================================================
2) Una direccin que ha sido almacenada en memoria como una palabra doble a
partir de una determinada posicin. Por ejemplo, supongamos que el destino del
salto es la posicin de memoria etiquetada como "destino"; para saltar all
puede hacerse lo siguiente:
lea eax, [destino] ; obtenemos en eax la direccin de la etiqueta
destino
mov [a], eax
jmp [a]
=============================================================================
11.4 Llamadas indirectas a subrutinas.
=============================================================================
Se construyen anlogamente a los saltos indirectos.
Se establece la direccin de comienzo de la subrutina en base al contenido de:
1) Un registro que contiene una direccin de 32 bits: call reg32. El contenido
de ese registro es la direccin de inicio de la subrutina.
2) Una posicin de memoria a partir de la que se han almacenado 4 bytes
consecutivos, con los cuales se construye la direccin de inicio de la
subrutina: call [mem32].
- 46 -
=============================================================================
=============================================================================
12.1 Introduccin.
=============================================================================
IA-32 tiene una serie de instrucciones para utilizar la unidad de punto flotante
o FPU. Esa unidad est dentro de la CPU y es una unidad aritmtica especializada
en realizar operaciones con nmeros representados en formato de punto flotante.
La FPU posee diversos registros internos, entre los que destacaremos los 8
registros de datos y el registro de estado.
- 47 -
=============================================================================
12.2 Tipos de datos manejados por la FPU.
=============================================================================
La FPU de IA-32 soporta tres formatos de representacin de nmeros en punto
flotante:
a) Formato de precisin simple:
- Son 32 bits.
- Bits 0 al 22: mantisa (23 bits). Es la mantisa del nmero expresado en
binario como 1.[mantisa].
- Bits 23 al 30: exponente (8 bits). Es el resultado de representar en
binario la suma del exponente ms 127.
- Bit 31: bit de signo. 0 si es positivo. 1 si es negativo.
- El nmero se obtiene as:
nmero=(signo)1.[mantisa]*2^(bits de exponente - 127)
- Rango: [ - 2^128 ... -2^(-127)]... 0 ...[2^(-127) ... 2^128].
- En la prctica, una precisin de unos 6 dgitos en base 10.
b) Formato de precisin doble:
- Son 64 bits.
- Anlogo a precisin simple, con un mayor nmero de bits.
- Bits 0 al 51: mantisa (52 bits).
- Bits 52 al 62: exponente (11 bits). Es el resultado de representar en
binario la suma del exponente ms 1023.
- Bit 63: signo.
- Rango: +/- 2^(+/- 1024).
- En la prctica, una precisin de unos 14 dgitos en base 10.
c) Formato de precisin extendida:
- Son 80 bits.
- Bits 0 al 63: mantisa (64 bits). Es la mantisa real del nmero.
- Bits 64 al 78: exponente (15 bits). Es el resultado de representar en
binario la suma del exponente ms 16383.
- Bit 79: signo.
- Rango: +/- 2 ^ (16384).
- En la prctica, una precisin de unos 19 dgitos en base 10.
Internamente la FPU siempre utiliza nmeros expresados en precisin extendida.
La IA-32 suministra instrucciones de punto flotante (FP) para manipular nmeros
representados en cualquiera de las 3 precisiones. Antes de realizar las
operaciones, la FPU convierte internamente los valores suministrados en nmeros
representados en precisin extendida.
=============================================================================
12.3 Los registros de la FPU.
=============================================================================
a) Los registros de datos.
Son ocho registros.
Cada uno tiene un tamao de 80 bits. Por tanto, cada uno puede almacenar un
nmero expresado en formato de precisin extendida.
No funcionan como los registros enteros de propsito general:
- 48 -
- Estn organizados como una pila LIFO (ltimo en entrar, primero en salir) a
la que se denomina la pila FPU.
- En ensamblador se les denomina como st0, st1, st2, ... st7.
- st0 hace referencia al valor que est en la cabeza de la pila.
- st7 hace referencia al valor que puede estar ms al fondo de la pila.
- Cuando se introduce un dato en la pila-FPU entra en st0, lo que hace que lo
que antes estaba almacenado en st0 se cargue en st1, y as sucesivamente. Cuando
se saca un dato de st0, lo que estaba en st1 sube a st0, lo de st2 a st1 y as
sucesivamente. Por ello se dice que estos registros estn organizados como una
pila LIFO.
=============================================================================
12.4 Instrucciones de movimiento de datos en la FPU.
=============================================================================
a) FLD
Carga en la pila FPU un nmero representado en formato de punto flotante que
puede estar almacenado en:
- La memoria, en formato de 32, 64 u 80 bits.
- Otro registro de la pila-FPU. En ese caso, lo que hace es reintroducir ese
valor en la pila-FPU.
Formato y utilizacin:
fld
fld
fld
fld
mem32
mem64
mem80
sti, donde i puede ser 0, 1, ... 7
b) FSTP
Saca el contenido de st0 y lo lleva hacia:
- La memoria, almacenndolo ocupando 32, 64 u 80 bits (segn el tipo de
representacin FP con el que se desee almacenar ese valor dentro de la memoria).
- Un registro de la pila FPU. En ese caso, copia st0 en el registro sti y
saca el valor de st0 de la pila, con lo que cada valor sti sube a st(i-1).
Formato y utilizacin:
fstp
fstp
fstp
fstp
mem32
mem64
mem80
sti, donde i puede ser 0, 1, ... 7
- 49 -
c) FST
Hace lo mismo que fstp pero sin sacar st0 de la pila.
A diferencia de fstp, slo puede almacenar valores en memoria ocupando 32 o 64
bits, pero no 80.
d) FXCH
Su formato es:
fxch sti , donde i puede ser 1, ... 7
Intercambia los contenidos de st0 y sti.
=============================================================================
12.5 Instrucciones de conversin de datos.
=============================================================================
Sirven para realizar conversiones de valores almacenados como enteros (en
representacin con signo en complemento a 2) a valores almacenados en formato de
punto flotante y viceversa.
a) FILD
Formato:
fild mem16
fild mem32
fild mem64
A partir de mem16, mem32 o mem64 se supone que hay un entero almacenado ocupando
16, 32 o 64 bits respectivamente. FILD lee ese nmero, lo convierte a
representacin de punto flotante extendida y lo introduce en st0.
b) FISTP
Formato:
fistp mem16
fistp mem32
fistp mem64
Saca el contenido de st0 y lo almacena en formato entero (haciendo redondeo de
la parte decimal si procede) de 16, 32 o 64 bits.
c) FIST
Hace lo mismo que fistp sin sacar el valor de st0. A diferencia de fistp slo
opera con representaciones en memoria de 16 o 32 bits para almacenar los enteros
(no 64 bits).
Nota: para especificar el tamao de la representacin en memoria se utilizan las
partculas word (16 bits), dword (32 bits) o qword (64 bits) delante de la
etiqueta que especifica el lugar de la memoria.
- 50 -
=============================================================================
12.6 Las instrucciones aritmticas.
=============================================================================
Sirven para llevar a cabo operaciones aritmticas entre nmeros almacenados en
formato de punto flotante.
=============================================================================
12.6.1 Suma FP.
=============================================================================
fadd mem32
fadd mem64
Suman el contenido de mem32 o mem64 a st0 y dejan el resultado en st0. mem no
puede ser algo almacenado en memoria en formato de punto flotante de precisin
extendida. Simplemente podemos expresarlo as:
fadd mem;
=============================================================================
12.6.2 Sustraccin FP.
=============================================================================
fsub mem;
fsub sti;
fsubr mem;
fsubr sti;
fsubrp sti;
- 51 -
=============================================================================
12.6.3 Multiplicacin FP.
=============================================================================
fmul mem;
fmul sti;
=============================================================================
12.6.4 Divisin en FP.
=============================================================================
fdiv mem;
fdiv sti;
fdivr sti;
sti
fdivp sti;
fdivrp sti;
=============================================================================
12.6.5 Otras instrucciones aritmticas FP.
=============================================================================
fsqrt;
fchs;
=============================================================================
12.7 Instrucciones de comparacin FP
=============================================================================
- 52 -
=============================================================================
12.8 Predefinicin de constantes
=============================================================================
Colocan en st0 ciertos valores tiles. Obsrvese que no hay ninguna instruccin
de FP que permita la introduccin de inmediatos.
fldz;
fld1;
fldpi;
fld2t;
fld2e;
fldg2;
fldln2;
=============================================================================
12.9 Funciones trigonomtricas y logartmicas.
=============================================================================
a) Funciones trigonomtricas:
fsin;
fcos;
fpatan;
Para utilizar fsin, fcos, fsincos y fptan st0 se supone que est expresado en
radianes y dentro del rango +/- 2^63. fpatan devuelve el resultado expresado en
radianes.
b) Funciones logartmicas:
fyl2x;
- 53 -
=============================================================================
12.10 Operaciones con operandos enteros.
=============================================================================
Realizan las mismas operaciones que sus homnimas cuyos mnemnicos no llevan la
"i", pero considerando que el operando est almacenado en memoria como un entero
de 16 o de 32 bits. Para ello primero convierten internamente (dentro de la FPU,
sin modificar lo almacenado en la memoria) el entero de 16 o 32 bits a
representacin de punto flotante de precisin extendida, y despus realizan la
operacin.
Estas instrucciones siempre utilizan st0 como operando destino.
Para todas ellas el formato de utilizacin es: instruccin mem, donde mem puede
ser mem16 o mem32. mem representa la posicin de la memoria (etiqueta) a partir
de la que est almacenado un entero en representacin de 16 o de 32 bits.
Estas instrucciones son:
a)
b)
c)
d)
Suma:
Sustraccin:
Multiplicacin:
Divisin:
fiadd
fisub,fisubr
fimul
fidiv, fidivr
=============================================================================
12.11 Otras instrucciones FP.
=============================================================================
- 54 -
=============================================================================
TEMA 13. MANIPULACIN DE CADENAS Y CONJUNTOS DE CARACTERES.
=============================================================================
=============================================================================
13.1 Introduccin.
=============================================================================
=============================================================================
13.2 Caractersticas generales de las instrucciones de manipulacin de cadenas.
=============================================================================
- 55 -
- 56 -
=============================================================================
13.3 Instruccin movs.
=============================================================================
Copian los valores de un bloque de memoria sobre otro bloque de memoria.
Formatos de utilizacin:
rep movsb;
rep movsw;
rep movsd;
=============================================================================
13.4 Instruccin cmps.
=============================================================================
Compara dos cadenas, la que comienza en la posicin de memoria indicada por el
registro ESI con la que comienza en la indicada por EDI.
En cada operacin unitaria hace lo siguiente:
1) Se compara el valor de la posicin ESI con el de la posicin EDI.
2) Se actualizan las banderas segn el resultado.
3) ESI y EDI se incrementan/decrementan en 1, 2 o 4 segn que el sufijo de cmps
sea b, w o d respectivamente.
Si se coloca prefijo, ste puede ser repe o repne, y en ese caso ecx debe
contener la longitud de las cadenas comparadas. El significado de los prefijos
es el siguiente:
- repe: la operacin de comparacin se repite mientras en la operacin
unitaria anterior se haya detectado igualdad entre los elementos comparados.
- repne: la operacin de comparacin se repite mientras no se detecte igualdad
en la operacin unitaria anterior.
Esta instruccin puede ser til para comparar cadenas con el fin de ordenarlas
alfabticamente.
=============================================================================
13.5 Instruccin scas.
=============================================================================
Sirve para identificar un determinado elemento (byte, palabra, palabra doble)
dentro de una cadena.
La cadena dentro de la que se busca est depositada en memoria a partir de la
direccin almacenada en EDI.
- 57 -
El funcionamiento es el siguiente:
a) scasb:
b) scasw:
c) scasd:
=============================================================================
13.6 Instruccin stos.
=============================================================================
=============================================================================
13.7 Instruccin lods.
=============================================================================
Copia el valor contenido en [edi] sobre al (si utilizamos lodsb), sobre ax (si
utilizamos lodsw) o sobre eax (si utilizamos lodsd) y va incrementando o
decrementando EDI segn establezca D y en el valor que corresponda segn la
partcula b, w o d.
- 58 -
=============================================================================
=============================================================================
14.1 Introduccin.
=============================================================================
En este tema vamos a estudiar algunos ejemplos de cmo podra expresarse en
ensamblador el contenido de programas desarrollados en C. Se trata de ver cmo
se podra traducir un lenguaje de alto nivel a algo que el computador pueda
ejecutar directamente.
Para poder hacer esto, en primer lugar debemos fijar el tamao de almacenamiento
de las variables que vamos a utilizar en C:
a) char: 8 bits (1 byte). Se supone que el valor almacenado en ella tiene
signo. Por tanto, sern valores comprendidos entre -127 y +127.
b) unsigned char: 8 bits (1 byte). Se supone que almacena un valor sin signo.
Por tanto, comprendido entre 0 y 255.
- 59 -
- 60 -
=============================================================================
14.2 Ejemplo 1.
=============================================================================
Cdigo en C:
main()
{
int a, b, c;
a=27;
b=541;
c=a+b;
b=a;
printf("Suma = %d\n",c);
}
Traduccin a ensamblador IA-32:
bits 32
global main
extern printf
extern exit
; ===============
;
; Encabezamiento
;
;
; ===============
section .text
main
main() {
a=27;
b=541;
; ===============
;
; c=a+b;
;
; ===============
; ===============
;
b=a;
;
; ===============
; ===============
;
; printf("Suma = %d\n",c);
;
;
; ===============
call exit
} fin main
section .data
cadena
db 'Suma = %d',10,0 ; cadena de formato de printf
section .bss
a
b
c
resd 1
resd 1
resd 1
; ===============
;
; int a,b,c;
;
; ===============
- 61 -
=============================================================================
14.3 Ejemplo 2.
=============================================================================
Cdigo en C:
main()
{
int a,b,c;
a=27;
b=541;
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
main() {
; a=27;
; c=32;
; =============
;
; a=(a+b)/c;
;
;
;
; =============
; =============
;
; printf("Resultado = %d\n",a);
;
;
; =============
call exit
} fin main()
section .data
cadena
a
b
c
section .bss
;
resd 1
;
resd 1
;
resd 1
;
;
==============
int a,b,c;
==============
- 62 -
=============================================================================
14.4 Ejemplo 3.
=============================================================================
Cdigo C:
main()
{
int a,i;
a=0;
for(i=0;i<10;i++)
{
a=a+1;
printf("Contador = %d\n",a);
}
}
bits 32
global main
extern printf
extern exit
; ===============
;
; Encabezamiento
;
;
; ===============
section .text
main
; main() {
mov dword [a], 0
; a=0;
; ===============
;
; for(i=0;i<10; -> (1)
;
;
; ===============
; { a=a+1;
; ===============
;
; printf("Contador = %d\n",a); }
;
;
; ===============
call exit
; ===============
;
; (1) -> i++)
;
; ===============
;
} fin main
section .data
- 63 -
cadena
db 'Contador = %d',10,0
section .bss
a
i
resd 1
resd 1
;
;
;
;
====================
int a,i;
====================
- 64 -
=============================================================================
14.5 Ejemplo 4.
=============================================================================
Cdigo en C:
main()
{
float a,c;
int b;
a=-1.23e-3;
b=7;
c=a*b;
printf(" Producto de a*b = %f\n",c);
printf(" Producto de a*b = %e\n",c);
}
bits 32
global main
extern exit
extern printf
; =============
;
; Encabezamiento
;
;
; =============
main
mov eax, [dato]
mov [a], eax
; main() {
; ===============
; a= -1.23e-3
;
; ===============
b=7;
; ===============
;
; c=a*b;
;
;
; ===============
; ===============
; c se pasa a prec. doble en aux
;
; printf("Producto de a*b
;
= %f\n",c);
;
;
;
;================
;================
push dword [aux+4] ;
push dword [aux]
; printf("Producto de a*b
push dword cadena2 ;
= %f\n",c);
call printf
;
add esp,12
;
;================
fld dword [c]
fstp qword [aux]
push dword [aux+4]
push dword [aux]
push dword cadena1
call printf
add esp,12
- 65 -
call exit
section .data
dato
cadena1
cadena2
dd -1.23e-3
; dato -1.23e-3
db ' Producto de a*b = %f',10,0 ; cadena de formato printf 1
db ' Producto de a*b = %e',10,0 ; cadena de formato printf 2
section .bss
a
b
c
aux
resd
resd
resd
resq
1
1
1
1
;
;
;
;
float a;
int b;
float c;
zona auxiliar para conversiones de datos FP
- 66 -
=============================================================================
14.6 Ejemplo 5.
=============================================================================
Cdigo en C:
main()
{
float a[20]={...}; array que contiene los 20 nmeros a promediar
float media; variable que almacena la media
int n; nmero de valores a promediar
int i;
media=0;
n=20;
for(i=0;i<n;i++) media=media+a[i];
media=media/n;
printf("Media = %f", media);
}
bits 32
global main
extern printf
extern exit
; ====================
;
;
Encabezamiento
;
;
; ====================
section .text
main
fldz
fstp dword [media]
mov dword [n], 20
mov dword [i], 0
for_i
mov eax, [n]
cmp [i], eax
jnl fin_for_i
;
;
;
;
;
;
;
;
;
;
;
;
;
main(){
===================
media=0;
===================
n=20;
===================
for(i=0;i<n; -> (1)
===================
; ===================
fld dword [media]
; { media=media+a[i]; }
lea eax, [a]
;
mov ebx, [i]
;
fadd dword [eax+4*ebx];
fstp dword [media]
;
; ===================
; ===================
;
; (1)-> i++) fin lazo for
;
- 67 -
; ===================
; ===================
; media=media/n;
;
;
; ===================
; ==================
;
; printf("Media = %f", media);
;
;
;
;
;
; ==================
call exit
; } fin main
section .data
a
dd
dd
dd
dd
; ================
; float a[20]={1.2, 3.45, ... };
;
;
; ================
section .bss
media
i
n
aux
resd
resd
resd
resq
1
1
1
1
;
;
;
;
float media;
int i;
int n;
espacio auxiliar para conversin variables FP
- 68 -
=============================================================================
14.7 Ejemplo 6.
=============================================================================
Cdigo en C:;
(Obtener la traspuesta de una matriz de enteros)
main()
{
int a[5][5]={...};
int b[5][5];
int i;
int j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
b[i][j]=a[j][i];
for(i=0;i<5;i++)
for(j=0;j<5;j++)
printf(" %d",b[i][j]);
}
bits 32
global main
extern exit
extern printf
; ================
;
; Encabezamiento
;
;
; ================
section .text
main
; main() {
; ================
;
; for(i=0;i<5; -> (1)
;
;
;
;
Nota: ubicacin
b+20*i+4*j =
Nota: ubicacin
a+20*j+4*i =
en memoria de
b + 4*(5*i+j)
en memoria de
a + 4*(5*j+i)
b[i][j]:
= b+desplaz.(b)
a[j][i]:
= a+desplaz.(a)
- 69 -
; ================
mov ebx, [i]
;
imul ebx, 5
;
add ebx, dword [j] ;
imul ebx, 4
; b[i][j]=a[j][i];
;
;
;
;
lea
mov
lea
mov
;
;
;
;
; ==================
eax, [a]
ecx, [eax+edx]
eax, [b]
[eax+ebx], ecx
; ==================
;
; (2) -> j++) fin lazo for_j
;
; ==================
; ==================
;
; (1) -> i++) fin lazo for_i
;
; ==================
; ==================
;
; for(i=0;i<5; -> (3)
;
;
; ==================
; ==================
;
; for(j=0;j<5; -> (4)
;
;
; ==================
; ===================
;
;
;
; printf("%d",b[i][j]);
;
;
;
;
;
;
; ==================
- 70 -
; =================
;
; (4) -> j++) fin for_j_printf
;
; =================
; =================
;
; (5) -> i++) fin for_i_printf
;
; =================
call exit
; } fin de main()
section .data
dd
dd
dd
dd
dd
1,2,3,4,5
6,7,8,9,10
11,12,13,14,15
16,17,18,19,20
21,22,23,24,25
; ================
;
; int a[5][5]={1,2,3,4,... };
;
;
;
; ================
resd 25
resd 1
resd 1
; int b[5][5];
; int i;
; int j;
- 71 -
=============================================================================
14.8 Ejemplo 7.
=============================================================================
Cdigo en C:
(Ordenar una lista de enteros de menor a mayor)
main()
{
int lista[20]={2,3,5,8,1,27,9,7,22,13,375,172,34,21,456,132,25,17,97,23};
int k;
int i;
int temp;
k=1;
while (k==1)
{
k=0;
for(i=0;i<19;i++)
{
if (lista[i]>lista[i+1])
{
temp=lista[i];
lista[i]=lista[i+1];
lista[i+1]=temp;
k=1;
}
}
}
for(i=0;i<20;i++) printf("lista(%d)=%d\n",i,lista[i]);
}
bits 32
global main
extern exit
extern printf
; ===============
;
; Encabezamiento
;
;
; ===============
section .text
main
main() {
lazo_while
cmp dword [k], 1
jne fin_lazo_while
k=1;
; ===============
;
; while(k==1) {
;
; ===============
;
k=0;
; ===============
;
- 72 -
lazo_for_1
cmp dword [i],19
jnl fin_lazo_for_1
inicio_if
lea
mov
mov
mov
cmp
jle
; for(i=0;i<19; ->(1)
;
;
; ===============
ebx, [lista]
ecx, [i]
eax, [ebx+4*ecx]
edx, [ebx+4*ecx+4]
eax, edx
fin_if
mov [temp],eax
mov [ebx+4*ecx],edx
mov [ebx+4*ecx+4],eax
; ================
;
;
; if(lista[i]>lista[i+1])
;
{
;
;
;
; ================
;
;
;
;
================
temp=lista[i];
lista[i]=lista[i+1];
lista[i+1]=temp;
; ================
mov dword [k], 1
;
;
;
;
;
;
;
;
;
fin_if
k=1;
fin del if
================
(1) -> i++) fin lazo for_1
================
jmp lazo_while
fin_lazo_while
; ================
;
} fin lazo while
;
; ================
; ================
; for(i=0;i<20; -> (2)
;
;
;
; ================
; ================
;
; (2)-> i++) fin lazo for_2
;
; ================
call exit
; ================
;
; printf("lista(%d)=%d\n",i,
;
lista[i]);
;
;
;
;
; ================
; }
fin de main()
- 73 -
section .data
lista
cadena
; =================
dd 2,3,5,8,1,27,9,7,22 ;
dd 13,375,172,34,21,456 ; int lista[20]={2,3,...};
dd 132,25,17,97,23
;
; =================
db 'lista(%d)=%d',10,0
section .bss
k
i
temp
resd 1
resd 1
resd 1
; int k;
; int i;
; int temp;
- 74 -
=============================================================================
14.9 Ejemplo 8.
=============================================================================
Cdigo en C:
main()
{
int a,b,c,d,e;
a=15;
b=128;
c=suma(a,b);
d=suma(b,c);
e=suma(d,d);
}
int suma(int x, int y)
{
return x+y;
}
bits 32
global main
extern exit
; ==============
;
; Encabezamiento
;
; ==============
section .text
main
; main() {
mov dword [a], 15
; a=15;
; b=128;
; ==============
;
; c=suma(a,b);
;
;
;
;
;
; ==============
; ==============
;
;
; d=suma(b,c);
;
;
;
;
; ==============
- 75 -
; ==============
;
;
; e=suma(d,d);
;
;
;
;
; ==============
call exit
; } fin de main
suma
pushad
pushfd
mov eax, [x]
add eax, [y]
mov [r_suma], eax
popfd
popad
ret
a
b
c
d
e
x
y
r_suma
; ==============
;
;
; int suma(int x, int y)
;
;
;
;
;
;
; ==============
section .bss
; ==============
resd 1
;
resd 1
; int a,b,c,d,e;
resd 1
;
resd 1
;
resd 1
;
; ==============
resd 1
resd 1
resd 1
;
;
;
;
;
==============
int x, argumento de suma
int y, argumento de suma
int suma, resultado de suma
==============
- 76 -
=============================================================================
14.10 Ejemplo 9.
=============================================================================
Cdigo en C:
main()
{
char cadena[20], salida[20];
int longitud, i;
for(i=0;i<20;i++)
{
cadena[i]=0;
salida[i]=0;
}
scanf("%s",cadena);
longitud=strlen(cadena);
for(i=0;i<longitud;i++) salida[i]=cadena[longitud-1-i];
printf(" %s",salida);
}
Nota: para escribir strlen(cadena) desarrolle strlen como una subrutina
que recibe la direccin inicial de almacenamiento de 'cadena' a travs
de una palabra doble almacenada a partir de la posicin de memoria
etiquetada como 'entrada' y que devuelve la longitud de la cadena como
un valor entero de 32 bits almacenado a partir de 'resultado'
bits 32
global main
extern exit
extern scanf
extern printf
; ===============
;
; Encabezamiento
;
;
;
; ===============
section .text
main
; main() {
; ==============
;
; for(i=0;i<20; ->(1)
cmp dword [i], 20 ;
jnl fin_for_1
;
; ==============
mov dword [i],0
for_1
; =============
;
; cadena[i]=0;
;
; =============
; =============
;
; salida[i]=0;
;
; =============
; ================
- 77 -
;
; (1)-> i++) fin for_1
;
; ================
; =================
;
; scanf("%s",cadena);
;
;
; =================
; =================
;
;
; longitud=strlen(cadena);
;
;
; ==================
; ==================
;
;
; salida[i] =
; cadena[longitud-i-1];
;
;
;
;
;
;
; ==================
; ==================
;
; (2)-> i++) fin for_2
;
; ==================
call exit
; ==================
;
; for(i=0;i<longitud; (2) ->
;
;
;
; ==================
; ==================
;
; printf(" %s",salida);
;
;
; ==================
; } fin de main
- 78 -
strlen
lazo
pushad
pushfd
mov ecx, -1
mov ebx, [entrada]
inc ecx
cmp dword [ebx+ecx],0
jne lazo
mov [resultado], ecx
popfd
popad
ret
; ==================
;
;
;
; funcin strlen
;
;
;
;
;
;
;
;
; ===================
section .data
formato1 db '%s',0
formato2 db ' %s',0
section .bss
cadena resb 20
salida resb 20
longitud resd 1
i
resd 1
;
;
;
;
char cadena[20];
char salida[20];
int longitud;
int i;
entrada resd 1
resultado resd 1
; ================
; argumento de entrada de strlen
; salida de strlen
; ================
- 79 -
=============================================================================
14.11 Ejemplo 10.
=============================================================================
Cdigo en C:
main()
{
float hip, alfa, catop, catcon;
hip=187.95;
alfa=0.6477;
catop=hip*sin(alfa);
catcon=hip*cos(alfa);
printf("Hipotenusa=%f alfa=%f cat.opuesto=%f
cat.contiguo=%f\n",hip,alfa,catop,catcon);
}
bits 32
global main
extern printf
extern exit
; ===============
;
; Encabezamiento
;
;
; ===============
section .text
main
; main() {
; ==============
;
; hip=187.95;
; ==============
; ==============
;
; alfa=0.6477;
; ==============
; ==============
fld dword [hip]
;
fld dword [alfa] ;
fsin
; catop=hip*sin(alfa)
fmul st1
;
fstp dword [catop];
; ==============
; ==============
;
; catcon=hip*cos(alfa)
;
;
; ==============
- 80 -
; ==================
;
;
;
;
;
; printf("Hipotenusa=%f alfa=%f
;
cat.opuesto=%f cat.contiguo=%f\n",
;
hip,alfa,catop,catcon);
;
push dword [aux_catcon+4];
push dword [aux_catcon] ;
push dword [aux_catop+4] ;
push dword [aux_catop]
;
push dword [aux_alfa+4] ;
push dword [aux_alfa]
;
push dword [aux_hip+4]
;
push dword [aux_hip]
;
push dword formato_printf;
call printf
;
add esp, 36
;
; =================
fld dword [hip]
fstp qword [aux_hip]
fld dword [alfa]
fstp qword [aux_alfa]
fld dword [catop]
fstp qword [aux_catop]
fld dword [catcon]
fstp qword [aux_catcon]
dato1
dato2
call exit
} fin de main
section .data
dd 187.95
dd 0.6477
; dato 187.95
; dato 0.6477
; ===============
formato_printf db 'Hipotenusa=%f alfa=%f '
; formato de printf
db 'cat.opuesto=%f cat.contiguo=%f',10,0 ;
; ===============
section .bss
alfa
hip
catop
catcon
resd
resd
resd
resd
1
1
1
1
; ===============
;
; float hip,alfa,catop,catcon;
;
;
; ===============
aux_alfa resq 1
aux_hip resq 1
aux_catcon resq 1
aux_catop resq 1
;
;
;
;
;
;
================
zonas auxiliares de almacenamiento
para las conversiones de formatos de FP
================
- 81 -