Header Ads

Título Título Título Título Título

TAREA RESUMEN SALTOS












controlando el flujo del programa es una cosa muy importante, aquí es donde el programa puede tomar decisiones de acuerdo a ciertas condiciones


La instrucción básica que transfiere el control a otro punto del programa es JMP.

La sintaxis básica de JMP instrucción:

                          JMP etiqueta

Para declarar una etiqueta en su programa, sólo tiene que escribir su nombre y añadir ":" al final, la etiqueta puede ser cualquier combinación de caracteres pero no puede comenzar con un número, por ejemplo, aquí hay 3 definiciones de etiquetas legales:


                        label1: 
                        label2: a: 

Etiqueta puede ser declarado en una línea separada o ante cualquier otra instrucción, por ejemplo:

                         x1:
                           MOV AX, 1
                                     
                        x2: MOV AX, 2

he aquí un ejemplo de JMP instrucción: 


Por supuesto, hay una manera más fácil para calcular la parte de dos números, pero aún así es un buen ejemplo de JMP instrucción. Como se puede ver en este ejemplo JMP es capaz de transferir el control hacia adelante y hacia atrás. Se puede saltar en cualquier lugar en el segmento de código actual (65.535 bytes).





diferente a JMP instrucción que hace un salto incondicional, hay instrucciones que hacen a los saltos condicionales (Ir sólo cuando algunas condiciones están en acto). Estas instrucciones se dividen en tres grupos, el primer grupo sólo prueba sola bandera, la segunda compara con números firmado, y la tercera se compara con números sin signo. 



como ya se puede notar que hay algunas instrucciones que hacen que lo mismo, que es correcta, incluso se ensamblan en el mismo código de máquina, por lo que es bueno recordar que cuando se compila es eS de instrucciones - obtendrá lo desmontado como: JZ, JC se monta el mismo que JB etc... 

Diferentes nombres se utilizan para hacer los programas más fácil de entender, con el código y lo más importante a tener en cuenta. muy compensado simulador no tiene idea de lo que la instrucción original se ve como es por eso que utiliza el nombre más común. 

Si emular este código se verá que todas las instrucciones se ensamblan en JNB, del código de operación (código de operación) de esta instrucción es 73h esta instrucción posee un número fijo de dos bytes, el segundo byte es el número de bytes que se suman a la IP registrarse si la condición es verdadera. Puesto que la instrucción tiene sólo 1 byte para mantener el desplazamiento que se limita a pasar el control a -128 bytes de espalda o 127 bytes hacia adelante, este valor siempre es firmado


  





En general, cuando se requiere para comparar los valores numéricos CMP se utiliza la instrucción (que hace lo mismo que SUB ( restar de instrucciones), pero no a mantener el resultado, solo afecta a las banderas). 

La lógica es muy simple, por ejemplo: se requiere para comparar 5 y 2, 5 - 2 = 3 el resultado no es cero (la bandera se establece en cero 0). 

Otro ejemplo: se requiere para comparar 7 y 7, 7 - 7 = 0 el resultado es cero! (Flag de cero se establece en el resultado es cero! (Flag de cero se establece en el resultado es cero! (Flag de cero se establece en el resultado es cero! (Flag de cero se establece en el resultado es cero! (Flag de cero se establece en el resultado es cero! (Flag de cero se establece en el resultado es cero! (Flag de cero se establece en 1 y SO o es eS va a hacer el salto). 



Probar el ejemplo anterior con diferentes números de AL y BL, banderas abiertos haciendo clic en el botón de banderas, utilizan solo paso y ver lo que sucede. puedes usar F5 tecla de acceso directo a recompilar y volver a cargar el programa en el emulador. 




  


Bucles son básicamente los mismos saltos, es posible codificar bucles sin utilizar la instrucción de bucle, sólo por el uso saltos condicionales y comparar, y esto es justamente lo que hace bucle. todas las instrucciones de bucle utilizan CX registrarse para contar pasos, como saben registro CX tiene 16 bits y el valor máximo que puede contener es 65535 o FFFF, 

Sin embargo, con cierta agilidad es posible poner un bucle a otro, y otro en otro dos, y tres y etc ... y recibir un valor agradable de 65535 * 65535 * 65535 .... hasta el infinito .... o el final de la memoria RAM o memoria de pila. es posible almacenar el valor original de registro CX usando empuje cx instrucción y devolverlo al original cuando el bucle interno termina con pop cx, por ejemplo: 




bx cuenta el número total de pasos, de forma predeterminada emulador muestra los valores en hexadecimal, puede hacer doble clic en el registro a ver el valor de todas las bases disponibles. 

Al igual que todos los demás saltos condicionales bucles tienen un compañero opuesto que puede ayudar a crear soluciones, cuando la dirección de ubicación deseada está demasiado lejos montar automáticamente reúne instrucción de salto inverso y largo, haciendo total de 5 bytes en lugar de sólo 2, se puede observar en el desensamblador también



Todos los saltos condicionales tienen una gran limitación, a diferencia JMP de instrucciones que sólo pueden saltar 127 bytes hacia adelante y 128 bytes hacia atrás (tenga en cuenta que la mayoría de las instrucciones se ensamblan en 3 o más bytes). 

Podemos fácilmente evitar esta limitación usando un truco lindo: 
 -Obtener una instrucción de salto condicional opuesta a la tabla anterior, hacen que pase a label_x. 
- Utilizar JMP instrucciones para saltar a la ubicación deseadaión
- Define label_x: justo despues de la JMP instruccion

label_x: - puede ser cualquier nombre de etiqueta válido, pero no debe haber dos o más etiquetas con el mismo nombre.




 Otro método, sin embargo, rara vez se utiliza está proporcionando un valor inmediato en lugar de la etiqueta. Cuando un valor inmediato comienza con $ se realiza salto relativo, de lo contrario el compilador calcula instrucción que salta directamente al offset dado. Por ejemplo: 






Procedimiento es una parte de código que se puede llamar desde su programa con el fin de realizar alguna tarea específica. Procedimientos hacen que el programa más estructural y más fácil de entender. Generalmente procedimiento vuelve al mismo punto desde donde fue llamado

La sintaxis de declaración de procedimiento:

name PROC


      ; here goes the code
      ; of the procedure ...



RET
name ENDP


NAME - es el nombre del procedimiento, el mismo nombre debe estar en la parte superior y la parte inferior, esto se utiliza para comprobar el cierre correcto de los procedimientos. Probablemente, usted ya sabe que DERECHO la instrucción se utiliza para volver al sistema operativo. La misma instrucción se utiliza para volver de régimen (sistema operativo en realidad ve su programa como un procedimiento especial). 

PROC y ENDP son directivas del compilador, por lo que no se ensamblan en cualquier código de máquina real. Compilador solo se acuerda de la dirección del procedimiento. 

CALL la instrucción se utiliza para llamar a un procedimiento. 



El ejemplo anterior llama al procedimiento M1, hace MOV BX, 5, y devuelve a la siguiente instrucción después de LLAMADA: MOV AX, 2. 

Hay varias maneras de pasar parámetros a procedimiento, la forma más fácil de pasar parámetros es mediante el uso de registros, aquí es otro ejemplo de un procedimiento que recibe dos parámetros en AL y BL registros, multiplica estos parámetros y devuelve el resultado en AX registro: 




En el ejemplo anterior valor de AL registro es actualizar cada vez que se llama al procedimiento, BL registro se mantiene sin cambios, por lo que este algoritmo calcula 2 en poder de 4, resultado hasta el final en AX registro es 16 ( o 10h). 




Aquí va otro ejemplo, que utiliza un procedimiento para imprimir un Hola Mundo! mensaje: 



" b." - prefijo antes [SI] significa que tenemos que comparar bytes, no palabras. Cuando es necesario comparar las palabras añaden " w ". prefijar su lugar. Cuando uno de los operandos comparados es un registro que no es necesario porque compilador sabe el tamaño de cada registro.





Las macros son como los procedimientos, pero no realmente. Las macros se parecen a los procedimientos, sino que existen sólo hasta que se compila el código, después de la compilación de todas las macros son reemplazadas con las instrucciones reales. Si usted declaró una macro y nunca lo utilizó en su código, el compilador simplemente ignorarlo. emu8086.inc es un buen ejemplo de cómo se pueden utilizar las macros, este archivo contiene
varias macros para realizar la codificación más fácil para usted 


A diferencia de los procedimientos, las macros se deben definir por encima del código que la usa, por ejemplo:



El código anterior se expande en:


MOV AX, 00001h
MOV BX, 00002h
MOV CX, 00003h
MOV AX, 00004h
MOV BX, 00005h

MOV CX, DX 




Cuando se desea utilizar un procedimiento que debe usar LLAMADA la instrucción, por ejemplo: 

              CALL MyProc 

• Cuando se desea utilizar una macro, solo tendrá que teclear su nombre. Por ejemplo: 

                  MiMacro

 • Procedimiento se encuentra en alguna dirección específica en la memoria, y si se utiliza el mismo procedimiento 100 veces, la CPU transferirá el control a esta parte de la memoria. El control será devuelto de nuevo al programa de DERECHO instrucción. los apilar se utiliza para mantener la dirección de retorno. los LLAMADA instrucción se lleva alrededor de 3 bytes, por lo que el tamaño del archivo ejecutable de salida crece muy insignificante, no importa cuántas vez que se utiliza el procedimiento. 

• Macro se expande directamente en el código del programa. Así que si se utiliza la misma macro 100 veces, el compilador expande las macros 100 veces, haciendo que el archivo más grande y más grande es el ejecutable de salida, cada vez que se insertan todas las instrucciones de una macro.

 • Deberías usar apilar o cualquier registros de propósito general para pasar parámetros a procedimiento. • Para pasar parámetros a macro, sólo puede escribirlas después del nombre de macro. Por ejemplo: 

MyMacro 1, 2, 3

 • Para marcar el final de la macro ENDM Directiva es suficiente. 

• Para marcar el final del procedimiento, debe escribir el nombre del procedimiento ante el FIN directiva. 
-------------------------------------------------------------------------------


Las macros se expanden directamente en el código, por lo tanto, si hay etiquetas dentro de la definición de la macro que puede obtener el error "declaración duplicado" cuando se utiliza macro para dos o más veces. Para evitar tal problema, utilice LOCAL Directiva seguido de los nombres de las variables, etiquetas o nombres de procedimiento. Por ejemplo:





3 comentarios:

Gracias por dejarnos tu duda,

Con la tecnología de Blogger.