Damit es nicht untergeht: Deklaration von 
exp_regdump im C-Code ist entscheidend.
Wenn du das z.B. so deklarierst:
extern void exp_regdump(); bekommst du die Adresse doch mit 
rptr = exp_regdump; Besonders toll ist dann, dass 
&exp_regdump = 
exp_regdump = 
*exp_regdump = 
**exp_regdump = ... 
Aber 
exp_regdump[0] geht trotzdem nicht, denn 
exp_regdump ist kein Array. Ist doch alles ganz logisch ^^
Noch lustiger ist nur noch 
extern void (*exp_regdump[])();. Da bekommst du dann die Adresse mit 
exp_regdump oder 
&exp_regdump. Den Wert in 
rd_eip bekommst du mit 
exp_regdump[0] oder 
*exp_regdump (was wieder gleich 
**exp_regdump und so weiter ist.) 
C ist ja die einzig wahre Hochsprache und praktisch eine Obermenge von Assembler, wie die dritte Möglichkeit des Auslesens zeigt. Hierbei nutze ich die Kommutativität von Arrayzugriffen aus. Wenn du auf Bezeichner in eckigen Klammern stehst, kommst du an das erste Element (
rd_eip) mit 
0[exp_regdump] bzw. 0[exp_regdump + 0]. An das zweite Element (
rd_eax) kommst du mit 
0[exp_regdump + 1], an das dritte mit 
0[exp_regdump + 2]. Genial oder? Musst nur beachten, dass du hier nicht wie in Assembler *4 rechnen darfst, sondern das macht der Compiler für dich. Alleine dieses Feature ist schon ein Grund mehr C zu verwenden 

Edit: Von 
extern void (*exp_regdump)(); rate ich übrigens ab. Das ist total unlogisch, denn da ist 
exp_regdump ungleich 
&exp_regdump 
 Logischerweise ist 
extern void (**exp_regdump)(); auch nicht gleich 
extern void (*exp_regdump[])();.