mov eax,dword ptr [pNTHeader32] ; carica nel registro eax l'indirizzo di memoria a cui
; punta pNTHeader32
mov eax,dword ptr [eax+0D0h] ; carica in eax il valore contenuto nel campo richiesto,
; calcolato come offset rispetto all'indirizzo base della struttura
Poichè nella
convenzione di chiamata utilizzata (cdecl) il valore di
ritorno di una funzione è passato al chiamante nel registro EAX, tutto chiò che
serve è copiare in tale registro il valore del campo richiesto (pNTHeader32
->DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress
).
E'ovvio che, se il campo contiene il valore 123,
tale sarà il valore di ritorno della funzione. Nelle istruzioni decisionali, il valore è
considerato true, e la cosa funziona.
Con la doppia negazione, invece, il compilatore genera il
seguente codice macchina:
mov eax,dword ptr [pNTHeader32]
xor ecx,ecx
cmp dword ptr [eax+0D0h],0
setne cl
mov eax,ecx
In pratica, il valore del
campo interessato viene confrontato con la costante 0, e il registro EAX (per via indiretta)
viene settato a 1
se il confronto fallisce, cioè se pNTHeader32
->DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress è
diverso da zero
.
Il codice:
return (pNTHeader32 ->
DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].
VirtualAddress
!= 0);
genera, infatti, lo stesso codice x86.
Il
contro
della soluzione scelta credo siala maggiore occupazione di spazio da parte del codice e la leggera pessimizzazione. Ma si parla
di pochi byte e di nanosecondi in una funzione che viene eseguita
una volta sola, all'avvio dell'applicazione !!!
Il pro, a mio parere, è una maggiore
"debuggabilità" della funzione, che deriva dall'aver forzato i valori true ad 1, cosa non espressamente richiesta dal
linguaggio C.
Se volete la mia opinione, fatta salva la scelta di
forzare i valori true a 1, sarebbe stato più leggibile un codice che avesse
effettuato il confronto esplicito con zero (come quello scritto sopra), dato
anche che l'assembler generato risulta perfettamente identico.
O forse è semplicemente una convenzione sintattica
che non conoscevo per niente, e mi risulta meno naturale da leggere, oltre ad
avermi fatto passare mezza mattinata ad indagarne il funzionamento !