Debugging einige Code in Visual Studio 2008 (C++), bemerkte ich, dass die Adresse in meinem Funktionszeiger Variable ist nicht die tatsächliche Adresse der Funktion selbst. Dies ist eine externe "C" -Funktion.Adresse der Funktion ist nicht tatsächliche Code-Adresse
int main() {
void (*printaddr)(const char *) = &print; // debug shows printaddr == 0x013C1429
}
Address: 0x013C4F10
void print() {
...
}
Die Demontage der Funktionsadresse zu nehmen ist:
void (*printaddr)(const char *) = &print;
013C7465 C7 45 BC 29 14 3C 01 mov dword ptr [printaddr],offset print (13C1429h)
EDIT: I den Code an Adresse betrachtet 013C4F10 und die Compiler anscheinend an dieser Adresse eine "jmp" Instruktion eingefügt wird.
013C4F10 E9 C7 3F 00 00 jmp print (013C1429h)
Es gibt tatsächlich eine ganze Jump-Tabelle für jede Methode in der .exe.
Kann jemand erklären, warum es das tut? Ist es ein Debugging- "Feature"?
Hmm, was Sie die Adresse des 'print' erzählt ist' 0x013C4F10'? Mit Blick auf die Disassemblierung scheint die Adresse des Ausdrucks tatsächlich '0x013C1429' zu sein und der Wert wird in' printaddr' gespeichert. – Martin
Die Disassemblierung in Visual Studio zeigt den Ausdruck an Adresse 0x013C4F10 – codenheim
@Martin: Wenn ich die Sprungtabelle in den Freigabemodus umschalte geht weg und die Adresse ist tatsächlich die eigentliche Funktionsadresse. – codenheim