DOMANDA Asm Stack Funzione Chiamante/ato

Robert T.

Utente Attivo
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):




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:

 

Robert T.

Utente Attivo
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:
M

Mursey

Ospite
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...
 

DispatchCode

Utente Attivo
593
342
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
@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
 
  • Mi piace
Reactions: signore del tempo

Robert T.

Utente Attivo
@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.
 

signore del tempo

Utente Èlite
3,228
491
Hardware Utente
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
Hard Disk
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
Scheda Video
Sapphire 7850 1GB @ 1050MHz
Scheda Audio
Integrata
Monitor
Acer V193w
Alimentatore
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
Sistema Operativo
ArchLinux + KDE - Windows 10
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.
 

Entra

oppure Accedi utilizzando