La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

2. ELEMENTOS DEL LENGUAJE 2.1 INTRODUCCIÓNES LINEALES

Presentaciones similares


Presentación del tema: "2. ELEMENTOS DEL LENGUAJE 2.1 INTRODUCCIÓNES LINEALES"— Transcripción de la presentación:

1 2. ELEMENTOS DEL LENGUAJE 2.1 INTRODUCCIÓNES LINEALES
2.1.1 MOVIMIENTO La instrucción de transferencia de datos por excelencia es:                   MOV destino, fuente entendiendo por fuente el contenido que se va a transferir a una determinada zona o registro de memoria denominada destino. Esta instrucción, por tanto, nos va a permitir transferir información entre registros y memoria, memoria y registros y entre los propios registros utilizando alguno de los diferentes modos de direccionamiento. Con la instrucción MOV diremos que se pueden realizar todo tipo de movimientos teniendo en cuenta las siguientes restricciones:

2 1.- No se puede realizar una transferencia de datos entre dos posiciones de memoria directamente, por esta razón, siempre que queramos efectuarlas tendremos que utilizar un registro intermedio que haga de puente. Por ejemplo, para hacer la operacion DATO1 <-- DATO2, la instrucción MOV DATO2,DATO1 sería incorrecta. Lo que sí sería correcto sería utilizar el registro DX, u otro, como puente y hacer: MOV DX,DATO1 MOV DATO2,DX

3 2.- Tampoco se puede hacer una transferencia directa entre dos registros de segmento. Por eso, como en el caso anterior, si fuera preciso se utilizaría un registro como puente. 3.- Asimismo, tampoco se puede cargar en los registros de segmento un dato utilizando direccionamiento inmediato, es decir, una constante, por lo que también habrá que recurrir a un registro puente cuando sea preciso.   Una instrucción util pero no imprescindible es:              XCHG DATO1, DATO2 que intercambia los contenidos de las posiciones de memoria o registros representadospor DATO1 y DATO2. Por ejemplo, si queremos intercambiar los contenidos de los registros AX y BX, podemos hacer:   MOV AUX, AX MOV AX, BX MOV BX, AUX

4 en donde AUX es una variable auxiliar que hace de puente, o simplemente utilizar:
                     XCHG AX, BX Las restricciones que presenta esta operación es que no se pueden efectuar intercambios directamente entre posiciones de memoria ni tampoco entre registros de segmento. Otra instrucción de transferencia es LEA, carga el desplazamiento u OFFSET correspondiente al operando fuente en el operando destino. Por ejemplo, la instrucción MOVE DX, OFFSET MENSAJE Observe el siguiente ejemplo: .Model Small .Stack .Data Mensaje DB ’Hola$´ .Code mov dx,offset mensaje

5 2.1.2 PILA Las instrucciones de pila permiten hacer uso de la región de memoria apuntada por SS, recuerde que es una estructura del tipo LIFO, en la cuál solo se pueden colocar datos de 16 bits. Los nmonicos a usar para las operaciones de pila son: PUSH Y POP Ejemplo: PUSH AX POP BX El código anterior colocaría el valor de AX en BX, su equivalente sería MOV BX,AX

6 2.1.3 MATEMATICAS Las instrucciones ADD y SUB realizan sumas y restas sencillas de datos binarios. Los números binarios negativos están representados en la forma de complemento a dos: Invierta todos los bits del numero positivo y sume 1. Los formatos generales para las instrucciones ADD y SUB son: Como en otras instrucciones, no existen operaciones directas de memoria a memoria. El ejemplo siguiente utiliza el registro AX para sumar WORDA a WORDB:

7 WORDA DW 123 ;Define WORDA WORDB DW 25 ;Define WORDB
WORDA DW  123      ;Define WORDA WORDB DW 25         ;Define WORDB                     MOV AX, WORDA     ;Mueve WORDA al AX           ADD  AX, WORDB     ;Suma WORDB al AX           MOV WORDB, AX     ;Mueve AX a WORDB El siguiente programa proporciona ejemplos de ADD y SUB para el procesamiento de valores en un byte y en una palabra. El procedimiento B10ADD utiliza ADD para procesar bytes y el procedimiento C10SUB utiliza SUB para procesar palabras.

8 .Model Small .Stack .Data BYTEA       DB         64H                 ;DATOS BYTEB       DB         40H BYTEC       DB        16H WORDA     DW       4000H WORDB     DW       2000H WORDC     DW       1000H .Code MAIN         PROC    NEAR             ;Procedimiento principal:                  CALL      B10ADD         ;Llama a la rutina ADD                  CALL      C10SUB         ;Llama a la rutina SUB                  INT         21H MAIN        ENDP B10ADD   PROC                 MOV         AL, BYTEA                 MOV         BL, BYTEB                 ADD         AL, BL                 ;registro a registro                 ADD         AL, BYTEC         ;memoria a registro                 ADD         BYTEA, BL         ;registro a memoria                 ADD         BL, 10H              ;inmediato a registro                 ADD         BYTEA, 25H       ;inmediato a memoria                 RET B10ADD  ENDP C10SUB  PROC                 MOV         AX, WORDA                 MOV         BX, WORDB                 SUB         AX,BX                 ;Registro a registro                 SUB         AX,WORDC        ;Memora de registro                 SUB         WORDA, BX       ;Registro de memoria                 SUB         BX, 1000H          ;Inmediato de registro                 SUB         WORDA, 256H   ;Inmediato de memoria                 RET C10SUB ENDP                 END BEGIN 

9 ; HOLA.ASM ; Programa clásico de ejemplo. ;Despliega una leyenda en pantalla. STACK SEGMENT STACK ; Segmento de pila DW DUP (?) ; Define espacio en la pila STACK ENDS DATA SEGMENT ; Segmento de datos SALUDO DB "Hola mundo!!",13,10,"$" ; Cadena DATA ENDS CODE SEGMENT ; Segmento de Código ASSUME CS:CODE, DS:DATA, SS:STACK INICIO: ; Punto de entrada al programa MOV AX,DATA ; Pone dirección en AX MOV DS,AX ; Pone la dirección en los registros MOV DX,OFFSET SALUDO ; Obtiene dirección del mensaje MOV AH,09H ; Función: Visualizar cadena INT H ; Servicio: Funciones alto nivel DOS MOV AH,4CH ; Función: Terminar INT H CODE ENDS END INICIO ; Marca fin y define INICIO

10 1.- Las declaraciones SEGMENT y ENDS definen los segmentos a usar.
2.- La variable SALUDO en el segmento DATA, define la cadena a ser desplegada. El signo del dolar al final de la cadena (denominado centinela) es requerido por la función de visualización de la cadena de MS-DOS. La cadena incluye los códigos para carriage-return y line-feed. 3.- La etiqueta START en el segmento de código marca el inicio de las instrucciones del programa. 4.- La declaracion DW en el segmento de pila define el espacio para ser usado por el stack del programa.

11 5.- La declaración ASSUME indica que registros de segmento se asociarán con las etiquetas declaradas en las definiciones de segmentos. 6.- Las primeras dos instrucciones cargan la dirección del segmento de datos en el registro DS. Estas instrucciones no son necesarias para los segmentos de código y stack puesto que la dirección del segmento de código siempre es cargado en el registro CS y la dirección de la declaración del stack segment es automáticamente cargada en el registro SS. 7.- Las últimas dos instrucciones del segmento CODE usa la función 4CH de MS-DOS para regresar el control al sistema operativo. Existen muchas otras formas de hacer esto, pero ésta es la más recomendada. 8.- La directiva END indica el final del código fuente y especifica a START como punto de arranque

12 Otras instrucciones que se pueden emplear para operaciones matemáticas son las de incremento y decremento. Ejemplo: DEC ax INC cx Estas operaciones nos permiten realizar el control de ciclos. Otra instrucción es: MUL. Su sintaxis es la siguiente: MUL fuente Se asume que el multiplicando será del mismo tamaño que el del multiplicador, por lo tanto multiplica el valor almacenado en el registro que se la da como operando por el que se encuentre contenido en AH si el multiplicador es de 8 bits o por AX si es de 16 bits.

13 La instrucción siguiente permite realizar operaciones de división.
DIV la cual permite realizar una división sin signo. La sintaxis es la siguiente: DIV fuente El divisor puede ser un byte o una palabra y es el operando que se la da a la instrucción. Si el divisor es de 8 bits se toma como dividendo el registro de 16 bits AX y si el divisor es de 16 bits se tomara como dividendo el registro par DX:AX, tomando como palabra alta DX y como baja AX. Si el divisor fue un byte el cociente se almacena en el registro AL y el residuo en AH, si fue una palabra el cociente se guarda en AX y el residuo en DX. A continuación presentaremos una serie de ejemplos.

14 Ej 01. .MODEL SMALL .CODE Programa: MOV AX,4C00H INT 21H .STACK END Programa Este programa solo se carga en memoria e inmediatamente termina su ejecución. El Objetivo es iniciarnos en el proceso de captura, compilación, enlace y ejecución usando el MASM

15 .Model Small .Code Programa: Mov Mov DS,AX Mov DX,Offset Texto01 Mov AH,09 Int 21H Mov AX,4C00h .Data Texto01 DB 'Bienvenidos al ITP' ,10,13, '$' .Stack END Programa

16 Realicemos una breve comparación con un programa que hace lo mismo pero desde el debug.
0CC5:0100 jmp CC5: e 102 ‘Bienvenidos al ITP' 0d 0a '$' a CC5:0128 mov dx, CC5:012B mov ah, CC5:012D int 21

17 Otra forma de programarlo es de la siguiente manera: Ej. 03
.model small stack data Texto db ‘Computación y Sistemas',13,10,'$‘ .code Programa: mov mov ds,ax mov dx,offset Texto mov ah,9 ;funcion del DOS para desplegar un string int 21h mov ax,4c00h int 21h END Programa

18 COMMENT * Todo esto es el comentario *
.Model small STACK SEGMENT PARA STACK 'STACK' STACK ENDS .Data Texto DB 'Hola mundo$' CSEG SEGMENT PARA PUBLIC 'CODE' ASSUME CS:CSEG,SS:STACK mov mov ds,ax mov dx,offset Texto mov ah,9 int 21h mov ax,4c00h CSEG ENDS END

19 ;Programa que emite un bip durante 2 segundo.
Ej. 04 Desarrolle un programa que le permita desplegar tres mensajes en pantalla. Ej. 05 Elaborar un programa que genere un bip de la bocina de la computadora durante 2 segundos. ;Programa que emite un bip durante 2 segundo. .model small stack code Programa: mov dl,07h ;carga el valor 07 en DL mov ah, ;carga el valor 02 en AH int 21h ;Ejecuta la Int 21 con el servicio int 21h ;previamente cargado en AH mov ax,4c00h ;carga 4C en AH int 21h ;ejecuta la Int 21 para terminar end programa ;fin del bloque de programa

20 El siguiente ejemplo muestra la forma de cómo desplegar un carácter en pantalla.
;Programa que permite mostrar el uso de la función 2 ;de la interrupción 21 para desplegar un caracter. .Model Small Code Programa: Mov DL,65d Mov AH, Int 21H Mov AX,4C00h Int 21H Data Stack END Programa

21 Veamos ahora un ejemplo de cómo limpiar la pantalla.
;Programa que hace la función CLS Model Small Code Programa: mov ah,0fh ;captura el modo de video int 10h mov ah,00h ;cambia al mismo modo de video int 10h ;esto para borrar pantalla mov ah,4ch int 21h .Data Stack END Programa

22 2.1.4 AJUSTES En las computadoras el formato natural para la aritmética es el binario. Sin embargo, para muchos propósitos, los datos numéricos se introducen desde el teclado como caracteres ASCII, en formato de base 10. Un formato relacionado, decimal codificado en binario (BCD), que puede ser empaquetado o desempaquetado permite un fácil manejo de la información. La PC proporciona varias instrucciones que facilitan la aritmética y conversión entre formatos. Las instrucciones a usar son:

23 Instrucción Descripción
AAA Ajuste ASCII después de sumar AAS Ajuste ASCII después de restar AAM Ajuste ASCII después de multiplicar AAD Ajuste ASCII para dividir DAA Ajuste decimal después de sumar DAS Ajuste decimal después de restar Analizaremos cada una de las instrucciones y veremos un ejemplo: Suma ASCII Sean dos números hexadecimales 38h (8 decimal) 34h (4 decimal) ----- 6Ch

24 El resultado no es correcto, ya que debió ser 12 en decimal y el 6C es incorrecto.
Sin embargo si tomamos el 6 y se lo sumamos al valor C entonces tendremos como resultado 12H. Si observamos es correcta en términos decimales pero en realidad es un valor hex. Lo anterior es lo que en realidad realiza la instrucción AAA. La operación AAA verifica el dígito hex en la extrema derecha (4 bits) del registro AL. Si el dígito esta entre A y F o la bandera de acarreo auxiliar es 1, la operación suma 6 al registro AL, suma 1 al registro AH y pone en 1 las banderas de acarreo y acarreo auxiliar. En todos los casos pone 0 (cero) en la extrema izquierda de AL. Ej. SI AL=38h y BL=34h ADD AL,BL AAA ;Ajusta para suma ASCII=0102h

25 Para restaurar la representación ASCII, solo se debe colocar un 3 en cada uno de los dígitos hexadecimales en la extrema derecha de AH y AL y con eso obtenemos lo siguiente: AX= 31h ;igual al 1 decimal AL= 32 ;igual al 2 decimal Para lograrlo usamos la siguiente instrucción: OR AX,3030h El resultado sería: AX=3132h Para sumar valores de mas de 1 byte se hace necesario un ciclo que procese de derecha a izquierda (de bajo a alto) y tome en cuenta los acarreos.

26 Cuales serían los resultados si suponemos los siguientes valores:
AL=38h BL=35h Sumando: AX= 006D Al usar la instrucción AAA, AX=0103h Complementado con la instrucción OR AX = 3133H ;Decimal 13 El siguiente ejemplo lee 2 números desde el teclado y realiza la suma.

27 ;Programa que lee 2 valores desde el teclado
;y muestra el uso de la instrucci¢n de ajuste ;AAA .Model Small .Stack .Data mensaje01 db 'Programa que muestra el uso de AAA$' pideval01 db 13,10,13,10,'Teclea 2 n£meros:$' salto db 13,10,'$' .Code Begin: mov mov ds,ax mov ah,09 mov dx,offset mensaje01 int 21h mov dx,offset pideval01 mov ah,01 mov bl,al mov ah,00 add al,bl ;Suma a AL el contenido de BL AAA ;Ajuste para suma ASCII ;con esto queda el resultado en ;ASCII dentro de AX OR AX,3030h

28 mov cx,ax mov ah,09 mov dx,offset salto int 21h mov ah,02 mov dl,ch ;Imprime el ASCII de AH mov dl,cl ;Imprime el ASCII de AL mov ah,4ch End

29 ;Programa que compara 2 números
.Model Small .Code Programa: ;Borra la pantalla mov ah,0fh ;captura el modo de video int 10h mov ah,00h ;cambia al mismo modo de video int 10h ;esto para borrar pantalla ;Despliega el mensaje mov mov ds,ax mov dx,offset Mensaje mov ah,09h int 21h

30 ;Realiza la comparación
mov ax,5 mov bx,5 cmp ax,bx je soniguales ;salta si son iguales mov dx,offset cadena2 mov ah,09h int 21h jmp salir soniguales: mov dx,offset cadena1

31 ;Fin del programa salir: mov ah,4ch int 21h .Data Mensaje DB 'Comparación de 2 números',7,13,10,'$' Cadena1 DB 'Valores iguales',13,10,'$' Cadena2 DB 'Valores diferentes',13,10,'$' .Stack END Programa

32 ;Programa que determina el mayor de 2
.Model Small .Data Mensaje DB 'Comparaci¢n de 2 n£meros para saber cual es el mayor',7,13,10,'$' Cadena1 DB 13,10,'El primer n£mero es mayor',13,10,'$' Cadena2 DB 13,10,'El segundo n£mero es mayor',13,10,'$' Cadena3 DB 13,10,'Son iguales',13,10,'$' .Stack .Code Programa: ;Borra la pantalla mov ah,0fh ;captura el modo de video int 10h mov ah,00h ;cambia al mismo modo de video int 10h ;esto para borrar pantalla ;Despliega el mensaje mov mov ds,ax mov dx,offset Mensaje mov ah,09h int 21h

33 ;Realiza la comparaci¢n
mov ax,1 mov bx,7 cmp ax,bx jnbe mayor ;Si AX > BX jb menor ;Si AX < BX je iguales mayor: mov dx,offset cadena1 mov ah,09h int 21h jmp salir menor: mov dx,offset cadena2 iguales: mov dx,offset cadena3 mov ah,09h int 21h jmp salir ;Fin del programa salir: mov ah,4ch END Programa

34 ;Programa que compara 2 números
;leídos desde teclado .Model Small .Code Programa: ;Borra la pantalla mov ah,0fh ;captura el modo de video int 10h mov ah,00h ;cambia al mismo modo de video int 10h ;esto para borrar pantalla ;Despliega el mensaje mov mov ds,ax mov dx,offset Mensaje mov ah,09h int 21h

35 ;Solicita el primer valor
mov dx,offset Pide1 int 21h mov ah,0h int 16h mov bl,al ;Solicita el segundo valor mov dx,offset Pide2 mov ah,09h

36 ;Realiza la comparación
mov ah,0 mov bh,0 cmp ax,bx je soniguales ;salta si son iguales mov dx,offset cadena2 mov ah,09h int 21h jmp salir soniguales: mov dx,offset cadena1

37 ;Fin del programa salir: mov ah,4ch int 21h .Data Mensaje DB ‘Comparación de 2 n£meros',7,13,10,'$' Pide1 DB 13,10,'Ingrese el primer valor:','$' Pide2 DB 13,10,'Ingrese el segundo valor:','$' Cadena1 DB 13,10,13,10,'Valores iguales',13,10,'$' Cadena2 DB 13,10,13,10,'Valores diferentes',13,10,'$' .Stack END Programa

38 Podríamos escribirlo de la siguiente manera: LEA dx,mensaje
Hemos visto ejemplos usando la instrucción OFFSET, esta puede ser reemplazada junto con el MOV, usando la instrucción LEA. Ej. Si tenemos: mov dx,offset mensaje Podríamos escribirlo de la siguiente manera: LEA dx,mensaje La nueva instrucción LEA se presenta en mayúsculas sólo para diferencias y resaltar, aunque puede también escribir en minúsculas. ;Programa que muestra el uso ;de la instrucción LEA .model small .stack .data mensaje db 'Nuevas ideas$' .code Begin: mov mov ds,ax LEA dx,mensaje mov ah,09 int 21h continuación mov ah,4ch ;Termina int 21h End Begin

39 El siguiente programa muestra la forma en como se puede enviar un carácter a la impresora, esto haciendo uso de la función 5 de la interrupción 21. ;Programa que imprime un caracter en la ;impresora .model small .stack .data .code Begin: mov ah,05h ;Envia caracter a la impresora mov dl,65d ;Caracter a imprimir int 21h mov ah,4ch End Begin Esta función solo sirve para cuando se tiene una impresora conectada en el puerto LPT, además si se imprime hasta que se llene el buffer de la impresora.

40 2.1.5 COMPARACION LA INSTRUCCION CMP La instrucción CMP pro lo común es utilizada para comparar dos campos de datos, uno de los cuales están contenidos en un registro. El formato general para CMP es:     |  [etiqueta:]  |  CMP  |  {registro/memoria}, {registro/memoria/inmediato} |El resultado de una operación CMP afecta la banderas AF, CF, OF, PF, SF y ZF, aunque no tiene que probar estas banderas de forma individual. El código siguiente prueba el registro BX por un valor cero: CMP BX, 00  ;Compara Bx con cero  JZ B50  ;Si es cero salta aB50  .   ;(Acción si es diferente de cero)  . B50: ...   ;Destino del salto, si BX es cero

41 Si el BX tiene cero, cmp establece ZF a 1 y puede o no cambiar la configuración de otras banderas. La instrucción JZ (salta si es cero) solo prueba la bandera ZF. Ya que ZF tiene 1 (que significa una condición cero), JZ transfiere el control (salta) a la dirección indicada por el operando B50. Observe que la operación compara el primer operando con el segundo; por ejemplo, el valor del primer operando es mayor que, igual o menor que el valor del segundo operando?

42 2.2.1 INCONDICIONAL 2.2.2 CONDICIONAL
2.2 SALTOS 2.2.1 INCONDICIONAL CONDICIONAL Hasta este punto los programas que hemos examinado han sido ejecutados en forma lineal, esto es con una instrucción secuencialmente a continuación de otra. Sin embargo, rara vez un programa programable es tan sencillo. La mayoría de los programas constan de varios ciclos en los que una serie de pasos se repite hasta alcanzar un requisito especifico y varias pruebas para determinar que acción se realiza de entre varias posibles. Requisitos como este implican la transferencia de control a la dirección de una instrucción que no sigue de inmediato de la que se esta ejecutando actualmente. Una transferencia de control puede ser hacia adelante, para ejecutar una serie de pasos nuevos, o hacia atrás, para volver a ejecutar los mismos pasos. Ciertas instrucciones pueden transferir el control fuera del flujo secuencial normal añadiendo un valor de desplazamiento al IP.

43 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.

44 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.

45 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 bytes es un salto corto.

46 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 y posteriores). En un salto hacia adelante, el ensamblador aun no ha encontrado el operando designado:   JMP A90   A90:

47 Page 60,132 TITLE P08JUMP (COM) Uso de JMP para iterar. MODEL SMALL
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

48 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  |

49 El siguiente programa muestra el funcionamiento de la instrucción LOOP
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            DX,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  INT 21H MAIN     ENDP              END             MAIN

50 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  |

51 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 A 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

52 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 y el BX contiene 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

53 Las instrucciones siguientes de salto condicional se aplican a datos sin signo:
Cada una de estas pruebas las puede expresar en uno de dos códigos simbólicos de operación.

54 Saltos con base en datos con signo
Las instrucciones siguientes de salto condicional se aplican a datos con signo:

55 2.4 OPERADORES LOGICOS La lógica booleana es importante en el diseño de circuitos y tiene un paralelo en la lógica de programación. Las instrucciones para lógica booleana son AND, OR, XOR, TEST y NOT, que pueden usarse para poner bits en 0 o en 1 y para manejar datos ASCII con propósitos aritméticos. El formato general para las operaciones booleanas es:   [etiqueta :] | operación | {registro/memoria}, {registro/memoria/inmediato}| El primer operando se refiere a un byte o palabra en un registro o memoria y es el único valor que es cambiado. El segundo operando hace referencia a un registro o a un valor inmediato. La operación compara los bits de los dos operandos referenciados y de acuerdo con esto establece las banderas CF, OF, PF, SF y ZF.

56 AND. Si ambos bits comparados son 1, establece el resultado en 1
AND. Si ambos bits comparados son 1, establece el resultado en 1. Las demás condiciones dan como resultado 0. OR. Si cualquiera (o ambos) de los bits comparados es 1, el resultado es 1. Si ambos bits están en 0, el resultado es 0. XOR. Si uno de los bits comparados es 0 y el otro 1, el resultado es 1. Si ambos bits comparados son iguales (ambos 0 o ambos 1), el resultado es 0. TEST. Establece las banderas igual que lo hace AND, pero no cambia los bits de los operandos. Las operaciones siguientes AND, OR y XOR ilustran los mismos valores de bits como operandos:                               AND         OR       XOR                             0101        0101                                 0011        0011   Resultado:           0001        0111     

57 Es útil recordar la siguiente regla: el empleo de AND con bits 0 es 0 y el de OR con bits 1 es 1.
Ejemplos de operaciones booleanas. Para los siguientes ejemplos independientes, suponga que AL contiene y el BH contiene : 1.- AND        AL,BH        ;Establece AL a AND        AL,00H      ;Establece AL a AND        AL,0FH      ;Establece AL a OR          BH,AL        ;Establece BH a OR          CL,CL        ;Pone en uno SF y ZF 6.- XOR        AL,AL         ;Establece AL a XOR        AL,0FFH    ;Establece AL a   Los ejemplos 2 y 6 muestran formas de limpiar un registro, y ponerlo a cero. El ejemplo 3 pone a cero los cuatro bits mas a la izquierda de AL.

58 2.- TEST AL, 00000001B ; AL contiene JNZ ... ; un numero impar?
TEST actúa igual que AND, pero solo establece las banderas. Aquí están algunos ejemplos :   1.- TEST   BL, B  ; Alguno de los bits de mas a la       JNZ     ; izquierda es BL en diferentes de cero? 2.- TEST        AL, B        ; AL contiene       JNZ          ...                              ; un numero impar? 3.- TEST        DX, 0FFH                 ; El DX contiene       JNZ          ...                              ; un valor cero? La instrucción NOT. La instrucción NOT solo invierte los bits en un byte o palabra en un registro o en memoria; esto es, convierte los ceros en unos y los unos en ceros. El formato general es:   |  [etiqueta:]  |  NOT |  {registro/memoria} | Por ejemplo si el AL contiene  , la instrucción NOT AL cambia el AL a (el resultado es el mismo de XOR AL, 0FFH). Las banderas no son afectadas.

59 2.5 DESPLAZAMIENTO 2.5.1 LINEAL CIRCULAR Las instrucciones de corrimiento, que son parte de la capacidad lógica de la computadora, pueden realizar las siguientes acciones:   1. Hacer referencia a un registro o dirección de memoria. 2. Recorre bits a la izquierda o a la derecha. 3. Recorre hasta 8 bits en un byte, 16 bits en una palabra y 32 bits en una palabra doble. 4. Corrimiento lógico (sin signo) o aritmético (con signo). El segundo operando contiene el valor del corrimiento, que es una constante (un valor inmediato) o una referencia al registro CL. Para los procesadores 8088/8086, la constante inmediata solo puede ser 1; un valor de corrimiento mayor que 1 debe estar contenido en el registro CL. Procesadores posteriores permiten constantes de corrimiento inmediato hasta 31. El formato general para el corrimiento es     |  [etiqueta:]  |  Corrim.  |  {registro/memoria}, {CL/inmediato} |

60

61

62

63

64

65


Descargar ppt "2. ELEMENTOS DEL LENGUAJE 2.1 INTRODUCCIÓNES LINEALES"

Presentaciones similares


Anuncios Google