2009-02-07 7 views
18

¿En qué se diferencian las instrucciones JUMP y CALL? ¿Cómo se relaciona con los conceptos de nivel superior, como un GOTO o una llamada de procedimiento? (Estoy en lo correcto en la comparación?)JUMP y LLAME

Esto es lo que pienso:

salto o GOTO es una transferencia del control a otra ubicación y el control no vuelve automáticamente al punto desde donde se llama .

Por otro lado, una LLAMADA o llamada de procedimiento/función vuelve al punto desde donde se llama. Debido a esta diferencia en su naturaleza, los lenguajes generalmente hacen uso de una pila y un marco de pila se empuja para "recordar" la ubicación para volver por cada procedimiento llamado. Este comportamiento también se aplica a los procedimientos recursivos. En caso de recursión de cola, sin embargo, no es necesario "empujar" un marco de pila para cada llamada.

Sus respuestas y comentarios serán muy apreciados.

Respuesta

20

En su mayoría tiene razón, si habla de CALL/JMP en el ensamblaje x86 o algo similar. La diferencia principal es:

  • JMP realiza un salto a un lugar, sin hacer nada más
  • LLAMADA empuja el puntero de instrucción actual en la pila (mejor dicho: una después de la instrucción en curso), y luego JMP a la ubicación. Con un RET puedes volver a donde estabas.

Normalmente, CALL es solo una función de conveniencia implementada mediante JMP. Puede hacer algo como

  movl $afterJmp, -(%esp) 
      jmp location 
afterJmp: 

en lugar de a CALL.

+0

Cuando dices: "CALL es solo una función de conveniencia implementada usando JMP". ¿Eso significa que CALL no es atómico (instrucción de un procesador)? – Anzurio

+1

¿Quiere decir que en un hilo podría interrumpirse entre el movimiento, pero antes de la jmp en sí, si una LLAMADA se implementara como dos instrucciones? Mirando los documentos: http://www.intel.com/Assets/PDF/manual/253666.pdf, dice que el procedimiento primero mueve la dirección en la pila, y luego el salto, indicando claramente esto como una secuencia. No veo por qué debería ser atómico, además, ¿cómo importaría? Es lo mismo que si te interrumpieran justo después del jmp, ya que el jmp es incondicional. – Anteru

+1

Si 'CALL' recuerda desde donde saltó, significa que demasiados' CALL's pueden desbordar la pila (si no 'RET'urn), mientras que con' JMP' es imposible corromper la pila, pero en Por otro lado, no puedes retroceder a menos que hayas almacenado la (s) ubicación (es) desde donde saltó. ¿Es eso correcto? El 'goto' de C debería ser igual a' JMP' en este caso. – CoDEmanX

0

Creo que tiene la idea general.

Depende de la arquitectura, pero, en general, a nivel de hardware:

  • Una instrucción de salto cambiará el program counter continuar la ejecución en una parte diferente del programa.

  • Una instrucción de llamada empujará la ubicación actual del programa (o la ubicación actual + 1) al call stack y saltará a otra parte de un programa. Una instrucción de retorno saltará la ubicación de la pila de llamadas y saltará a la ubicación original (o la ubicación original + 1).

Por lo tanto, una instrucción de salto está cerca de una GOTO, mientras que una instrucción de llamada está cerca de una llamada de procedimiento/función.

Además, debido a que se usa una pila de llamadas al hacer llamadas a funciones, al presionar demasiadas direcciones de retorno a la pila de llamadas por recursión se generará un stack overflow.

Cuando conozco el ensamblaje, me resulta más fácil cuando se trata de procesadores RISC que de procesadores x86, ya que tiende a tener menos instrucciones y operaciones más simples.

1

Tiene razón sobre la diferencia entre un salto y una llamada.

En el caso de muestra de una sola función con recursividad de cola, entonces el compilador puede reutilizar el marco de pila existente. Sin embargo, puede ser más complicado con funciones mutuamente recursivas:

void ping() { printf("ping\n"); pong(); } 
void pong() { printf("pong\n"); ping(); } 

Considérese el caso en ping() y pong() son funciones más complejas que tienen diferentes números de parámetros. Mark Probst's paper habla sobre la implementación de recurrencia de cola para GCC en gran detalle.

-2

De acuerdo con el microprocesador, primero se verifica la condición y luego realiza operaciones de salto (va a otro código) y no regresa. La operación de llamada es como una llamada de función en el lenguaje c y cuando se realiza la función, vuelve para completar su ejecución.

+0

Dado que 'CALL' no realiza ninguna comprobación de condición, las únicas instrucciones de salto válidas para una comparación son' JMP', que salta ** incondicionalmente **. – CoDEmanX

0

Una corrección a sus pensamientos: Es no sólo con la cola recursividad, pero por lo general con la cola llama, que no necesitará el marco de pila y por lo tanto no podría simplemente JMP (siempre que los argumentos se han establecido arriba correctamente).

Cuestiones relacionadas