CONCEPTOS DIGITALES II
Enviado por chivitadekratos • 1 de Febrero de 2015 • 9.076 Palabras (37 Páginas) • 125 Visitas
SALTOS
Una instrucción de salto produce un cambio en la ejecución del programa pasando a una nueva posición, no secuencial. La dirección del salto se representa con una etiqueta.
Hay más de 30 instrucciones de salto, vamos a nombrar las más usadas:
Instrucción Descripción
jmp etiqueta Salto incondicional directo
je etiqueta Salto por igual
jne etiqueta Salto por no igual
jg etiqueta Salto por mayor
jng etiqueta Salto por no mayor
jge etiqueta Salto por mayor igual
jnge etiqueta Salto por no mayor igual
jl etiqueta Salto por menor
jnl etiqueta Salto por no menor
jle etiqueta Salto por menor igual
jnle etiqueta Salto por no menor igual
js etiqueta Salto negativo
Ejemplo de salto incondicional directo:
addl %eax, %ebx
jmp etiq1 # salto incondicional a etiq1
subl %edx, %ebx
etiq1: addl %edx, %ebx
En este caso la tercera instrucción no se ejecuta ya que al ejecutarse el salto el programa pasa a ejecutar la instrucción 4.
Las otras instrucciones de salto son condicionales lo cual significa que la máquina revisa los códigos de condición antes de realizar el salto, si la condición se cumple realiza el salto a la etiqueta especificada, si la condición no se cumple continúa la ejecución de manera secuencial.
Ejemplo de salto condicional:
movl valor1, %eax # %eax=valor1
movl valor2, %ebx # %ebx=valor2
cmpl %ebx, %eax # compara valor1 con valor2
jl menor # si valor1 < valor2 salta a etiq1
subl $5,%eax # si valor1 >= valor2 resta 5 a %eax
jmp fin # salta a fin
menor: addl $5,%eax # si valor1 < valor2 suma 5 a %eax
fin:
En el ejemplo anterior que si se cumple la condición de comparación valor1 < valor2 el programa salta a la instrucciónmenor: addl $5,%eax sin pasar por las instrucciones subl $5,%eax y jmp fin. En caso de no cumplirse la condición, es decir valor1 >= valor2, entonces continúa la ejecución en la instrucción siguiente, en este caso, la instrucción subl $5,%eax. Es importante destacar la necesidad de introducir la instrucción jmp fin, un salto incondicional a la etiqueta fin ya que de no estar presente la máquina seguiría el orden secuencial y luego de realizar la resta ejecutaría la suma lo cual arrojaría un resultado erróneo. En este programa sólo se ejecuta una de las dos operaciones aritméticas, la resta en caso de cumplirse la condición o la suma en caso de que no se cumpla.
PILA
La pila es un área de memoria que crece desde una dirección inicial hacia direcciones menores. El último elemento colocado en la pila es el que está disponible para ser retirado.
Las instrucciones para el manejo de la pila son dos, una para apilar un operando fuente y una para desapilar el valor que está en el tope de la pila y colocarlo en un operando destino.
push (apilar)
Instrucción Efecto Descripción
pushw Fuente R[%esp] ← R[%esp]-2 y M[R[%esp]] ← Fuente Actualiza el apuntador %esp y luego coloca Fuente en el tope de la pila (2 bytes)
pushl Fuente R[%esp] ← R[%esp]-4 y M[R[%esp]] ← Fuente Actualiza el apuntador %esp y luego coloca Fuente en el tope de la pila (4 bytes)
Operandos válidos Ejemplo
inmediato pushw $7
registro pushl %eax
memoria pushl etiqueta
pop (desapilar)
Instrucción Efecto Descripción
popw Destino Destino ← M[R[%esp]] y R[%esp] ← R[%esp]+2 Lee el valor del tope de la pila, lo guarda en Destino y luego actualiza %esp (dato de 2 bytes)
ppol Destino Destino ← M[R[%esp]] y R[%esp] ← R[%esp]+4 Lee el valor del tope de la pila, lo guarda en Destino y luego actualiza %esp (dato de 4 bytes)
Ejemplo de uso de las instrucciones pushl y popl
Dados los valores iniciales %esp=0x108 %eax=15 %ebx=43 %ecx=28, la dirección expresada en hexadecimal y los contenidos de los registros en decimal, al ejecutarse las instrucciones:
pushl %eax
pushl %ebx
popl %eav
pushl %ecx
popl %ebx
popl %ecx
Ocurre lo siguiente en la pila:
pushl %eax
%esp Dirección Contenido
→ 0x104 15
0x108
Al apilar el contenido de %eax se decrementa %esp en 4 bytes y se coloca el valor contenido en %eax en la pila, en este caso 15.
pushl %ebx
%esp Dirección Contenido
→ 0x100 43
0x104 15
0x108
Al apilar %ebx, se decrementa %esp otros 4 bytes y se coloca el valor, 43 en la pila.
popl %eax
%esp Dirección Contenido
0x100 43
→ 0x104 15
0x108
Cuando se lee el contenido de la pila y se coloca el valor en %eax, la máquina lee el valor en el tope de la pila, en este caso 43 y lo actualiza en el registro %eax, por lo tanto %eax ahora tendrá 43 como contenido. Luego se suman 4 bytes al apuntador %esp.
pushl %ecx
%esp Dirección Contenido
→ 0x100 28
0x104 15
0x108
Al ejecutar de nuevo una instrucción de apilar, como en este caso apilar %ecx, se vuelve a decrementar %esp y se coloca el nuevo valor en el tope de la pila el cual es el número 28.
popl %ebx
%esp Dirección Contenido
0x100 28
→ 0x104 15
0x108
Con la nueva instrucción de desapilar se lee el tope de la pila, que contiene 28 y se actualiza el registro operando de la instrucción, en este caso %ebx; a partir de este momento %ebx tendrá el nuevo valor 28. Luego se incrementa %esp.
popl %ecx
%esp Dirección Contenido
0x100 28
0x104 15
→ 0x108
Con esta instrucción ocurre algo similar a la anterior, se lee el tope de la pila, el valor 15 y se actualiza en el registro operando, es decir %ecx, luego se suman 4 bytes a %esp y éste vuelve a la dirección inicial.
CONDICIONALES
La estructura condicional if ... else
En la gran mayoría de los programas será necesario tomar decisiones sobre qué acciones realizar. Esas decisiones pueden depender de los datos que introduzca el usuario, de si se ha producido algún error o de cualquier otra cosa.
La estructura condicional if ... else es la que nos permite tomar ese tipo de decisiones. Traducida literalmente del inglés, se la podría llamar la estructura "si...si no", es decir, "si se cumple la condición, haz esto, y si no, haz
...