2010-04-06 17 views
11

he llegado a aprender que no se puede empujar un byte directamente sobre la pila del procesador Intel Pentium, ¿alguien puede explicar esto a mí por favor?¿Por qué no es posible insertar un byte en una pila en Pentium IA-32?

La razón por la que me han dado es debido a que el registro ESP es direccionable palabra (o, que es el supuesto en nuestro modelo) y debe ser un "siquiera la cuestión". Hubiera supuesto que disminuir el valor de un número binario de 32 bits no interferiría con la alineación del registro, pero aparentemente no entiendo lo suficiente.

He intentado algunas pruebas NASM y creo que si declaro una variable (mordida db 123) y la presiono sobre la pila, esp se reduce en 4 (lo que indica que empujó 32 bits?). Pero, "empuje bytes mordida" (lo siento por mi elección de nombres de variables) dará lugar a un error de tipo:

test.asm: 10: error: no compatible no de 32 bits reubicación ELF

Cualquier palabra de la sabiduría sería muy apreciada durante este tiempo problemático. Soy primer año de pregrado, así que lamento mi ingenuidad en todo esto.

Respuesta

4

Su función de cómo se creó la pila:

The address-size attribute of the stack segment determines the stack pointer size (16, 32 or 64 bits). The operand-size attribute of the current code segment determines the amount the stack pointer is decremented (2, 4 or 8 bytes).

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.

Fuente: http://www.intel.com/Assets/PDF/manual/253667.pdf

pg. 4-320 vol. 2B

Edición

sólo quería señalar también que una lectura interesante es la sección en pilas en el manual, se explicará la creación de un segmento de pila más.

http://www.intel.com/Assets/PDF/manual/253665.pdf

Capítulo 6.2

+0

Muy informativo, pero lamentablemente todavía está por encima de lo que puedo comprender con mi conocimiento actual. –

+0

@Tim - Comprensible. Quizás aún vale la pena leerlo rápidamente. –

+0

Espera, espera. Cada ubicación de memoria tiene 32 bits de ancho, por lo que si presionas un valor, se reducirá la pila en 4 bytes, porque 4 * 8 es de 32 bits, y si la decrementara en 2, entonces trataría de hacer un desalineado leer, implosionar el universo? ¿Es eso correcto? Si es así, obtienes los puntos, ese PDF fue increíble (2º). –

0

El puntero de pila debe ser (por algunas razones Optimización) alineado 4B -> debe ser divisible por cuatro (y, por lo tanto, tener últimos 2 bits cero).

+0

Si bien esto tiene sentido, la respuesta de Yully lo explica de abajo hacia arriba. Gracias de todos modos :) –

8

Se va a hacer el puntero de pila no es capaz de hacer su trabajo en algunos casos. por ejemplo, supongamos que tiene una función que introduce un byte en la pila y luego llama a otra función. La llamada terminará tratando de escribir una dirección de retorno desalineada en la pila, dando como resultado un error.

+0

Perfecto, gracias :) –

0

lo que quiere hacer es usar los códigos de rotación de bit para rotar a través de cada ubicación de memoria de 32 bits, colocando 8 bits a la vez en el registro hasta que haya girado nuevamente a las posiciones de bit de inicio. ahora debe tener 4 cantidades de 8 bits alineadas una al lado de la otra en su registro de 32 bits. ahora empuja eso en la pila y listo.

+0

Lo siento, eso no tiene mucho sentido para mí. –

Cuestiones relacionadas