[ Home | Liste | F.A.Q. | Risorse | Cerca... ]


[ Data: precedente | successivo | indice ] [ Argomento: precedente | successivo | indice ]


Archivio: devel@sikurezza.org
Soggetto: Re: [info-request] 386-686
Mittente: gerarra
Data: 2 Nov 2003 01:59:31 -0000
> Sui 386:
> la memoria puo' essere indirizzata solo in multipli
> della "parola" (una parola e' composta da 4 bytes),

Non ci siamo. Una word (parola) occupa 16-bits, ovvero 2 bytes. Tu ti riferisci
ad una double word. E' importante chiarire questo concetto, vedrai in seguito
perche'.

> quindi un array da 4 char occupa 1 parola, un array
> da 5 char occupa 2 parole e cosi' via,
>
> Sui 686, vale la stessa regola?

Eh direi proprio di si, essendo il 686 IA32. Mantiene tutte le caratteristiche
di base degli x86.

> pushl    %ebp
> movl    %esp, %ebp
> subl     $4, %esp
> ..
> ..
> mettendo un array da 1 a 4 ottengo un
> subl     $4, %esp
>
> mettendo un array da 5, 6, 7, 9, 10, 11, 12, 13 ,14, 15 0 16 ottengo un
> subl     $24, %esp
>
> mettendo un array da 8 ottengo un
> subl     $8, %esp
>
> mettendo un array da 17 ottengo un
> subl     $40, %esp

Ora questo e' molto platform-dipendant. Ovvero la corretta gestione dello
stack (perche' in questo caso tu stai lavorando nello stack) e' affidata
interamente nelle mani del compilatore (in questo caso gcc). Di suo lo stack
ti permette semplicemente di scegliere l'unità di boundary fra 16 e 32 bits
(quindi fra una word e una dword), ma non puoi pushare più o meno dati alla
volta. Il motivo e' semplice. Utilizzando un allineamento sbagliato (visto
che x86 ha un data bus a 32 bits), per riassemblare correttamente i 4 bytes
necessari da inviare alla memoria avresti bisogno di 2 clock cycles e non
più di 1 (come sarebbe naturale) con una pesante perdita di performance.
Purtroppo non posso illuminarti sui motivi per cui Gcc allochi cosi tanta
memoria allo stack, anche se non necessaria; il primo motivo che mi viene
in mente è che lo fa per non appesantire la fase di compilazione. Comunque
e' possibile ottenere una allocazione estremamente precisa sullo stack semplicemente
con: -mpreferred-stack-boundary=2 al momento dlela compilazione. info gcc
o man gcc per maggiori chiarimenti.

rookie


________________________________________________________
http://www.sikurezza.org - Italian Security Mailing List




[ Home | Liste | F.A.Q. | Risorse | Cerca... ]

www.sikurezza.org - Italian Security Mailing List
(c) 1999-2005