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