Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [asm] Passaggio di parametri

    Ho scritto questo programma giocatolo, per approfondire il passaggio di parametri a una subroutine, tramite lo stack nel mio calcolatore.

    codice:
    void function(int a, int b){}
    
    void main() 
    {
      function(1,2);
    }
    codice:
    (gdb) disassemble main
    Dump of assembler code for function main:
       0x00000000004004c0 <+0>:     push   %rbp
       0x00000000004004c1 <+1>:     mov    %rsp,%rbp
       0x00000000004004c4 <+4>:     mov    $0x2,%esi
       0x00000000004004c9 <+9>:     mov    $0x1,%edi
       0x00000000004004ce <+14>:    callq  0x4004b4 <function>
       0x00000000004004d3 <+19>:    pop    %rbp
       0x00000000004004d4 <+20>:    retq   
    End of assembler dump.
    I parametri della funzione, vengono semplicemente caricati in dei registri (esi,edi). Qualcuno sa spiegarmi quale subdolo meccanismo, fa si che i dati siano effettivamente messi nello stack senza il push???

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    In questo caso il compilatore non ha ritenuto di passare gli argomenti nello stack ma tramite i due registri.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Non lo facevo cosi erudito! Grazie.

  4. #4
    Un momento, ma se un'altro processo in esecuzione, scrive qualcosa in quei registri prima che siano caricati nel frame della subroutine; allora i dati vengono persi? Oppure il compilatore, quando traduce codice in questo modo, è certo che venga eseguito tutto nel periodo che intercorre tra un processo e l'altro?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Un altro processo?

    Tu hai idea di come lavorino i vari processi in un sistema e come utilizzino la CPU ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Si, condividono la macchina, quindi la usano un po l'uno e un po l'altro. Ma il multiplexing è cosi rapido che a noi pare vengano eseguiti simultaneamente. O sbaglio?

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    E che c'è una componente che si occupa di fare il context switch ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Originariamente inviato da pistilloi
    Non lo facevo cosi erudito! Grazie.
    Nota comunque che il compilatore può fare più o meno quello che gli pare nelle chiamate a funzione finché si tratta di funzioni definite nello stesso modulo, se si parla di funzioni definite in altri moduli oggetto (o in librerie) invece deve rispettare una qualche calling convention (che indica quali e quanti parametri vanno nei registri, quanti sullo stack, chi si occupa di ripulire lo stack, che registri vengono preservati, ...).
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Very well, ora tutto torna!

  10. #10
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.