Vous êtes sur la page 1sur 18

2.

5 Saltos

Las instrucciones de salto en el lenguaje Ensamblador se utilizan para transferir el flujo


del proceso a otro operador que se indique. Las instrucciones son las siguientes:
Instrucción JMP

Propósito: Salto incondicional

Sintaxis:

JMP destino

Esta instrucción se utiliza para desviar el flujo de un programa sin tomar en cuenta las
condiciones actuales de las banderas ni de los datos.

Instrucción JA (JNBE)

Propósito: Brinco condicional

Sintaxis:

JA Etiqueta

Después de una comparación este comando salta si está arriba o salta si no está
abajo o si no es igual.

Esto significa que el salto se realiza solo si la bandera CF esta desactivada o si la


bandera ZF esta desactivada (que alguna de las dos sea igual a cero).

Instrucción JAE (JNB)

Propósito: salto condicional

Sintaxis:

JAE etiqueta

Salta si está arriba o si es igual o salta si no está abajo.


El salto se efectua si CF esta desactivada.

Instrucción JB (JNAE)

Propósito: salto condicional

Sintaxis:

JB etiqueta

Salta si está abajo o salta si no está arriba o si no es igual.

Se efectúa el salto si CF esta activada.

Instrucción JBE (JNA)

Propósito: salto condicional

Sintaxis:

JBE etiqueta

Salta si está abajo o si es igual o salta si no está arriba.

El salto se efectúa si CF está activado o si ZF está activado (que cualquiera sea igual
a 1).

Instrucción JE (JZ)

Propósito: salto condicional

Sintaxis:

JE etiqueta

Salta si es igual o salta si es cero.

El salto se realiza si ZF está activada.


Instrucción JNE (JNZ)

Propósito: salto condicional

Sintaxis:

JNE etiqueta

Salta si no es igual o salta si no es cero.

El salto se efectua si ZF está desactivada.

Instrucción JG (JNLE)

Propósito: salto condicional, se toma en cuenta el signo.

Sintaxis:

JG etiqueta

Salta si es más grande o salta si no es menor o igual.

El salto ocurre si ZF = 0 u OF = SF.

Instrucción JGE (JNL)

Propósito: salto condicional, se toma en cuenta el signo.

Sintaxis:

JGE etiqueta

Salta si es más grande o igual o salta si no es menor que.

El salto se realiza si SF = OF

Instrucción JL (JNGE)
Propósito: salto condicional, se toma en cuenta el signo.

Sintaxis:

JL etiqueta

Salta si es menor que o salta si no es mayor o igual.

El salto se efectúa si SF es diferente a OF.

Instrucción JLE (JNG)

Propósito: salto condicional, se toma en cuenta el signo.

Sintaxis:

JLE etiqueta

Salta si es menor o igual o salta si no es más grande.

El salto se realiza si ZF = 1 o si SF es diferente a OF

Instrucción JC

Propósito: salto condicional, se toman en cuenta las banderas.

Sintaxis:

JC etiqueta

Salta si hay acarreo.

El salto se realiza si CF = 1

Instrucción JNC

Propósito: salto condicional, se toma en cuenta el estado de las banderas.


Sintaxis:

JNC etiqueta

Salta si no hay acarreo.

El salto se efectúa si CF = 0.

Instrucción JNO

Propósito: salto condicional, se toma en cuenta el estado de las banderas.

Sintaxis:

JNO etiqueta

Salta si no hay desbordamiento.

El salto se efectua si OF = 0.

Instrucción JNP (JPO)

Propósito: salto condicional, toma en cuenta el estado de las banderas.

Sintaxis:

JNP etiqueta

Salta si no hay paridad o salta si la paridad es non.

El salto ocurre si PF = 0.

Instrucción JNS

Propósito: salto condicional, toma en cuenta el estado de las banderas.

Sintaxis:
JNP etiqueta

Salta si el signo esta desactivado.

El salto se efectúa si SF = 0.

Instrucción JO

Propósito: salto condicional, toma en cuenta el estado de las banderas.

Sintaxis:

JO etiqueta

Salta si hay desbordamiento (overflow).

El salto se realiza si OF = 1.

Instrucción JP (JPE)

Propósito: salto condicional, toma en cuenta el estado de las banderas.

Sintaxis:

JP etiqueta

Salta si hay paridad o salta si la paridad es par.

El salto se efectúa si PF = 1.

Instrucción JS

Propósito: salto condicional, toma en cuenta el estado de las banderas.

Sintaxis:

JS etiqueta
Salta si el signo está prendido.

El salto se efectúa si SF = 1.

Saltos, ciclos y procedimientos


Los saltos incondicionales en un programa escrito en lenguaje ensamblador están dados por la
instrucción jmp, un salto es alterar el flujo de la ejecución de un programa enviando el control a
la dirección indicada.
Un ciclo, conocido también como iteración, es la repetición de un proceso un cierto número de
veces hasta que alguna condición se cumpla. En estos ciclos se utilizan los brincos
"condicionales" basados en el estado de las banderas. Por ejemplo la instrucción jnz que salta
solamente si el resultado de una operación es diferente de cero y la instrucción jz que salta si el
resultado de la operación es cero.
Por último tenemos los procedimientos o rutinas, que son una serie de pasos que se usarán
repetidamente en el programa y en lugar de escribir todo el conjunto de pasos unicamente se les
llama por medio de la instrucción call.
Un procedimiento en ensamblador es aquel que inicie con la palabra Proc y termine con la
palabra ret.
Realmente lo que sucede con el uso de la instrucción call es que se guarda en la pila el
registro IP y se carga la dirección del procedimiento en el mismo registro, conociendo que IP
contiene la localización de la siguiente instrucción que ejecutara la UCP, entonces podemos
darnos cuenta que se desvía el flujo del programa hacia la dirección especificada en este
registro. Al momento en que se llega a la palabra ret se saca de la pila el valor de IP con lo que
se devuelve el control al punto del programa donde se invocó al procedimiento.
Es posible llamar a un procedimiento que se encuentre ubicado en otro segmento, para ésto el
contenido de CS (que nos indica que segmento se está utilizando) es empujado también en la
pila.
http://lenguajes-interfaz-2013.blogspot.mx/2013/03/saltos-y-ciclos.html

2.6 Ciclos condicionales


https://www.youtube.com/watch?v=KmO_o262u20
El salto condicional.- Esto es hasta ahora lo mas parecido al IF que tiene el
Ensamblador. Cuando el CPU llega a un salto condicional revisa la condición
determinada por la instrucción y la compara con el estado del registro banderas. El
salto se efectúa solo si la condición se cumple. Esta lógica es inversa al IF tradicional
en que un grupo de instrucciones se ejecuta cuando la condición se cumple. Otra
desventaja aparente que tiene el salto condicional es qe es relativamente pequeño en
comparación con la instrucción JMP, pues apenas puede saltar unos cuantos cientos de
bytes y estos son relativos a la posición de la instrucción. Para hacer comparaciones
complejas se usa una combinación de saltos condicionales, largos y operaciones a nivel
de bits que trabajan con el registro banderas.

registro banderas.

SUBCODIGO MNEMONICO ESTADO DE BANDERAS


0000 O OF = 1
0001 NO OF = 0
0010 B, NAE CF = 1
0011 NB, AE CF = 0
0100 E, Z ZF = 1
0101 NE, NZ ZF = 0
0110 BE, NA (CF or ZF)= 1
0111 NBE, A (CF or ZF)= 0
1000 S SF = 1
1001 NS SF = 0
1010 P, PE PF = 1
1011 NP, PO PF = 0
1100 L, NGE (SF xor OF) = 1
1101 NL, GE (SF xor OF) = 0
1110 LE, NG ((SF xor OF) or ZF) = 1
1111 NLE, G ((SF xor OF) or ZF) = 0

En esta tabla vemos algunos de esos bits. Por ejemplo. El salto condicional se
escribe Jcc. Estas dos cc se sustituyen por letras que indican la condición. Dentro
del código máquina las instrucciones condicionales usan 4 bits para evaluar la
condición. Uno de esos bits es el ‘bit de negación’. 3 bits indican la condición y el
cuarto niega la condición determinada por esos 3 bits: En la tabla la primera
columna es el SubCode o Subcódigo Máquina Condicional, la segunda es el
subnemónico y la tercera indica el estado de las banderas.

Como me da mucha flojera ordenar los subnemónicos en orden alfabético y poner


su traducción al español. Voy a dejarle ahi y seguir con un par de consejos con
esto de las banderas y las instrucciones condicionales.

*Supongamos que restamos el contenido de EDX al acumulador EAX. No


nos importa el contenido de ninguno de los dos. Si el resultado de esta resta es
cero. La bandera ZERO de Eflags se va a activar, Si el resultado es negativo, se
activa la de signo SIGN. Si el resultado es divisible entre 2 se activa la bandera de
paridad (PF). Si el resultado no puede ser representado como entero con signo,
se activa Overflow y si se da el famoso Wrap-Around la de CARRY. Lo
interesante es que esto es un proceso automático llevado a cabo por el
CPU y no consume mas tiempo que el que toma realizar la propia resta.
Sin necesidad de que hagamos una comparación explícita.

*CMP y TEST.- Estas 2 instrucciones se usan para hacer comparaciones


explícitas entre 2 valores que pueden ser registros, celdas de memoria o
constantes. CMP es una resta ‘de mentiritas’ que no resta al operando destino
pero que actualiza las banderas como si lo hubiera hecho. TEST es exactamente
lo mismo pero en lugar de restar los operandos, hace un AND entre ellos.

Existen otros ‘trucos’ de viejos programadores de Ensamblador. Como usar OR


EAX, 0 para ver si hay un cero en el acumulador. En realidad es mas rápido hacer
TEST EAX, EAX. O si se trata de una celda de memoria, TEST [memoria], 0. Y
aunque hoy en día la mayoría de estas instrucciones pueden ejecutarse en un
ciclo de reloj, Existe algo llamado Paralelismo que permite que mas de una
instrucción se ejecute por ciclo de reloj en un procesador de Intel, pero eso es un
tema mas avanzado que veremos cuando realmente programemos algo serio.

Direcciones Corta, cercana y lejana


Una operación de salto alcanza una dirección corta por medio de un desplazamiento
de un byte, limitado a una distancia de -128 a 127 bytes. Una operación de salto
alcanza una dirección cercana por medio de un desplazamiento de una palabra,
limitado a una distancia de -32, 768 a 32, 767 bytes dentro del mismo segmento. Una
dirección lejana puede estar en otro segmento y es alcanzada por medio de una
dirección de segmento y un desplazamiento; CALL es la instrucción normal para este
propósito.
La tabla siguiente indica las reglas sobre distancias para la operaciones JMP, LOOP y
CALL. Hay poca necesidad de memorizar estas reglas, ya que el uso normal de estas
instrucciones en rara ocasión causa problemas.
Etiquetas de instrucciones
Las instrucciones JMP, Jnnn (salto condicional) y LOOP requieren un operando que se
refiere a la etiqueta de una instrucción. El ejemplo siguiente salta a A90, que es una
etiqueta dada a una instrucción MOV:
JMP A90
...
A90: MOV AH, 00
...

La etiqueta de una instrucción, tal como A90:, terminada con dos puntos (:) para darle
atributo de cercana - esto es, la etiqueta esta dentro de un procedimiento en el mismo
segmento de código.
Cuidado: Un error común es la omisión de los dos puntos. Note que una etiqueta de
dirección en un operando de instrucción (como JMP A90) no tiene un carácter de dos
puntos.
La instrucción JMP (Salto incondicional)
Una instrucción usada comúnmente para la transferencia de control es la instrucción
JMP (jump, salto, bifurcación). Un salto es incondicional, ya que la operación transfiere
el control bajo cualquier circunstancia. También JMP vacía el resultado de la
instrucción previamente procesada; por lo que, un programa con muchas operaciones
de salto puede perder velocidad de procesamiento. El formato general para JMP es:

| [etiqueta] | JMP | dirección corta, cercana o lejana |


Una operación JMP dentro del mismo segmento puede ser corta o cercana (o de
manera técnica, lejana, si el destino es un procedimiento con el atributo FAR). En su
primer paso por un programa fuente, el ensamblador genera la longitud de cada
instrucción. Sin embargo, una instrucción JMP puede ser de dos o tres bytes de
longitud. Una operación JMP a una etiqueta dentro de -128 a + 127 bytes es un salto
corto.
El ensamblador genera un byte para la operación (EB) y un byte para el operando. El
operando actúa como un valor de desplazamiento que la computadora suma al
registro IP cuando se ejecuta el programa. El ensamblador ya puede haber encontrado
el operando designado (un salto hacia atrás) dentro de -128 bytes, como en:
A50:
...
JMP A50

En este caso, el ensamblador genera una instrucción de maquina de dos bytes. Una
JMP que excede -128 a 127 bytes se convierte en un salto cercano, para que el
ensamblador genere un código de maquina diferente (E9) y un operando de dos bytes
(procesadores 8088/8086) o un operando de cuatro bytes (procesadores 80386 y
posteriores). En un salto hacia adelante, el ensamblador aun no ha encontrado el
operando designado:
JMP A90
...
A90:

Ya que algunas versiones del ensamblador no saben en este punto si el salto es corto
o cercano, generan de forma automática una instrucción de tres bytes.

Page 60,132
TITLE P08JUMP (COM) Uso de JMP para iterar
.MODEL SMALL
.CODE
ORG 100H
MAIN PROC NEAR
MOV AX,01 ;Iniciación de AX,
MOV BX,01 ;BX y
MOV CX,01 ;CX a 01
A20:
ADD AX, 01 ;Sumar 01 a AX
ADD BX, AX ;Sumar AX a BX
SHL CX, 1 ;Multiplicar por dos a CX
JMP A20 ;Saltar a la etiqueta A20
MAIN ENDP
END MAIN

La instrucción LOOP
La instrucción LOOP, requiere un valor inicial en el registro CX. En cada iteración,
LOOP de forma automática disminuye 1 de CX. Si el valor en el CX es cero, el control
pasa a la instrucción que sigue; si el valor en el CX no es cero, el control pasa a la
dirección del operando. La distancia debe ser un salto corto, desde -128 hasta +127
bytes. Para una operación que exceda este limite, el ensamblador envía un mensaje
como "salto relativo fuera de rango". El formato general de la instrucción LOOP es:

| [etiqueta:] | LOOP | dirección corta |

El siguiente programa muestra el funcionamiento de la instrucción LOOP.

Page 60,132
TITLE P08LOOP (COM) Ilustración de LOOP
.MODEL SMALL
.CODE
ORG 100H
MAIN PROC NEAR
MOV AX,01 ;Iniciación de AX,
MOV BX,01 ;BX y
MOV CX,01 ;CX a 01
MOV CX,10 ;Iniciar
A20: ;Número de iteraciones
ADD AX, 01 ;Sumar 01 a AX
ADD BX, AX ;Sumar AX a BX
SHL DX, 1 ;Multiplicar por dos a DX
LOOP A20 ;Iterar si es diferente de cero
MOV AX, 4C00H ;Salida a DOS
MAIN ENDP
END MAIN
Existen dos variaciones de la instrucción LOOP, ambas también decrementan el CX
en 1. LOOPE/LOOPZ (repite el ciclo mientras sea igual o repite el ciclo mientras sea
cero) continua el ciclo mientras que el valor en el CX es cero o la condición de cero
esta establecida.
LOOPNE/LOOPNZ (repite el ciclo mientras no sea igual o repite el ciclo mientras sea
cero) continua el ciclo mientras el valor en el CX no es cero o la condición de cero no
esta establecida.
INSTRUCCIONES DE SALTO CONDICIONAL
El ensamblador permite usar una variedad de instrucciones de salto condicional que
transfieren el control dependiendo de las configuraciones en el registro de banderas.
Por ejemplo, puede comparar dos campos y después saltar de acuerdo con los valores
de las banderas que la comparación establece. El formato general para el salto
condicional es:

| [etiqueta:] | Jnnn | dirección corta |

Como ya se explico la instrucción LOOP disminuye el registro CX; si es diferente de


cero, transfiere el control a la dirección del operando. podría reemplazar el enunciado
LOOP A20 de la figura anterior con dos enunciados - uno que decremente el CX y otro
que realice un salto condicional:
DEC CX ;Equivalente a LOOP
JNZ A20
...
DEC y JNZ realizan exactamente lo que hace LOOP. DEC decrementa en 1 CX y
pone a 1 o a 0 la bandera de cero (ZF) en el registro de banderas. Después JNZ
prueba la configuración de la bandera de cero; si el CX es diferente de cero, el control
pasa a A20, y si el CX es cero el control pasa a la siguiente instrucción hacia abajo
Datos con signo y sin signo
Distinguir el propósito de los saltos condicionales debe clarificar su uso. El tipo de
datos (sin signo o con signo) sobre los que se realizan las comparaciones o la
aritmética puede determinar cual es la instrucción a utilizar. Un dato sin signo trata
todos los bits como bits de datos; ejemplos típicos son las cadenas de caracteres, tal
como nombres o direcciones, y valores numéricos tal como números de cliente. Un
dato con signo trata el bit de mas a la izquierda como un signo, en donde 0 es positivo
y 1 es negativo.
En el ejemplo siguiente, el AX contiene 11000110 y el BX contiene 00010110. La
siguiente instrucción
CMP AX, BX

compara el contenido de AX con el contenido del BX. Para datos sin signo, el valor AX
es mayor; sin embargo, para datos con signo el valor AX es menor a causa del signo
negativo.
Saltos con base en datos sin signo

2.7 Incremento y decremento


https://www.youtube.com/watch?v=iOti8Yh0Mgg

Incremento y decremento Son las instrucciones más básicas a la hora de hacer


operaciones con registros: INC incrementa el valor de un registro, o de cualquier
posición en memoria, en una unidad, y DEC lo decrementa. Instrucción INC INC AX
Incrementa en uno el valor de AX IN WORD PTR Incrementa la palabra situada en CS.
Instrucción DEC DEC AX Decremento AX, le resta uno. DEC WORD PTR Decrementa
la palabra situada en CS.
Son las instrucciones más básicas a la hora de hacer operaciones con registros: INC
incrementa el valor de un registro, o de cualquier posición en memoria, en una unidad,
y DEC lo decrementa.

Instrucción INC
 INC AX
 Incrementa en uno el valor de AX
 IN WORD PTR
 Incrementa la palabra situada en CS.

Instrucción DEC
 DEC AX
 Decremento AX, le resta uno.
 DEC WORD PTR
 Decrementa la palabra situada en CS
INCREMENTO Y DECREMENTO Las instrucciones del ensamblador Instrucciones de
transferencia Son utilizadas para mover los contenidos de los operandos. Cada instrucción se puede
usar con diferentes modos de direccionamiento. MOV MOVS (MOVSB) (MOVSW) Instrucción
MOV Propósito: Transferencia de datos entre celdas de memoria, registros y acumulador. Sintaxis:
MOV Destino, Fuente
Donde Destino es el lugar a donde se moverán los datos y fuente es el lugar donde se encuentran
dichos datos. Los diferentes movimientos de datos permitidos para esta instrucción son:  Destino:
memoria. Fuente: acumulador  Destino: acumulador. Fuente: memoria  Destino: registro de
segmento. Fuente: memoria/registro  Destino: memoria/registro. Fuente: registro de segmento 
Destino: registro. Fuente: registro  Destino: registro. Fuente: memoria  Destino: memoria. Fuente:
registro  Destino: registro. Fuente: dato inmediato  Destino: memoria. Fuente: dato inmediato La
instrucción MOV y los modos de direccionamiento. He aquí nuestra primera instrucción: MOV
destino, origen Efectivamente, sirve para mover. Lo que hace es copiar lo que haya en "origen" en
"destino". Lo de que primero vaya el destino y luego el origen es común a todas las instrucciones del
8086 que tengan dos operandos, lo cual creará más de un quebradero de cabeza al principio. MOV
AX,BL MOV AX, BX sin embargo hace que el procesador coja el contenido de BX y lo copiara en
AX; lo que había anteriormente en AX se pierde (puesto que un registro al fin y al cabo es un
número, en este caso de 16 bits, y ahora le hemos asignado un nuevo valor), mientras que BX no se
ve afectado. Cuando decimos "mover" en realidad sería más apropiado "copiar", porque no
alteramos en absoluto el operando origen.

2.8 Captura de cadenas con formato

Captura básica de cadenas



En el lenguaje ensamblador el tipo de dato cadena(string) no está defnido, pero para fnes
deprogramación, una cadena es defnida como unconjunto de localidades de memoria
consecutivas quese reservan bajo el nombre de una variable.

Instrucciones para el manejo de strings


Instrucciones para el manejo de strings El lenguaje ensamblador cuenta con cinco
instrucciones para el manejo de cadenas:

Operación Equivalente

LODSB MOV AL, DS;[SI] INC SI


LODSW MOV AX, DS;[SI] ADD SI,2
- STOS (grabar cadena): Graba un carácter de una cadena a la veZ, registros que
debe inicialiZar antes de usar la instrucción.
https://www.youtube.com/watch?v=x_uyl2RGR50

Vous aimerez peut-être aussi