assembly - ¿Dónde exactamente está la zona roja en x86-64?
abi red-zone (2)
Teniendo en cuenta estas dos citas, ¿la zona roja está arriba de la dirección de devolución apilada o debajo de la dirección de devolución apilada?
La zona roja es 128 bytes justo debajo de rsp
, es decir, rsp - 128
a rsp - 1
.
Dado que esta zona roja es relativa a RSP, ¿se mueve hacia abajo con cada empuje y se mueve hacia arriba con cada pop?
Sí.
De la Wikipedia :
En informática, una zona roja es un área de tamaño fijo en el marco de pila de una función más allá de la dirección de retorno que no se conserva por esa función. La función llamada puede usar la zona roja para almacenar variables locales sin la sobrecarga adicional de modificar el puntero de la pila. Esta región de memoria no debe ser modificada por manejadores de interrupción / excepción / señal. El ABI x86-64 utilizado por System V exige una zona roja de 128 bytes, que comienza directamente después de la dirección de retorno e incluye los argumentos de la función . La cadena de herramientas OpenRISC asume una zona roja de 128 bytes.
Del sistema V x86-64 ABI :
El área de 128 bytes más allá de la ubicación apuntada por% rsp se considera reservada y no debe ser modificada por manejadores de señal o interrupción. Por lo tanto, las funciones pueden usar esta área para datos temporales que no se necesitan a través de llamadas a funciones. En particular, las funciones de hoja pueden usar esta área para todo el marco de pila, en lugar de ajustar el puntero de pila en el prólogo y el epílogo. Esta área se conoce como la zona roja.
Teniendo en cuenta estas dos citas, ¿la zona roja está arriba de la dirección de devolución apilada o debajo de la dirección de devolución apilada?
Dado que esta zona roja es relativa a
RSP
, ¿se mueve hacia abajo con cadapush
y se mueve hacia arriba con cadapop
?
El artículo de Wikipedia sobre la Zona Roja estaba equivocado, creando así la ambigüedad.
Modifiqué el artículo en abril de 2017 para solucionar el problema. A partir de esa actualización, el artículo de Wikipedia dice:
En informática, una zona roja es un área de tamaño fijo en el marco de pila de una función más allá del puntero de pila actual que no está preservado por esa función. La función llamada puede usar la zona roja para almacenar variables locales sin la sobrecarga adicional de modificar el puntero de la pila. Esta región de memoria no debe ser modificada por manejadores de interrupción / excepción / señal. El ABI x86-64 utilizado por System V exige una zona roja de 128 bytes, que comienza directamente por debajo del valor actual del puntero de la pila . La cadena de herramientas OpenRISC asume una zona roja de 128 bytes
Esto hace que el artículo de Wikipedia esté más en línea con la definición ABI del sistema V de 64 bits. Con la ambigüedad arriba resuelta, con respecto a la pregunta:
Dado que esta zona roja es relativa a RSP, ¿se mueve hacia abajo con cada empuje y se mueve hacia arriba con cada pop?
La zona roja siempre es de 128 bytes justo debajo de RSP . A medida que RSP cambia (por PUSH / POP / MOV, etc.) también lo hace la ubicación de la Zona Roja .