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.

En qué registros se pasan los parámetros de función en la arquitectura x86_64 (Mac OS) de C++?

Actualmente estoy leyendo un libro sobre ensamblador para la arquitectura x86_64. Estoy usando extern “C” para llamar a un ensamblador desde cpp. El tipo está codificando en Visual Studio y dice que cpp carga los argumentos de la función en los registros eax, edx, R8D y R9D.
Esta es la función en la que estoy trabajando:
c++
extern "C" integer_add(int a, int b, int c, int d);
// Algunas instrucciones de mov, add y sub se ejecutan en el ensamblador

Mi pregunta es: ¿puedo asumir que cpp carga los parámetros en estos registros o no? Él está usando MASM, que creo que es para Windows (hasta ahora he trabajado con NASM, estoy en Mac por si eso significa algo) y si no, ¿cómo sé dónde puedo encontrar mis parámetros? Técnicamente hablando, viniendo de lenguajes de nivel superior, supongo que todo esto debería suceder en la pila, pero él no parece empujar o sacar nada. Esto es lo que encontré en Wikipedia: RDI, RSI, RDX, RCX, R8, R9, [XYZ]MM0-7, por lo que parece que estos son los registros que utilizan gcc, Intel C++ en Linux y MACOS. ¿Importa el orden, es decir, el primer parámetro se carga en rdi, el segundo en rsi y así sucesivamente…? Gracias por tu ayuda.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, no tengo experiencia personal en escribir códigos de ensamblador o programación en C++ por mi cuenta. Sin embargo, en base a mis conocimientos de programación, intentaré ayudarte lo mejor que pueda.

    Para responder a tu pregunta, la asignación de registros para pasar parámetros de función en la arquitectura x86_64 varía entre diferentes compiladores y sistemas operativos. Por lo tanto, no puedes asumir que los parámetros siempre se cargan automáticamente en los registros eax, edx, r8d y r9d.

    En macOS y Linux, el ABI (Application Binary Interface) System V especifica el siguiente orden de asignación de registros para los parámetros de la función:

    • El primer argumento entero (hasta 64 bits) se pasa en el registro rdi.
    • El segundo argumento entero (hasta 64 bits) se pasa en el registro rsi.
    • El tercer argumento entero (hasta 64 bits) se pasa en el registro rdx.
    • El cuarto argumento entero (hasta 64 bits) se pasa en el registro rcx.
    • El quinto argumento entero (hasta 64 bits) se pasa en el registro r8.
    • El sexto argumento entero (hasta 64 bits) se pasa en el registro r9.

    Si el parámetro es más grande que 64 bits o es un valor de punto flotante, típicamente se pasa en la pila o en los registros XMM(0-7).

    En macOS, las reglas de asignación de registros son las mismas que en Linux, pero macOS utiliza una convención de llamada diferente para las funciones que devuelven estructuras. El llamador pasa un puntero a un búfer de memoria en el primer registro de argumento (rdi), y el llamado devuelve la estructura llenando el búfer.

    En resumen, debes consultar el documento ABI específico de la plataforma y compilador que estés utilizando para asignar correctamente los registros para los parámetros de la función.

Comments are closed.