¿Cuál es la diferencia entre la instrucción de salto y llamada en 8051?

Bueno, en 8051 tenemos saltos absolutos y saltos relativos y también lo hacen las llamadas absolutas y las llamadas relativas. Contestaré en una perspectiva general.

La instrucción de salto llevará su puntero de instrucción (IP) al lugar desde donde desea que comience.

La llamada también hará lo mismo, llevará la IP a la ubicación especificada para ejecutar.

Pero hay una gran diferencia entre las instrucciones de salto y de llamada.
Cuando realiza una llamada, el controlador almacena automáticamente el valor de IP actual en la pila junto con el registro de estado del sistema actual o la palabra de estado del procesador en el caso de 8051 y el acumulador y otros registros importantes.

Usted puede preguntar por qué necesitamos todo esto?
Este es un concepto, y se llama cambio de contexto de una manera primitiva.

¿Por qué todo este drama? ¿Por qué no simplemente vamos, ejecutamos algo y volvemos? ¿Rito?
Bueno no. Suponga que está haciendo algo matemático, bueno, siempre están sucediendo cosas lógicas, por lo que hay un pero en PSW, la bandera de transporte o la bandera de transporte auxiliar. Si no guarda esto, realiza una función de llamada y hace algo allí para restablecer este indicador, vuelve a su programa principal y de repente se pierde. ¿Entiendes mi punto de rito? Es posible que haya hecho algo para configurar el CF, pero ahora lo ha restablecido en una subfunción a la que llamó utilizando la instrucción de llamada. Entonces, el contexto de la ejecución de su programa se pierde, ¿está de acuerdo conmigo?

Entonces, para recuperar su contexto de ejecución actual de una subrutina, use una instrucción llamada RET.
Esto mostrará todos los datos que se almacenaron durante la llamada de instrucción de llamada.

Así que para resumir,
Jump solo lo llevará a un lugar determinado en la memoria del programa.

Call también hará lo anterior, pero está asociado con la inserción de los registros de funciones especiales en la pila.
Una función de llamada siempre está asociada con una instrucción RET que le devolverá todos los datos.

Normalmente, una instrucción de llamada se usa para subrutinas que se llaman una y otra vez en un flujo de programa.

¡¡Espero que esto responda a su pregunta!!

  1. Una instrucción JMP cambia permanentemente el contador del programa. Una instrucción CALL deja información en la pila para que se pueda reanudar la secuencia de ejecución del programa original.
  2. CALL es una instrucción que transfiere el control del programa a una subrutina con la intención de volver al programa principal.
  3. Por lo tanto, en CALL 8086 guarda la dirección de la siguiente instrucción en la pila antes de bifurcarse a la subrutina.
  4. Al final de la subrutina, el control vuelve al programa principal utilizando la dirección de retorno de la pila. Hay dos tipos de LLAMADA: Cerca de LLAMADA y Far CALL.

Dado que Venkatesh Manchali ya respondió bastante bien, no profundizaré en los detalles de cómo se ejecuta en un controlador específico, en su lugar, trataré de darle un sentido más general.

Los saltos están destinados a pasar de una instrucción a otra. Podría basarse en una condición booleana que usted verificó previamente, haciendo que el salto sea un salto condicional, o podría estar saltando a una dirección absoluta indicada por una etiqueta.

En un sentido más general, el programador quiere alterar la ejecución del programa, omitir alguna parte del código, ejecutar algo solo en alguna condición especial.

Por otro lado, las instrucciones de llamada se utilizan para hacer que su programa sea más modular mediante la creación de subrutinas, lo que disminuye la reutilización de su código con el costo de una pequeña sobrecarga para cambiar el contexto. El guardado del contexto se realiza para que pueda volver a la siguiente instrucción que debe ejecutarse y su programa vea que no hubo cambios en la ejecución.

Ahora, un tipo similar de primitivas de programación también está disponible en un lenguaje de alto nivel como ir a la palabra clave reservada y la función de creación en C, donde goto es equivalente a JMP y la función de creación casi siempre hace una llamada a la subrutina.

De hecho, a veces su cadena de herramientas termina implementando las características anteriores utilizando las instrucciones JMP & CALL. A continuación se muestra el código que ilustra lo mismo, escrito en C y compilado para producir el ensamblaje para la máquina x86 de 32 bits utilizando la cadena de herramientas gcc.

archivo: quora_call_jmp.c

#include
int volátil;

int main ()
{

// printf (“Hola mundo \ n”);
si (a == 0)
ir a universo_paralelo;
print (“Gracias. \ n”);

universo paralelo:
printf (“Estoy en un universo paralizado: Aquí C es raro \ n”);

  1. La línea 9 del programa C (instrucción goto) se cambia a una instrucción JMP en el siguiente ensamblaje.
  2. También printf en la línea 10/13 en el programa C da como resultado la instrucción CALL en la línea 25/30 en el siguiente ensamblaje.

archivo: quora_call_jmp.s

.archivo “quora_call_jmp.c”
.comm a, 4,4
.sección .rodata
.align 8
.LC0:
.cadena “Thankgod. \ n”
.align 8
.LC1:
.string “Estoy en un universo paralizado: Aquí C es raro”
.texto
.globl principal
.type main, @function
principal:
pushq% rbp
movl% esp,% ebp
movl a (% rip),% eax
testl% eax,% eax
jne .L2
jmp .L3
.L2:
movl $ .LC0,% eax
movl% eax,% eax
movq% rax,% rdi
movl $ 0,% eax
llamada impresa
.L3:
movl $ .LC1,% eax
movl% eax,% eax
movq% rax,% rdi
call pone
popq% rbp
jubilado
.size main,.-main
.ident “GCC: (Ubuntu 4.8.4-2ubuntu1 ~ 14.04.3) 4.8.4”
.section .note.GNU-stack, “”, @ progbits

Larga historia corta

La instrucción de salto lo lleva a la dirección mencionada en el campo de operando.

La instrucción de llamada llevará el control del programa a la subrutina, ejecutará la subrutina y regresará a la dirección al lado de donde se llamó la instrucción de llamada.