¿Qué otros problemas pueden surgir al usar la instrucción JMP para navegar a través de subrutinas en lugar de usar la instrucción CALL / RETURN?

0

HeestadocreandouninformesobreporquélainstrucciónJUMPnodebeusarseenelfragmentodecódigoanterioryensulugar,lasinstruccionesCALL/RETURNdebenusarseparanavegarporlassubrutinas.

Entiendoqueelcódigonuncallegaráaback2:porqueestáusandoelcomandodesaltoycontinuaráhaciendounbucleentreback1:ylarutinadeCalculateNextPower.

¿Estaríaenlocorrectoaldecirque:

  • lainstruccióndesaltonoempujalainstrucciónaunapilaydacomoresultadoquenopuedasvolveradondehassaltado.

  • Alusarlallamada,evitaqueempujesamuchasdireccionesalapilaporrecursióncomoloharíalainstrucciónJUMP.Estopuedecausarundesbordamientodepila/recursióndecolaypuederesultarenquenoobtengaelresultadodelcálculohastaquehayaregresadoutilizandolallamadayladevolución?

Creoquelohehechomáscomplicadodeloquees,leídoenmuchossitiosymeheconfundidoconlosmotivosporlosquedeberíausarseenlugardelainstruccióndesalto,apartedenopoderobteneralarutina"back2:".

Aprecio cualquier ayuda para aclarar esto, soy nuevo en este tipo de trabajo

    
pregunta Will

1 respuesta

4

¿Cuántos conceptos erróneos, por dónde empezar ...?

Primero, el problema real con su código es un bucle mal diseñado. No es que CalculateNextPower esté inmediatamente antes del bucle y al final del bucle. Este código simplemente debe ponerse en línea al comienzo del bucle, justo debajo de Back1. Entonces no habría ninguna necesidad de saltar o llamar al código fuera del bucle.

Segundo, nada empuja una instrucción en la pila. Las instrucciones de LLAMADAS generalmente empujan direcciones en una pila. Esa es la dirección de la instrucción que sigue a la llamada. La instrucción RETURN saca esta dirección de la pila y salta a ella, por lo que regresa inmediatamente después de la instrucción CALL.

En general, el punto del mecanismo de LLAMADA / RETORNO es permitir la ejecución de un fragmento de código en múltiples rutinas, pero el código solo existe una vez en la memoria. CALL / RETURN permite desviar temporalmente la ejecución a una única pieza de código reutilizable, y luego regresar a donde estaba.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas