0% encontró este documento útil (0 votos)
24 vistas14 páginas

Notas 05

Cargado por

Denisse Mohedano
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
24 vistas14 páginas

Notas 05

Cargado por

Denisse Mohedano
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

1

CICLOS

Las instrucciones de CICLOS se usan para realizar estructuras repetitivas, y utilizan el


registro CX como contador.

LOOP

Esta instrucción hace que el programa salte a la dirección especificada (etiqueta), dentro del
segmento, mientras que CX sea distinto de 0 y decrementa CX en 1 en cada iteración.

LOOP etiqueta

Sintaxis general:

MOV CX, 100 ; este bucle se repite 100


COMIENZO: ; inicio del ciclo
; instrucciones a ejecutar dentro del ciclo
; instrucciones a ejecutar dentro del ciclo
LOOP COMIENZO ; final del ciclo

En el fragmento anterior, el bloque de instrucciones que se encuentra entre la etiqueta


COMIENZO y la instrucción LOOP será ejecutado hasta que el registro CX sea igual a cero.

Cada vez que se ejecuta la instrucción LOOP, el registro CX es decrementado en uno hasta
llegar a cero. Esta instrucción tiene la limitante de que debe encontrarse en el rango de
+128 a -127 (máximo número de bytes entre COMIENZO y LOOP).

EJEMPLO PARA LOOP:

0491:0100 MOV CX,5


0491:0103 MOV AX,9
0491:0106 SHL AX,1
0491:0108 LOOP 106
Desvía el registro AX a la izquierda 5 posiciones
resultando al final AX = 120 h.
( 0000 0000 0000 1001 0000 0001 0010 0000 )
2

LOOPE/LOOPZ

Esta instrucción salta a la dirección especificada mientras que CX sea distinto de 0 y si la


bandera de cero esta activada ZF = 1.

LOOPE/LOOPZ etiqueta

Cuando esta instrucción se ejecuta:

Se resta 1 a CX, después, CX se compara con cero.

Si Cx > 0 y ZF = 1, se realiza el salto hacia la etiqueta.

Si CX = 0 ó ZF = 0, no se realiza ningún salto y se ejecuta la instrucción que sigue


después del ciclo.

EJEMPLO PARA LOOPE/LOOPZ:

0491:0100 MOV CX,3 este bloque de ejemplo de loopz - loope


0491:0103 MOV AX,5 mantiene la bandera de zero activada (ZF=1)
0491:0106 SUB AX,5 y por lo tanto el ciclo termina hasta que
0491:0109 LOOPZ 0103 CX=0
0491:010B MOV AX,0
0491:010E MOV CX,3
0491:0111 ADD AX,CX este bloque de ejemplo de loopz - loope
0491:0113 SUB AX,CX desactiva la bandera de zero (ZF=0) en la
0491:0115 LOOPZ 0113 segunda iteración y por lo tanto el ciclo
0491:0117 MOV AH,4C termina aun cuando CX>0
0491:0119 INT 21
3

LOOPNE/LOOPNZ

Esta instrucción salta a la dirección especificada mientras que CX sea mayor que 0 y
además la bandera de cero esta desactivada ZF = 0.

LOOPNE/LOOPNZ etiqueta

Cuando esta instrucción se ejecuta:

Se resta 1 a CX, después, CX se compara con cero.

Si Cx > 0 y ZF = 0, se realiza el salto hacia la etiqueta.

Si CX = 0 ó ZF = 1, no se realiza ningún salto y se ejecuta la instrucción que sigue


después del ciclo.

JCXZ

Esta instrucción realiza un salto si CX = 0.

JCXZ salto
4

TRANSFERENCIA DE CONTROL NO CONDICIONADA

Esta transferencia de control se logra con la instrucción JMP, que provoca un salto hacia
un punto de destino (una localidad definida en la memoria).

Dicha instrucción altera el flujo de ejecución del programa sin tomar en cuenta el estado de
las banderas.

Existen diferentes formatos para la instrucción de salto, y cada uno se aplica a un uso
específico.

El destino de la instrucción puede estar en el mismo segmento (intrasegmento) o en otro


diferente (intersegmento).

Para saltos intersegmento, la instrucción se arma o codifica en cinco bytes (uno para la
instrucción, dos para el segmento de destino y dos para el desplazamiento en la localidad de
destino). Los saltos intrasegmento requieren de tres bytes (uno para la instrucción y dos
para el desplazamiento en la localidad de destino). De esto se infiere que la localidad de
destino no puede estar más allá de 65535 bytes desde donde se encuentra la instrucción
JMP, ya sea hacia adelante o hacia atrás.

Existe un formato adicional que se usa en saltos intrasegmento cuyo punto de destino no
está mas allá de +127 bytes hacia adelante o -128 bytes hacia atrás. Este formato solo
requiere dos bytes (uno para la instrucción y el otro para el desplazamiento). El byte del
desplazamiento se considera un byte con signo, de ahí la limitante de +127 o -128.
Recuerde que los bytes (o palabras) con signo utilizan el bit más significativo para
determinar el signo. Si el bit más significativo es uno, el valor se considera negativo; de lo
contrario, será positivo. Ejemplo:

ORG 100H

EMPIEZA:

JMP PROGPRIN

DB "ESTE ES UN FRAGMENTO DE CODIGO$"

PROGPRIN:
..
..
END EMPIEZA
5

En el ejemplo anterior se aprecia el uso común de un salto no condicional intrasegmento.


En el caso de los programas .COM es necesario saltar sobre el área de datos y llegar a la
etiqueta de comienzo del código; esto se debe a que dichos programas deben contener los
datos y el código en un solo segmento.

..
..
JMP SHORT ETIQUETA
..
..
ETIQUETA:

En el caso anterior, el formato JMP SHORT ETIQUETA es un salto intrasegmento a la


localidad "etiqueta", cuya distancia desde la instrucción JMP no es mayor de 127 bytes.
En caso contrario, el ensamblador desplegará un mensaje de error.

Los saltos intersegmentos se especifican de igual manera que los intrasegmento,


con la única diferencia de que la etiqueta debe ser declarada como externa con el
calificador FAR (lejos) o con un operando FAR PTR (apuntador lejano, usando la
directiva EXTRN). Ejemplo:

Suponga que tiene dos archivos arch1.asm y arch2.asm, y que el primero contiene lo
siguiente:

PUBLIC SALTE
.
.
SALTE:
.
.

En arch2.asm desea hacer referencia a la etiqueta "SALTE" que se encuentra en arch1.asm;


en este caso tendríamos que arch2.asm contiene:

EXTRN SALTE: FAR


.
.
JMP SALTE
.
.

La etiqueta es declarada externa (EXTRN) y lejana (FAR) porque se encuentra en otro


archivo (arch1.asm) que será enlazado con arch2.asm.
6

TRANSFERENCIA DE CONTROL CONDICIONADA

La "inteligencia" de un programa está determinada por la capacidad que tiene de tomar


decisiones con base en ciertas condiciones.

La familia de procesadores 80x86 tiene 16 instrucciones de salto condicionales;


estas instrucciones generalmente siguen a alguna instrucción de comparación como CMP.
Dichas instrucciones se pueden clasificar en tres diferentes categorías:

1. Las que se usan para comparar DOS ENTEROS SIN SIGNO.


2. Las que sirven para comparar DOS ENTEROS CON SIGNO.
3. Las que dependen del ESTADO QUE GUARDE EL REGISTRO DE
BANDERAS.

INSTRUCCIONES USADAS PARA COMPARAR DOS ENTEROS SIN SIGNO

1- JA O JNBE- Salta si está arriba o salta si no está abajo o si no es igual (jump if


above o jump if not below or equal). El salto se ejecuta si la bandera CF=0 y
ZF=0.

2- JAE O JNB- Salta si está arriba o es igual o salta si no está abajo (jump if above or
equal o jump if not below). El salto se efectúa si CF=0.

3- JB O JNAE- Salta si esta abajo o salta si no está arriba o si no es igual (jump if


below o jump if not above or equal). El salto se efectúa si CF=1

4- JBE O JNA- Salta si está abajo o si es igual o salta si no está arriba (jump if below
or equal o jump if not above). El salto se efectúa si CF=1 o ZF=1.

5- JE O JZ- Salta si es igual o salta si es cero (jump if equal o jump if zero). El salto
se efectúa si ZF=1 (también se aplica a comparaciones de enteros con signo).

6- JNE O JNZ- Salta si no es igual o salta si no es cero (jump if not equal o jump if not
zero). El salto se efectúa si ZF=0 (también se aplica a comparaciones de enteros
con signo).
7

INSTRUCCIONES USADAS PARA COMPARA DOS ENTEROS CON SIGNO

1- JG O JNLE- Salta si es más grande o salta si no es menor o igual (jump if greater o


jump if not less or equal). El salto se efectúa si ZF=0 o OF=SF.

2- JGE O JNL- Salta si es más grande o igual o salta si no es menor que (jump if
greater or equal o jump if not less). El salto se efectúa si SF=OF.

3- JL O JNGE- Salta si es menor que o salta si no es mayor o igual (jump if less o


jump if not greater or equal). El salto se efectúa si SF es diferente de OF.

4- JLE O JNG- Salta si es menor o igual o salta si no es más grande (jump if less or
equal o jump if not greater). El salto se efectúa si ZF=1 o SF es diferente de OF.

INSTRUCCIONES USADAS SEGÚN EL ESTADO DEL REGISTRO DE


BANDERAS

1- JC- Salta si hay acarreo (jump if carry). El salto se efectúa si CF=1.

2- JNC- Salta si no hay acarreo (jump if not carry). El salto se efectúa si CF=0.

3- JNO- Salta si no hay desbordamiento (jump if no overflow). El salto se efectúa si


OF=0

4- JNP O JPO- salta si no hay paridad o salta si la paridad es non. El salto se efectúa si
pf=0

5- JNS- salta si el signo esta apagado (jump if not sign). El salto se efectúa si sf=0.

6- JO- salta si hay desbordamiento (jump if overflow). El salto se efectúa si OF=1.

7- JP O JPE- Salta si hay paridad o salta si la paridad es par (jump if parity o jump if
parity even). El salto se efectúa si PF=1.

8- JS- Salta si el signo esta prendido (jump if sign set). El salto se efectúa si SF=1.
8

Anteriormente se mencionó que existen 16 diferentes instrucciones condicionales,


pero tomando en cuenta las recién descritas encontrara 18. La razón es que las
instrucciones JC y JB son idénticas, así como JNC y JAE (note que coinciden por las
mismas condiciones).

Un punto adicional que vale la pena mencionar en cuanto a las comparaciones con
signo, es que son necesarias y van de acuerdo con la interpretación que se le quiera dar a
los bytes o palabras del programa. por ejemplo, suponga que tiene un byte cuyo valor es
11111111 en binario y que desea compararlo con otro cuyo valor es 00000000, "es
11111111 mayor que 00000000 ?", si y no, eso depende de la interpretación que se le
quiera dar. si trabaja con números enteros sin signo, sí lo será, pues 255 es mayor que 0,
por el contrario, si tiene signo entonces será menor puesto que -1 es siempre menor que
cero.

Lo anterior lleva a seleccionar las instrucciones de comparación y de salto de acuerdo con


la interpretación que se les dé a los bytes o palabras. Así mismo, es muy importante
advertir que los saltos condicionales se encuentran limitados al rango de -128 a +127
bytes como máxima distancia, ya sea hacia adelante o hacia atrás. si desea efectuar un
salto a mayores distancias es necesario crear una condición mixta entre saltos
condicionales y no condicionales.
9

ESTILO DE PROGRAMACIÓN

Un programa en lenguaje ensamblador es una serie de sentencias ejecutables que le dicen al


ensamblador qué operaciones tiene que realizar. Esta serie de sentencias, a menudo, se
denominan código fuente. Como en cualquier otro lenguaje, el código fuente del lenguaje
ensamblador tiene una sintaxis predefinida.

Cada sentencia de lenguaje ensamblador está compuesta de cuatro campos:

Campo nombre Campo operación Campo operando Campo comentario.

Sin embargo, ciertas instrucciones del ensamblador no utilizan todos los campos. El campo
comentario existe para expresar propósitos o documentación de programación interna y es
opcional.

CAMPO NOMBRE
El campo del nombre, algunas veces denominado el campo rotulo, asigna un nombre
simbólico a la dirección de comienzo de memoria real de una instrucción y elimina la
necesidad de seguir la pista de direcciones de las instrucciones. Esto es especialmente útil
al generar código reubicable.

Al utilizar una referencia simbólica, el programador permite al enlazador (linker)


seleccionar en qué sitio de memoria será cargado el programa en lenguaje ensamblador.
Todas las referencias a instrucciones pueden entonces variar automáticamente con la
colocación del código. Aunque a cualquier instrucción se le puede dar un nombre, este
campo esta habitualmente reservado para aquellas instrucciones que serán referenciadas en
las definiciones de datos, constantes, segmentos, lazos, bifurcaciones y llamadas a
subrutinas.

Un nombre debe comenzar con un caracter alfabético y puede contener hasta 31


caracteres, incluyendo:

-todas las letras de la a a la z.


-dígitos numéricos del 0 al 9.
-los símbolos especiales siguientes: - $ . ? @ %

Debe tenerse precaución al seleccionar un nombre, no se puede utilizar un nombre que


coincida con una palabra reservada o directiva del ensamblador. Si el nombre incluye un
punto (.) , entonces el punto debe ser el primer caracter.
10

VARIABLES

Un nombre de variable representa una posición de memoria que es accesible por programa;
y el contenido de esta posición de memoria puede cambiar durante la ejecución. Las
definiciones de variables incluyen información sobre la dirección de posiciones de
memoria, tipos de datos y tamaño. Las variables pueden ser utilizadas como operando en
formas simple, indexada o estructurada.

RÓTULOS

Los nombres aplicados a instrucciones ejecutables en los programas de aplicación son


referenciados como código relativo. Un nombre, o rotulo en este caso, tiene tres atributos:

1. dirección de segmento,
2. desplazamiento de segmento y
3. descriptor de accesibilidad near o far.

La CPU puede direccionar un rotulo particular de dos formas:

Primera forma:

Si el rotulo que se está referenciando esta en el mismo segmento del código, entonces
solamente se necesita el desplazamiento de segmento para localizar la orden, en este caso,
podríamos decir que el tipo del rotulo es near. Para definir un rótulo como near,
inmediatamente después del rotulo se colocan dos puntos (:) o la pseudo-op near puede ser
usada:

ciclo:

Los dos puntos (:), como se muestra, indican al ensamblador que esta es una instrucción
referenciada en el mismo segmento de código.

En este ejemplo, el rótulo está explícitamente definido como near al usar el rotulo de la
pseudo-op.

Segunda forma:

Para direccionar un rótulo requiere la dirección del segmento y la dirección del


desplazamiento. Este es el caso en que la sentencia del ensamblador a referenciar no está en
el mismo segmento de código, en este caso, el rotulo se define como far.

codigo label far


11

En el ejemplo mostrado, la pseudo-op "label" es utilizada con el atributo far. Los atributos
far pueden ser también utilizados para rotular equate y procedure y sentencias external,
como se ve en los siguientes ejemplos:

diez equ far 10


imprime proc far
extrn randm: far

CONSTANTES

Los nombres también pueden ser dados a posiciones de memoria que contienen valores
inicializados que no cambian durante la ejecución del programa, estos valores inicializados
se denominan constantes, las constantes pueden ser de ocho tipos.

BINARIA: Las constantes binarias contienen una serie de ceros (0) y unos (1) y están
seguidos por una letra b. por ejemplo:

NUMERO EQU 00001000B

DECIMAL: Las constantes decimales contienen una serie de dígitos del 0 al 9 y están
opcionalmente seguidas por la letra d. una serie de dígitos se considera como un número
decimal a menos que cambie la base, ejemplo:

LUGAR EQU 40D

HEXADECIMAL: Las constantes hexadecimales contienen una serie de dígitos del 0 al 9


e incluyen las letras de la a a la f, seguidas de la letra h. el primer caracter debe ser uno de
los dígitos del 0 al 9, esto indica al compilador que el valor es un número y no
posiblemente una referencia de rótulo o nombre de variable. Si el valor hexadecimal
comienza con una de las letras de la a a la f, entonces añadiendo un 0 al principio se
eliminara esta ambigüedad interpretada por el compilador, una declaración de constantes
hexadecimal seria:

QUINTO EQU 32H


VALOR EQU OFFH

En este ejemplo, el 0 fue añadido para indicar al ensamblador que ffH era un número
hexadecimal, no un rótulo o nombre de variable.

OCTAL: Las constantes octales contienen los dígitos del 0 al 7 seguidos por la letra o o q,
por ejemplo:

CANTIDAD EQU 6O Ó 6Q

CARACTER: Las constantes de caracteres pueden contener cualquier caracter ASCII


encerrado entre comillas simples o dobles. Si una constante contiene más de dos caracteres,
12

la pseudooperaciòn db (definir byte) debe ser utilizada. Si la cadena de caracteres contiene


sólo uno o dos caracteres, entonces pueden ser utilizadas las pseudos-ops dd, dq, dt o dw.
Por ejemplo:

INICIO DD `B`
NOMBRE DB "J WILLIAMS"

PUNTO FLOTANTE: Este tipo de dato representa valores en notación científica decimal
y no está soportado por el small assembler de IBM . por ejemplo:

SENO DD O.322E-1

REAL HEXADECIMAL: Esta es una constante que contiene los dígitos del 0 al 9 y las
letras de la a a la f, seguidas por la letra r. igual que las constantes hexadecimales, el primer
caracter debe ser uno de los dígitos del 0 al 9. La constante debe contener un número total
de dígitos que igualen a 8, 16 o 20, a menos que el primer dígito sea un 0, en este caso, el
número total de dígitos debe ser uno mayor (9,17 ò 21). Este tipo de dato tampoco está
soportado por el small assembler de IBM. por ejemplo:

NUMERO_DE_HORAS DD OFAB12345R

EQUATES: Un rótulo en el campo de nombre puede ser asignado al valor de una


expresión del campo de operando utilizando la pseudo-op equ o el signo igual (=). La
pseudo-op equ asigna a la variable una constante que no puede cambiar durante la
ejecución del programa. Si se utiliza la pseudo-op signo =, el valor de la constante puede
ser cambiado durante la ejecución del programa. Por ejemplo:

SCRADD EQU [BP + 16]


BASNUM = 1980

En el primer ejemplo, scradd equ [bp + 16], el nombre scradd puede ser sustituido en lugar
de la expresión índice [bp + 16]. Igualmente, -basnum- se le puede reasignar un nuevo
valor mientras el programa estaba en ejecución.

CAMPO OPERACIÓN
El campo de operación contiene un nemotécnico para una instrucción real del
microprocesador, el nemotécnico es una "ayuda de memoria" de dos a seis caracteres. En
lugar de ser un valor binario o hexadecimal para una instrucción máquina, el nemotécnico
es una abreviatura en inglés, el nemotécnico de operación hace el código más fácil de leer y
comprender y es solamente una tabla de conversión interna del valor binario de código
máquina real. Una operación o nemotécnico puede representar una instrucción máquina,
macroinstrucción o pseudo-operaciòn, por ejemplo:

INICIAL: MOV AX,19H


13

INICIAL es el rótulo y MOV es la operación. Siguiendo al campo de operación se


encuentra el campo de operando. Cada operación no sólo le dice al ensamblador qué
instrucción debe ejecutar sino cuántas operaciones se necesitan y de qué tipo.

Una operación puede contener una referencia a una macro. Tal referencia indica al
ensamblador cómo procesar una secuencia predefinida de código, esto hace que el
ensamblador genere instrucciones en código fuente como si estuviesen en la parte original
del programa, por ejemplo:

DOS__INT MACRO SERVICIO__ID

Esta operación avisa al ensamblador y le indica que el código siguiente es parte de la


definición macro. Una pseudo-operaciòn, abreviadamente pseudo-op, habitualmente no
produce código máquina pero en su lugar dirige al ensamblador para que realice ciertas
operaciones sobre datos, listados de código, bifurcaciones y macros.

CAMPO OPERANDO
El campo de operandos contiene la posición o posiciones donde están los datos que van a
ser manipulados por la instrucción, la instrucción puede requerir uno o dos operandos, si
hay dos operandos, éstos están separados por una coma (,).

Cuando una operación requiere dos operandos, el primer operando se denomina operando
destino y el segundo se denomina operando fuente. Operaciones de transferencia de datos,
registros, almacenamiento inmediato y almacenamiento de memoria son ejemplos de
instrucciones que requieren dos operandos, por ejemplo:

MOV AX,8

Este es un ejemplo de operando inmediato. Aquí, el dato a ser manipulado se incluye como
operando fuente y se desplaza al registro AX, u operando destino.

CAMPO COMENTARIO
El campo comentario es el último de los cuatro campos y puede ser uno de los más útiles.
El campo comentario se utiliza para documentar internamente el código fuente del
ensamblador y son útiles sólo al listar el código fuente. Si un comentario se incluye con una
instrucción de operación, entonces debe estar separado del último campo por al menos un
espacio en blanco y comenzar con un punto y coma (;), un comentario debe ser utilizado
para describir aquellas líneas de código fuente que no son comprensibles inmediatamente.
por ejemplo:

MOV AH,45H ;PARÁMETRO PARA LEER UN CARACTER


14

ALMACENAMIENTO
Un programa es simplemente una secuencia de bytes (visto desde el punto de vista del
procesador), al igual que el área de datos que maneja, y dichos bytes se encuentran
ubicados en alguna parte de la memoria. El procesador no hace distinciones entre un
número entero y una cadena de caracteres, simplemente los trata como localidades de
memoria. Por otro lado, el ensamblador permite distinguir entre formatos y cantidad de
bytes por almacenar, se puede solicitar el almacenamiento como se indica:

DB 1 byte
DW 2 bytes = una palabra
DD 4 bytes = una doble palabra
DF, DP 6 bytes = una palabra de puntero lejano (386)
DQ 8 bytes = una cuádruple palabra
DT 10 bytes

También podría gustarte