2010-06-30 10 views
5

Es el ancho de la pila de 8 bits de ancho para la arquitectura IA32 y para todos los tipos de microprocesadores/microcontroladores.¿Cuál es el ancho de una pila en una arquitectura Intel IA32?

Actualmente estoy leyendo http://ozark.hendrix.edu/~burch/csbsju/cs/350/handouts/x86.html sobre el lenguaje ensamblador. En la explicación de "llamar", dice que el puntero de la pila se está reduciendo en 4 y el contador del programa se introduce en la pila. ¿Esto significa que el ancho del buffer de la pila es de 8 bits de ancho porque el contador del programa tiene 32 bits de largo? Intenté encontrarlo en el manual de desarrollo de software de arquitectura Intel IA32 pero parece que no lo puedo confirmar.

Gracias Sziang

Respuesta

4

En la arquitectura IA32, la memoria se abordan en bytes.

Por lo tanto, con el fin de introducir otras 4 bytes en la pila, es necesario desplazar el puntero de pila por 4.

+0

Tengo la sensación de que hay un bot de downvote o un error en alguna parte ... Esto parece estar sucediendo mucho, de repente. – Cogwheel

+0

+1, fwiw ... (más personajes) – Cogwheel

+0

Gracias anon y cremallera, esta es la respuesta que estoy buscando. respetos sziang – sziang

2

Esto significa que 8 bits es la unidad direccionable más pequeña de memoria en el conjunto de instrucciones (un byte) Todas las direcciones de memoria en IA32 representan un múltiplo de 8 bits de desplazamiento en RAM.

+0

-1 ¡el ancho de la pila en IA32 es de 16 bits! –

+0

@GJ No dije nada sobre el ancho de la pila. El OP se preguntaba por qué presionar un valor de 32 bits movía el puntero de la pila a 4. La razón es porque el puntero de la pila almacena una dirección de memoria y las direcciones de memoria se basan en Bytes. Mi respuesta no está equivocada, y de hecho el asker aceptó una respuesta casi idéntica que vino unos segundos antes que la mía. – Cogwheel

+0

@Cogwheel pero la pregunta era: ¿Cuál es el ancho de una pila en una arquitectura Intel IA32? –

3

Las operaciones que introducen valores en "la pila" para una CPU x86 (por ejemplo, operaciones relacionadas con ESP, como PUSH, CALL, etc.) presionan incrementos de 4 bytes. El ancho efectivo de la pila es de 4 bytes/32 bits. Si está codificando para una CPU x64, tiene 8 bytes de ancho, pero usted preguntó por IA32.

Siempre he tenido el puntero de la pila alineado en un límite de 4 bytes (DWORD). No sé si puedes DWORD-desalinear la pila y hacer que funcione correctamente; si lo hace, pagará una penalización grave de rendimiento cuando acceda a la memoria para empujones y saltos (lo que se hace con mucha frecuencia en el código real) porque el procesador real quiere leer en pequeños fragmentos de tamaño de potencia de dos.

+3

Del manual de referencia de Intel, descripción de la instrucción PUSH: no hay ninguna instrucción como "pulsar al". "push imm8" ajusta la pila según el tamaño del puntero de pila: "El atributo de tamaño de dirección del segmento de pila determina el tamaño del puntero de pila (16, 32 o 64 bits) [página 4-320 Referencia del conjunto de instrucciones de volumen B]" . Entonces, si se ejecuta en modo de 16 bits, empujará 16 bits, pero no considero que sea el modo "IA32" al menos no en el espíritu de la pregunta. (No he codificado un impulso de stack de 16 bits desde 1987). –

+1

En realidad, 1 es también una pequeña potencia de dos :-) Y me sorprende que conozca el año exacto en que codificó por última vez un impulso de 16 bits. Pero +1 por educarme. No me di cuenta de que eran empujes de 32 bits, independientemente del tamaño del operando. Supongo que he estado fuera del mundo de los robots por mucho tiempo. – paxdiablo

+0

Bastante fácil de recordar; ese es el año en que obtuve mi primer chip Pentium y una verdadera caja Unix. No más cosas de 16 bits. –

3

Esta es la primera vez que oigo hablar de "ancho de la pila".

push/pop/call/ret tienen un ancho predeterminado (que coincide con el modo de funcionamiento de los procesadores). Pero la pila per se no tiene ancho. (La alineación es una historia totalmente diferente.)

A partir de los documentos de Intel (por empuje):

"In non-64-bit modes: if the address-size and operand-size attributes are 32, 
the 32-bit ESP register (stack pointer) is decremented by 4. 
If both attributes are 16, the 16-bit SP register (stack pointer) 
is decremented by 2." 

[...]

"In 64-bit mode, the instruction’s default operation size is 64 bits. 
In a push, the 64-bit RSP register (stack pointer) is decremented by 8." 

Para los manuales (que siempre tiene la última palabra) verificar: Intel Processor Manuals

Cuestiones relacionadas