Dove va 'this' go in x64 thiscall?

3

Quindi capisco che thiscall non esiste realmente nella programmazione x64. Tuttavia, non riesco a trovare alcuna spiegazione definitiva su dove il puntatore this viene passato al callee.

È un x64% dithiscall come una vera chiamata cdecl , dove this è messa all'ultimo "stack" (su entrambi i compilatori GCC e MSVC)?

EDIT: passando per GDB, sembra così. rdi ha mantenuto il puntatore this e rsi ha mantenuto l'unico parametro posseduto da quel particolare metodo. È così che funziona sempre?

    
posta Qix 21.06.2014 - 22:49
fonte

2 risposte

4

Per quanto ne so non esiste una convenzione esplicita per il passaggio di un puntatore this . Poiché viene passato alla funzione come argomento aggiuntivo nascosto, verrà passato usando la convenzione per gli argomenti. Quale argomento è presumibilmente lasciato al progettista del compilatore.

Ci sono solo due convenzioni di chiamata in uso, effettivamente Windows e Unix. In ogni caso, le funzioni con un numero ridotto di argomenti (4 o 6) passano tutti gli argomenti nei registri. Questo ancora non ti dice che ha il puntatore this .

Sto tracciando la distinzione tra la convenzione di chiamata ufficialmente sancita (che dice che i primi 4 o 6 argomenti vanno nei registri specificati) e qualsiasi convenzione non ufficiale viene utilizzata per scegliere quale argomento dovrebbe rappresentare il puntatore this . Nella maggior parte dei casi sarà probabilmente il primo argomento (che corrisponde alla tua esperienza), ma potrebbe non essere sempre così.

    
risposta data 22.06.2014 - 10:18
fonte
3

In base a link

"il [questo puntatore] viene passato come primo parametro implicito." Quindi nella convenzione X64 __fastcall [questo puntatore] dovrebbe sempre essere impostato nel registro RCX.

    
risposta data 22.10.2015 - 12:06
fonte

Leggi altre domande sui tag