2011-08-21 8 views
7

Estoy aprendiendo el ensamblaje x64 en Windows para 'divertirme'. El MSDN documentation for the x64 calling convention on Windows dice:En Win64 ABI, ¿se puede usar el espacio de pila de argumentos reservados para el almacenamiento de uso general?

la persona que llama es responsable de asignar espacio de parámetros al destinatario de la llamada, y siempre debe asignar espacio suficiente para los 4 parámetros de registro, incluso si el destinatario de la llamada no tiene esa cantidad de parámetros. Esto ayuda en la simplicidad de soportar funciones sin prototipo C y funciones vararg C/C++.

Como mis funciones no son funciones de C unprototyped o varargs C/C funciones ++, ¿significa que siempre se puede utilizar [rsp+8]-[rsp+32] (suponiendo un valor no modificada de rsp justo después de una llamada) para el almacenamiento de propósito general dentro de mi función , como para las variables locales?

Respuesta

6

Sí, puede usar el espacio de raspado del parámetro de entrada para cualquier propósito. Pero ya lo sabía: el permiso para hacer esto ya está implícito en la legalidad de modificar los parámetros de entrada.

void somefunction(int arg1) 
{ 
    arg1 = anyvalue; // mov [rsp+8], anyvalue 
} 
+0

Gracias por la respuesta clara. Sin embargo, la modificación de los parámetros de entrada sería más bien 'mov rcx, anyvalue' ya que el argumento se pasa a través de' rcx', por lo que no estaba seguro de '[rsp + 8]'. – Trillian

+3

Pero también se le permite derramar los parámetros de entrada. Es por eso que el espacio reservado está allí, después de todo. 'void somefunction (int arg1) {/ * spill: mov [rsp + 8], rcx */arg1 = anyvalue;/* mov [rsp + 8], anyvalue * /} ' –

1

Creo que lo que está tratando de hacer es más o menos así:

*(decltype(&anyvalue))((PBYTE)&arg1+8) = anyvalue; // mov [rsp+8+8], anyvalue 

Por lo que yo entiendo, Microsoft afirma que usted está obligado a asignar suficiente espacio para que el destinatario de la llamada para almacenar cuatro registra (rcx, rdx, r8. r9), incluso en una función que toma solo un argumento (en rcx).

Nota: Lo siento por el código c feo y el casting de la vieja escuela se mezcla con la nueva palabra clave decltype

Cuestiones relacionadas