Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Assembler » richtiges "Zahlenvergleichen"

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.03.2005, 14:52 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi, wie kann man eigentlich geschickterweise in ASM eine "Variable"/Register mit einer Zahl vergleichen? also z.b

if(registerxy == 0)
goto Tu0
if(registerxy == 1)
goto Tu1
if(registerxy == 2)
goto Tu2
if(registerxy == 3)
goto Tu3

Achja evtl ists komplizierter das der Mikroprozessor nicht alles versteht Eine Übersicht über die Befehle findet man auf www.sprut.de
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.03.2005, 14:56 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


vermutlich so das man die spungadressen an eine vom registerinhalt abhängigen stelle legt und sich somit einen vergleich erspart
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.03.2005, 15:29 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hmm ist ja noch komplizierter als ein Vergleich
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.03.2005, 15:44 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

hmm ist ja noch komplizierter als ein Vergleich


ja aber nur für dein hirn und nicht für den rechner
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.03.2005, 17:44 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


wie ginge das "kompliziert für rechner, nicht für hirn"?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.03.2005, 18:07 Uhr
Bruder Leif
dances with systems
(Operator)



Zitat von FloSoft:
wie ginge das "kompliziert für rechner, nicht für hirn"?


Wie ein einzelnes if(...) goto, nur mehrmals hintereinander
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.03.2005, 20:23 Uhr
(un)wissender
Niveauwart


1.Baue ein Feld mit Sprungadressen.
2.Springe an FeldmitSprungadressen[registerxy].
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Assembler ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: