In base a Wikipedia, Intel ABI consente di utilizzare EAX
, ECX
e EDX
senza conservarli in una funzione.
Non sono sicuro di cosa significhi "Intel ABI". Questo significa che viene applicato/seguito da tutti i compilatori che prendono di mira le CPU Intel? Sto scrivendo una funzione assembly che verrà chiamata dal codice C. Posso presumere questo per tutti i compilatori? (Sto puntando solo al x86
al momento)Quali registri sono sicuri da utilizzare in una funzione (x86)
risposta
Intel ABI è solo una convenzione di chiamata stabilita da Intel.
In generale, come i parametri vengono passati e quali registri vengono salvati o cestinati durante una chiamata di funzione è definita dalla convenzione di chiamata della funzione:
http://en.wikipedia.org/wiki/Calling_convention
In particolare per __cdecl, __stdcall e __fastcall dovresti aspettarti che EAX, ECX ed EDX vengano eliminati e la tua funzione dovrebbe conservare altri registri e ritornare su EAX (o EDX: EAX per i ritorni a 64 bit).
Se non si conosce la convenzione di chiamata che si deve utilizzare, non si dovrebbe scrivere in assembly, dal momento che fare confusione nella convenzione di chiamata può portare a bug sfruttabili nella propria applicazione.
In C, la convenzione di chiamata predefinita è normalmente __cdecl e per le API esportate di Windows è normalmente __stdcall.
È l'Intel Application Binary Interface, un insieme di regole che dettano cose come i registri disponibili per l'uso senza salvare, come gli argomenti vengono inseriti nello stack, indipendentemente dal caller o dal callle clean fino ai frame dello stack e così via.
Se si sa che le regole vengono seguite, va bene. Tendo a salvare tutto nel caso (a parte quelle cose che sto usando per restituire informazioni ovviamente).
Ma non è necessariamente applicato a tutti i compilatori e non sarebbe saggio pensarlo a meno che il compilatore non lo specifichi espressamente.
- 1. Quali registri vengono ripristinati dopo una chiamata di funzione x86 in c?
- 2. Quali registri vengono mantenuti tramite una chiamata di funzione x86-64 di linux
- 3. Perché i registri x86 sono nominati come sono?
- 4. Quali attributi html/css sono sicuri per posta?
- 5. Valori sicuri da utilizzare come chiave in shmget
- 6. Quali sono le istruzioni IN & OUT in x86 utilizzate?
- 7. Estensioni Crossrider - sono sicuri
- 8. Quali sono i modi per modificare una funzione in R?
- 9. Sono strtol, strtod non sicuri?
- 10. Quali framework di test unitari sono disponibili per l'assembler x86?
- 11. Proprio quando non sono sicuri, #., E. # Non sicuri?
- 12. Assemblatore in linea: quali registri scratch possono essere utilizzati?
- 13. I thread client proxy CXF sono sicuri?
- 14. Dove sono i registri Gradle?
- 15. Quali sono i vantaggi di definire e chiamare una funzione all'interno di un'altra funzione in R?
- 16. Determinazione di quali vasetti minimi sono necessari per una funzione
- 17. Esiste un codice operativo x86 per spostare un byte immediato in una posizione di memoria diretta (senza utilizzare registri)?
- 18. Come leggere e scrivere registri flag x86 direttamente?
- 19. Quali caratteri sono sicuri di non sfuggire al contesto di valori CSS?
- 20. Quanti registri XMM sono disponibili su un processore x86 che supporta SSE?
- 21. Utilizzare la piattaforma x86 in progetti C++
- 22. Perché l'architettura x86 utilizza due registri stack (esp; ebp)?
- 23. Quali sono le tecniche per consentire gli aggiornamenti sicuri del software nei sistemi incorporati
- 24. I filetti di Kotlin sono sicuri?
- 25. I riferimenti const ai membri sicuri sono
- 26. Come utilizzare le costanti dell'indirizzo nell'assieme in linea GCC x86
- 27. Perché i registri CPU sono rapidamente accessibili?
- 28. Quali sono i vantaggi di utilizzare un iteratore in Java
- 29. Quali sono gli eventi che posso utilizzare in Excel
- 30. Come utilizzare valori non sicuri in un enum?
Conosco la convenzione di chiamata che devo usare e so che significa per quanto riguarda l'ordine dei parametri e la pulizia dello stack. Non sapevo dei registri. Sai quali compilatori seguono questo ABI? msvc/gcc? – baruch
@baruch Almeno per MSVC, la convenzione di chiamata è specificata nel prototipo della funzione. Il compilatore guarda e fa la cosa giusta. Ad esempio, la def di WSARecv inizia come "int WSAAPI WSARecv'. Il 'WSAAPI' risolve (attraverso diversi #define) su __stdcall. –
@MarcSherman Sono a conoscenza della convenzione di chiamata, ma la parte relativa alla conservazione del registro della convenzione di chiamata? – baruch