DOMANDA Asm Stack Funzione Chiamante/ato

Pubblicità

Robert T.

Utente Attivo
Messaggi
134
Reazioni
11
Punteggio
38
Ho le idee un pò confuse riguardo lo stack in assembly. Per esempio, dato questo codice:

Codice:
.globl f 
f:

push %ebx
movl 8(%esp), %eax
movl 12(%esp), %ebx

addl %ebx, %eax

ret

Lo stack di questa banale funzione è questo (scusate ma le infografiche non fanno per me):

4BnIto3.png



Il problema ora si pone quando voglio usare una funziona annitadata che chiama parametri, i parametri della funziona madre e le push. Il codice funziona ma voglio capire la stack

CODICE:

Codice:
.code32

.globl f

f:

    pushl %ebx

    movl 8(%esp), %ebx

    subl $8, %esp # Creo posto nella stack per i parametri

    movl $1, (%esp)

    movl $2, 4(%esp)

    call a

    addl %ebx, %eax

    addl $8, %esp #Tolgo posto nella stack

    popl %ebx

    ret

Dove si trovano ret ed %ebx ora? :help:

g4twI89.png
 
Niente ho risolto da solo, è il secondo thread che apro sull'assembly mi stupisco che nessuno conosca l'argomento, ci limitiamo ai thread su quale linguaggio scegliere e for,while nell'area programmazione?

Per chi fosse interessa la stack è la seguente

|-------------------------------------|
32bit | 8(%esp) = parametro f | +8
|-------------------------------------|
| ret | +4
|-------------------------------------|
| %ebx |
|-------------------------------------|
| funzione g. parametro 1 |
|-------------------------------------|
| funzione g. parametro 2 |
|-------------------------------------| <-----> ESP
 
Ultima modifica:
ci limitiamo ai thread su quale linguaggio scegliere e for,while nell'area programmazione?
L'area è aperta a tutti e sono gli utenti che la popolano e la rendono viva, l'assembly è un argomento avanzato e molto meno frequente.
Abbiamo utenti preparati sull'argomento ma bisogna vedere se e quando hanno tempo di partecipare...
 
@Robert T.
Ho visto il tuo precedente thread ed avrei voluto risponderti ieri, ma non sono riuscito nuovamente. Vorrei solo far notare che alcuni di noi - può sembrar buffo :D - ma hanno superato l'età scolastica e conseguentemente potrebbero - ad esempio - avere un lavoro; questo rende tutto molto più difficoltoso, specie se si trascorrono già ore di fronte ad un monitor.

Comunque alla chiamata della funzione avviene il push anche del registro EIP (+ il numero di byte che occupa l'istruzione call), così da poter tornare indietro. I dettagli sarebbero altri; non appena riuscirò, completerò qui, e pure l'altro tuo thread. ;)


PS. non mi abituerò mai alla sintassi AT&T :P
 
@Robert T.
Ho visto il tuo precedente thread ed avrei voluto risponderti ieri, ma non sono riuscito nuovamente. Vorrei solo far notare che alcuni di noi - può sembrar buffo :D - ma hanno superato l'età scolastica e conseguentemente potrebbero - ad esempio - avere un lavoro; questo rende tutto molto più difficoltoso, specie se si trascorrono già ore di fronte ad un monitor.

Comunque alla chiamata della funzione avviene il push anche del registro EIP (+ il numero di byte che occupa l'istruzione call), così da poter tornare indietro. I dettagli sarebbero altri; non appena riuscirò, completerò qui, e pure l'altro tuo thread. ;)


PS. non mi abituerò mai alla sintassi AT&T :P

E' leggermente un pò storta ma a mio parere i suffissi sulle istruzioni ti fanno rigare dritto.
 
A prescindere dal problema (che hai risolto, sbaglio?), hai pensato di imparare ad utilizzare una calling convention? A meno di parametri memory-constrained (quelli che in C sono marcati volatile), i primi parametri (4 o più se non sbaglio; poi dipende dalla situazione [user code, kernel code ecc]) sono passati nei registri (%rdi, %rsi, %rdx e %rcx mentre %rax per il parametro di ritorno). I vantaggi dovrebbero esserti chiari per le competenze che "vanti".

AT&T >> Intel *
*anche se alcune cose non mi piacciono: tipo i nomi delle costanti, il $ non ci va se vuoi l'address con la mov; ma se usi la lea sì .-.

Se vuoi un consiglio, preferisci tutto-mov-esp al mix push + mov.
 
Pubblicità
Pubblicità
Indietro
Top