volatile
o no, l'unico tecnica motivo per cui sarebbe EAX
devono essere inizializzato direttamente prima di effettuare una chiamata di funzione su Windows erano se questo function
è dichiarato __syscall
, vale a dire utilizzando la convenzione di chiamata di Windows CS_SYSCALL. Concettualmente, questo è un po 'simile alla convenzione UN * X x86_64 dove %al
contiene il numero di argomenti di tipo floating point passati nei registri %xmm
.
La syscall convenzione di chiamata su Windows è identica alla __cdecl
, cioè args funzione sul stack in ordine inverso, ma con l'aggiunta che AL
contiene un conteggio del numero di argomenti; questo è fatto in modo che il codice del kernel che di solito si trova all'estremità finale di questo sappia quanti dati leggere dallo stack utente sullo stack del kernel per recuperare gli argomenti.
EAX
è un registro zero per tutte le convenzioni di chiamata su Windows a 32 bit, il suo valore non viene mai conservato su chiamate di funzione, inizializzandolo direttamente prima di effettuare una chiamata ridondante. Anche se la variabile che contiene era volatile
- perché un semplice ricaricamento non è una barriera di memoria e non "commette" un archivio precedente. Inoltre, la posizione [EBP - 4]
si trova nello stack , quindi la variabile è locale (e un qualificatore volatile
non ha molto senso).
Se non è un'ottimizzazione persa allora potrebbe essere un'invocazione di un __syscall function(...)
con un diverso numero di argomenti, come, ipoteticamente,
__syscall printf_syscall_conv(char *fmt, ...);
void possibly_print_three_vals(char *fmt, int val1, int val2, int val3)
{
if (*strchr('%', fmt) == '\0') // if no "%" in fmt, pass no args
printf_syscall_conv(fmt);
else
printf_syscall_conv(fmt, val1, val2, val3);
}
Questo, concettualmente, potrebbe creare un output di montaggio come la tua.
fonte
2012-01-25 12:56:28
Ho visto i compilatori fare cose più stupide di questa ... – Mysticial
@Mysticial: Oh lol ... è la prima volta che ho notato qualcosa del genere. :) Buono a sapersi. – Mehrdad
Forse c'è un ramo nella prima spinta. –