007
17.03.2005, 21:59 Uhr
(un)wissender
Niveauwart
|
Hier mal ein Beipsiel (nicht optimiert), dass ich mit VC++ und masm erstellt habe.
C++: |
#include <iostream>
extern "C" unsigned _stdcall jumpDemo(unsigned choice, int * table);
int main() { enum { CHOICE1, CHOICE2, CHOICE3 };
int jumpTable[3];
std::cout << jumpDemo(CHOICE2,jumpTable); }
|
Die Assemblerprozedur
Code: |
jumpDemo PROC choice:DWORD, table:PTR push ebp mov ebp,esp ;Stackframe aufbauen mov ecx, [table] ;Adresse der Sprungtabelle laden mov dword ptr[ecx] , choice1 ;Erstes Sprungziel in Sprungtabelle eintragen mov dword ptr[ecx + 4], choice2 ;Zweites Sprungziel in Sprungtabelle eintragen mov dword ptr[ecx + 8], choice3 ;Drittes Sprungziel in Sprungtabelle eintragen mov eax, [choice] ;Index laden mov edx, 4 ;sizeof(int) == 4 mul edx ;Index korrigieren mov ecx, [ecx + eax] ;Das Sprungziel aus der Sprungtabelle laden jmp ecx ;Springen
choice1: mov eax, 1 ;Was auch immer tun... jmp finish ;Ende
choice2: mov eax, 2 ;Was auch immer tun... jmp finish ;Ende
choice3: mov eax, 3 ;Was auch immer tun... jmp finish ;Ende
finish: leave ;Stackframe abbauen ret 8 ;Bei stdcall Stack aufräumen jumpDemo ENDP
|
Bearbeitung: |
So in ähnlicher Weise (nur etwas optimierter) werden auch switches mit Nummernfolgen übersetzt.
|
-- Wer früher stirbt ist länger tot. Dieser Post wurde am 17.03.2005 um 22:04 Uhr von (un)wissender editiert. |