PDA

View Full Version : [assembly] SUBRUTINE


giannimesa
18-09-2005, 17:54
ciao a tutti devo assolutamente comprendere il funzionamento dell'allocazione dinamica della memoria in programma assembly.
Ci ho provato più e più volte ma non ne vengo a capo magari qui qualcuno riesce ad aiutarmi.
In altre parole devo capire come creare una subrutine rientrante.

Le macchine su cui posso lavorare sono il PD32, e l'Intel Xcale, che usa linguaggio ARM.
Ora le differenze noon sono enormi tra le due, sempre di assembly si tratta, quindi se comprendo il funzionamento col più semplice PD32, non dovrei avere problemi con Xcale.

il mio dubbio essenzialmente è:

come viene utilizzato lo Satck frame, e quindi i relativi Stack pointer (SP) e Frame Pointer (FP)?

grazie.

giannimesa
19-09-2005, 07:30
up :cool:

71104
19-09-2005, 11:18
non conosco le macchine che hai nominato, ma posso dirti come funziona per gli Intel x86 (credo l'architettura più diffusa al mondo).
lo Stack Pointer (registro SP per la modalità a 16 bit, ESP per quella a 32) punta alla prima locazione di memoria libera nell'area dello stack, che in genere nei moderni sistemi operativi mi sembra che ammonti a 1 kilobyte di commit e fino a un mega riservato; all'avvio di un thread il sistema operativo gli crea automaticamente uno stack (in realtà sarebbero due, ma dell'altro non ti interessa) facendo il commit di 1 kilobyte e il reserve di 1 mega - 1 kilo.
ESP viene inizialmente settato nel contesto del thread al valore più alto di quest'area, dopodiché lo stack cresce verso il basso (contrariamente all'heap): ad ogni push, cioè ad ogni allocazione di 4 byte (o 2 per i 16 bit), ESP viene decrementato di 4 (o 2) in modo tale che esso punti sempre al primo slot libero. per allocare un numero N arbitrario di bytes nello stack si fa una sottrazione manuale ESP - N; chiaramente la deallocazione è l'operazione inversa: per deallocare N bytes basta incrementare ESP di N.
le istruzioni x86 PUSH e POP altro non fanno che decrementare o incrementare (rispettivamente) ESP di 4 (o 2) dopo aver effettuato un MOV dell'argomento verso locazione inizialmente puntata da ESP.

per quanto riguarda il Frame Pointer, nel x86 non esiste, ma penso sia del tutto analogo al modo in cui viene (per pura convenzione) utilizzato EBP; questo è un tipico codice di prologo di una funzione C stdcall:

PUSH EBP
MOV EBP,ESP
SUB ESP,n ;alloco n bytes di spazio per le variabili locali

mentre questo è quello di epilogo:

ADD ESP n
POP EBP
RET m ;ritorna deallocando m bytes di parametri

giannimesa
19-09-2005, 21:13
grazie, tutto sommato mmi sei stato utile... anche se purtroppo le macchine non le conoscevi... comunque l'Xcale sarebbe praticamente il PXA255 usato nei palmari...tanto per chiarezza....

cdimauro
20-09-2005, 09:25
ciao a tutti devo assolutamente comprendere il funzionamento dell'allocazione dinamica della memoria in programma assembly.
Ci ho provato più e più volte ma non ne vengo a capo magari qui qualcuno riesce ad aiutarmi.
In altre parole devo capire come creare una subrutine rientrante.

Le macchine su cui posso lavorare sono il PD32, e l'Intel Xcale, che usa linguaggio ARM.
Ora le differenze noon sono enormi tra le due, sempre di assembly si tratta, quindi se comprendo il funzionamento col più semplice PD32, non dovrei avere problemi con Xcale.

il mio dubbio essenzialmente è:

come viene utilizzato lo Satck frame, e quindi i relativi Stack pointer (SP) e Frame Pointer (FP)?

grazie.
XScale non usa il linguaggio ARM, ma è proprio un processore che implementa l'architettura ARM di Acorn.

A partire dalla versione 7, è stata introdotta l'ISA Thumb, usatissima per risparmiare spazio e velocizzare l'esecuzione.

In buona sostanza, dovresti sapere innanzitutto se dovrai scrivere codice ARM "classico" o "Thumb" (praticamente tutti gli ARM attuali sono almeno versione 7, e quindi supportano il Thumb).

Per l'ARM, il registro da usare è R13, se non ricordo male, e puoi considerarlo alla stregua del registro SP che si trova in tanti altri processori. Puoi anche usarlo come un qualunque altro registro.

Non esiste un registro che funga da Frame Pointer: ne puoi usare uno qualunque.

Col Thumb, il discorso è analogo, soltanto che con questa ISA si possono usare (normalmente) soltanto i primi 8 registri. Il registro R13 viene "mappato" come SP, ed esistono delle istruzioni specifiche per manipolare lo stack, similmente alle altre architetture.

A parte questo, vorrei capire meglio quali sono i tuoi dubbi sull'uso dello stack.