DOMANDA Asm Stack Funzione Chiamante/ato

Robert T.

Utente Attivo
134
11
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
 

Robert T.

Utente Attivo
134
11
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

Moderatore
Staff Forum
Utente Èlite
2,221
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
@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
Reazioni: signore del tempo

Robert T.

Utente Attivo
134
11
@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
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
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
Discord Ufficiale Entra ora!