Caller String basteln

24/08/2008 - 21:06 von Jens Kallup | Report spam
Hallo,

wie kann ich eine liste mit pointer zu funktionen erstellen?
pushbutton1_onclick dürfte nicht statisch sein.
wie bekommt man das dynamsich hin?

gruß
jens

extern "C" void pushbutton1_onclick();
1.. // -
b.. // std::string funcname;
c.. // -
d.. void TPushButton::buttonClicked(void)
5.. {
6.. if (funcname.length() > 0)
7.. {
8.. ostringstream Str;
9.. Str << int(btn_id);
10.. Str << " click: " << funcname;
11..
12.. cout << Str.str() << endl;
13..
14.. map<string,void(*)()> callbacks;
15.. callbacks[funcname] = &pushbutton1_onclick; // hier
16.. callbacks[funcname]();
17.. }
18.. }
19..
20.. ///////////////
u.. section .data
22.. extern _printf
23..
24.. LClassPropertyValue_masterforma_pushbutton1_onclick: db "pushbutton1_onclick",0
25.. tststr: db "Hallo",10,0
26.. section .text
27.. global _pushbutton1_onclick
28.. _pushbutton1_onclick:
29.. push tststr
30.. call _printf
31.. add esp, 4
32.. ret
33..
 

Lesen sie die antworten

#1 Hubert Seidel
24/08/2008 - 21:39 | Warnen spam
Hallo Jens,

passe doch bitte ab und an den Betreff entsprechend an. thx.
(Beim Übergang ein "was" [wie hier], dieser kann beim Antworten gelöscht
werden)

"Jens Kallup" schrieb im Newsbeitrag
news:48b1b123$0$4243$
wie kann ich eine liste mit pointer zu funktionen erstellen?



In Assembler gibt es nur "Speicher am Stück oder geschnitten" ;-)
Im Grunde benötigst Du etwas "Speicher am Stück" welche Du
fortlaufend mit den Adressen der Funktion gefüllt hast.
Anschl. kannst Du mit unterschiedlichen Varianten diese aufrufen.
Du must natürlich immer die Aufrufkonventionen einhalten.

Hier mal ein einfaches Beispiel für DOS (16Bit):

org 0100h ; nasmw funclist.asm -o funclist.com

jmp start ; Zum Programmanfang springen

hello1 db "Hello World (1)",13,10,"$"
hello2 db "Hello (2) World",13,10,"$"
hello3 db "(3) Hello World",13,10,"$"

Print: ; String DS:DX ausgeben
mov ah,9
int 021h
ret

func1: mov dx,hello1
call Print
ret

func2: mov dx,hello2
call Print
ret

func3: mov dx,hello3
call Print
ret

funclist dw func1,func2,func3

dyncall:
push si
add si, si
add si, funclist
call [si]
pop si
ret

start: ; Programmanfang
; =
mov si,0
call dyncall

mov si,1
call dyncall

mov si,2
call dyncall

; =
Ende:
mov ax,04c00h ; Programm mit Exitcode 0
int 021h ; beenden


Bei 32Bit kannst Du noch anders aufrufen da mehr
Adressierungsarten zur Verfügung stehen. z.b.:

call [esi+eax*4] ; in ESI die Adresse der Pointerliste, in EAX der Index der
Funktion

mfg.
Herby

http://www.hubert-seidel.de

Ähnliche fragen