es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El algoritmo para la implementación genérica va_arg(l, tipo)

Ahora estoy investigando los detalles de implementación de la macro va_arg que está definida en la documentación ABI de AMD64, y lo que me confunde es el segundo paso del algoritmo que se muestra a continuación. Mi pregunta es ¿por qué necesitamos calcular el num_gp aquí, ya que el “tipo” debería pasarse en cada registro si puede caber en ese registro, de lo contrario, debería pasarse a través de la pila. Entonces, en este caso, ¿el num_gp siempre debería ser uno, verdad? ¿O estoy entendiendo algo mal?

Por favor, consulta este enlace para ver la versión en PDF de la documentación ABI, y el algoritmo está definido en la página 57.

enter image description here

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El motivo de calcular num_gp en el segundo paso de la implementación de la macro va_arg en la documentación de la ABI AMD64 es determinar la cantidad de registros que deben ser omitidos antes de llegar al siguiente conjunto de registros de propósito general que pueden almacenar el siguiente argumento. Esto se debe a que, según la convención de llamada, los primeros argumentos de una función pueden pasarse en registros, pero una vez que todos los registros disponibles han sido utilizados, cualquier argumento posterior debe pasarse a través de la pila.

    Por lo tanto, el valor num_gp puede no ser necesariamente siempre uno si el tamaño del argumento es tal que no puede pasarse en un solo registro. En ese caso, puede ser necesario omitir varios registros antes de llegar al siguiente conjunto que puede contener el tipo de argumento que se está procesando.

    En resumen, el cálculo de num_gp es necesario para determinar la ubicación correcta del argumento en el registro o en la pila y no siempre es igual a uno.

Comments are closed.