Ricordo di aver visto un modo di utilizzare l'assembly inline gcc esteso per leggere un valore di registro e memorizzarlo in una variabile C. Non posso però per la vita di me ricordare come si forma l'affermazione asm. Ogni aiuto è molto apprezzato.Lettura di un valore di registro in una variabile C
risposta
Ti rendi conto che leggerà una variabile, calcolerà il seno e quindi memorizzerà il risultato in una seconda variabile. –
@ Samuel: questo era solo un esempio della sintassi. –
Downvoted perché questo è un esempio di come utilizzare assembly esteso in GCC, non come ottenere il valore di un registro specifico in una variabile specifica, che è ciò che l'OP chiedeva. Specificando i registri usando '% 0' e'% 1', GCC sceglierà il registro in questione per conto tuo. Non c'è alcuna garanzia che sceglierà il registro che speri. –
non so su gcc, ma in questo è come VS:
int data = 0;
__asm
{
mov ebx, 30
mov data, ebx
}
cout<<data;
In sostanza, mi sono trasferito i dati in ebx
alla variabile data
.
solo x86, ovviamente. I compilatori Microsoft per x64 e Itanium non supportano l'assembly inline. – ephemient
Penso che il montaggio verrà tradotto in mov ebx, 30 mov dword ptr [dati], ebx – Sridarshan
Perché non solo "mov dati, 30'? – Houssni
Ecco un modo per ottenere EBX:
int main()
{
int i;
asm("\t movl %%ebx,%0" : "=r"(i));
return i + 1;
}
Il risultato:
main:
subl $4, %esp
#APP
movl %ebx,%eax
#NO_APP
incl %eax
addl $4, %esp
ret
Edit:
Il "= r" (i) è un vincolo di uscita, dicendo al compilatore che il primo output (% 0) è un registro che deve essere inserito nella variabile "i". A questo livello di ottimizzazione (-O5) la variabile non viene mai memorizzata in memoria, ma viene mantenuta nel registro eax, che è anche il registro del valore di ritorno.
Vorrei usare il vincolo '= rm' piuttosto che' = r'. L'ottimizzatore del compilatore tenterà di scegliere il percorso migliore. Se l'assemblatore in linea si trovasse in una situazione di fame nel registro '= r' può forzarlo a generare codice meno che ottimale. '= rm' darebbe all'ottimizzatore la possibilità di usare un riferimento di memoria se fosse la scelta migliore. In questo semplice esempio non sarà un problema, ma se il codice si trova in una situazione più complessa, dare delle opzioni al compilatore potrebbe essere utile. –
Questo sposta il registro del puntatore dello stack nella variabile sp.
intptr_t sp;
asm ("movl %%esp, %0" : "=r" (sp));
basta sostituire 'esp' con l'attuale registri che ti interessa (ma assicuratevi di non perdere il %%) e 'st' con la variabile.
Andando in una direzione diversa rispetto ad altre risposte finora, dal momento che non sono sicuro di quello che vuoi.
GCC Manual § 5.40 Variables in Specified Registers
register int *foo asm ("a5");
Qui
a5
è il nome del registro che dovrebbe essere utilizzato & hellip;Naturalmente il nome del registro è dipendente dalla CPU, ma questo non è un problema, poiché i registri specifici sono spesso utili con istruzioni esplicite sull'assemblatore (vedere Extended Asm). Entrambe queste cose richiedono generalmente che si condizioni il programma in base al tipo di CPU.
La definizione di tale variabile di registro non riserva il registro; rimane disponibile per altri usi in luoghi in cui il controllo del flusso determina che il valore della variabile non è attivo.
GCC Manual § 3.18 Options for Code Generation Conventions
-ffixed-
regTrattare registro menzionato reg come un registro fisso; il codice generato non dovrebbe mai riferirsi ad esso (tranne forse come un puntatore dello stack, un puntatore del frame o in qualche altro ruolo fisso).
Questo può replicare la risposta di Richard in modo più semplice,
int main() {
register int i asm("ebx");
return i + 1;
}
anche se questo è piuttosto insignificante, come non avete idea di cosa c'è nel registro delle ebx
.
Se combinato questi due, la compilazione di questo con gcc -ffixed-ebx
,
#include <stdio.h>
register int counter asm("ebx");
void check(int n) {
if (!(n % 2 && n % 3 && n % 5)) counter++;
}
int main() {
int i;
counter = 0;
for (i = 1; i <= 100; i++) check(i);
printf("%d Hamming numbers between 1 and 100\n", counter);
return 0;
}
è possibile garantire che una variabile C utilizza sempre risiede in un registro per l'accesso rapido e anche non andranno colpita da un altro codice generato. (Comoda, ebx
è callee-save sotto x86 usuali convenzioni di chiamata, quindi, anche se viene clobbered da chiamate ad altre funzioni compilate senza -ffixed-*
, si dovrebbe ottenere restaurata troppo.)
D'altra parte, questo sicuramente non è portatile, e di solito non è un vantaggio in termini di prestazioni, poiché si limita la libertà del compilatore.
Dalle GCC si docs: http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
- 1. Come leggere il valore di una chiave di registro C#
- 2. Come eliminare un valore di registro in C#
- 3. Registro rotante di Python a una variabile
- 4. C# Imposta valore di registro genera UnauthorizedAccessException
- 5. Discretizzando il registro di una variabile continua
- 6. Lettura di un valore xml in una proprietà per Wix
- 7. Lettura di una variabile JSP da JavaScript
- 8. stampa di un valore di una variabile in PostgreSQL
- 9. Lettura del valore del set di dati in una variabile gnuplot (inizio della serie X)
- 10. Lettura evento registro eventi di Windows specifico
- 11. Lettura di un file di registro bloccato da un'altra applicazione
- 12. C# - Scrittura di un registro utilizzando una casella di testo
- 13. Scrittura/lettura nel registro eventi di Windows
- 14. Stampa di una variabile void * in C
- 15. C# restituisce una variabile come sola lettura da get; impostato;
- 16. prova C se variabile è in sola lettura sezione
- 17. valore di una variabile utilizzando WinDbg
- 18. Come creare una variabile di sola lettura locale in bash?
- 19. inserendo una variabile php in un valore di modulo HTML
- 20. Come definire una variabile di lettura/scrittura globale in Spark
- 21. Come implementare una variabile membro di sola lettura in PHP?
- 22. Utilizzare un valore di registro come criterio di ricerca
- 23. Aggiunta di un valore di una variabile a un nome di variabile?
- 24. Inizializzazione di un valore tramite una variabile Session
- 25. lettura valore della variabile in WS gioco risposta portata
- 26. Lettura di un array di byte C# in Java
- 27. Lettura di una variabile di sessione all'interno di un comportamento in cakephp 2
- 28. Un CheckBox di sola lettura in C# WPF
- 29. Come posso aumentare il valore di una variabile in un'espressione?
- 30. Ottenere valore di una variabile filo dall'esterno
E come fai a sapere che cosa è in EBX quando il codice C inizia l'esecuzione? – florin