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:
Este comentario ha sido eliminado por el autor.
ResponderEliminarSOY UN SALADO BIEN SALADITO DICE: BUENA!!!
ResponderEliminarCOMO LLEGUE AQUI ? :V
ResponderEliminar