2010-04-06 11 views
11

Sono venuto a sapere che non si può spingere un byte direttamente sullo stack di Intel Pentium, qualcuno può spiegarmelo per favore?Perché non è possibile inserire un byte su una pila su Pentium IA-32?

Il motivo che mi è stato dato è perché il registro esp è indirizzato alla parola (o, questo è l'assunto nel nostro modello) e deve essere un "indirizzo uniforme". Avrei pensato di decrementare il valore di qualche numero binario a 32 bit che non avrebbe incasinato l'allineamento del registro, ma apparentemente non capisco abbastanza.

Ho provato alcuni test NASM e ho scoperto che se dichiaro una variabile (bite db 123) e la sposto nello stack, esp è decrementata di 4 (indicando che ha spinto 32 bit?). Ma, "push byte morso" (scusate per la mia scelta di nomi di variabili) si tradurrà in un errore di genere:

test.asm: 10: errore: non supportato non a 32 bit delocalizzazione ELF

Alcune parole di la saggezza sarebbe molto apprezzata durante questo periodo travagliato. Sono uno studente di primo anno così dispiaciuto per la mia ingenuità in tutto questo.

risposta

4

La sua base a come è stato creato lo stack:

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.

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

pg. 4-320 Vol. 2B

Modifica

Volevo solo far notare, inoltre, che una lettura interessante è la sezione sulle pile del manuale, si spiegherà creando inoltre un segmento di stack.

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

Capitolo 6.2

+0

Molto informativo, ma purtroppo ancora al di sopra di quello che posso cogliere con le mie attuali conoscenze. –

+0

@Tim - Understandable. Forse vale ancora una lettura veloce. –

+0

Aspetta, aspetta. Ogni posizione di memoria ha una larghezza di 32 bit, quindi se si preme un valore, decrementerà lo stack di 4 byte, perché 4 * 8 è di 32 bit e, se decrementato di 2, tenterebbe di creare un valore non allineato leggere, implodere l'universo? È giusto? Se è così, ottieni i punti, quel PDF è stato fantastico (2 °). –

0

Il puntatore dello stack deve essere (per alcuni motivi di ottimizzazione) 4B allineato -> dovrebbe essere divisibile per quattro (e, quindi, avere gli ultimi 2 bit zero).

+0

Anche se questo non ha senso, la risposta di Yully spiega tutto dal basso verso l'alto. Grazie comunque :) –

8

In alcuni casi il puntatore dello stack non è in grado di eseguire il proprio lavoro. per esempio, diciamo che avevi una funzione che spingeva un byte nello stack e poi chiama un'altra funzione. La chiamata finirà per provare a scrivere un indirizzo di ritorno disallineato nello stack, causando un errore.

+0

Perfetto, grazie :) –

0

ciò che si vuole fare è utilizzare gli opcodi di rotazione bit per ruotare attraverso ciascuna posizione di memoria a 32 bit, inserendo 8 bit alla volta nel registro fino a quando non si è tornati alle posizioni dei bit di partenza. ora dovresti avere 4 quantità di 8 bit allineate una accanto all'altra nel tuo registro a 32 bit. ora spingilo nello stack e il gioco è fatto.

+0

Scusa, non ha molto senso per me. –