Thema: .NET schutz
Einzelnen Beitrag anzeigen
Alt 27.06.09, 12:19   #15 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 198
Standard

Naja, ich glaube, das Konzept der Stackmaschine hast Du missverstanden
Irgendwie wird nämlich der Stack bei Dir immer nur erhöht.

Das Prinzip der Stackmaschine ist immer, Operatoren auf dem Stack zu lagern, aber diese auch nach gebrauch wieder vom Stack zu popen.
Bps Addition:
Code:
[stack]
2
2
[Stackend]

ADD holt sich seine Parameter von Stack:

Par1=Stack.pop
[stack]
2
[stackend]

Par2=stack.pop
[stack]
[stackend]

pusht Ergebnis wieder auf den Stack:
stack.push (2+2)
[stack]
4
[stackend]
Bei Dir dagegen:
Code:
Case "ADD"
    Stack(intStack) = CInt(Codefile(IP + 1))   //Weise den zweiten Opcode auf den Stack?
    intStack += 1
    IP += 2
Case "MUL"
    Stack(intStack) = Stack(intStack - 2) * Stack(intStack - 1)  //alte Operatoren bleiben auf dem Stack
    intStack += 1
    IP += 1
Bei Deinem ADD weist Du den Wert einfach dem Stack zu (ist also eher ein PUSH im klassischen Sinne - aber es kann ja auch so gedacht sein).

Dein MUL ist allerdings so nicht korrekt (bzw:bildet einen Memoryleak, da hier nie der Stackspeicher freigegeben wird ).
Er sollte den Speicher für die beiden Operanden freigeben (beide "popen") und nur das Ergebnis drauf pushen:

Code:
Case "MUL"
    int result= Stack(intStack - 2) * Stack(intStack - 1)
    intStack =intStack-2   'beide Operanden freigeben
   Stack(intStack)=result  'Ergebis speichern
    intStack=intStack+1    'Stackpointer auf den nächsten freiverfügbaren Platz
    IP += 1
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61