Stackmaschine & Assembler 0.7 & Basic Compiler 0.7
Übersicht

FlorianBetreff: Stackmaschine & Assembler 0.7 & Basic Compiler 0.7 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Beschreibung
Stackinterpreter Stackmaschine Teile 1 Stackmaschine Teile 2 Code: [AUSKLAPPEN] +---------------------------------------------------------------------------------------------------+ | | | V I R T U E L L E S T A C K M A S C H I N E | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Speicher | Codesegment | Datasegment | Stacksegment | Returnstacksegment | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Segment | CS | DS | SS | RS | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Zeiger | IP | -- | SP | RP | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ Code: [AUSKLAPPEN] +----------------------------------------------------------------------------------------------------------+ | | | V I R T U E L L E S T A C K M A S C H I N E | | | +----------------------------------------------------------------------------------------------------------+ |++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++| +----------------------------------------------------------------------------------------------------------+ | | | B E F E H LE | | | +--------------------+--------------------+-----------------------+------------------+---------------------+ | | | | | | | Transportbefehle | Sprungbefehle | Arithmetische Befehle | Logische Befehle | Ein-/Ausgabebefehle | | | | | | | +--------+-----------+--------+-----------+-----------------------+------------------+--------+------------+ | | | | | | | | | | Befehl | Parameter | Befehl | Parameter | Befehl | Befehl | Befehl | Parameter | | | | | | | | | | +--------+-----------+--------+-----------+-----------------------+------------------+--------+------------+ | | | | | | | | | | AStor | addr | Jmp | addr | Mul | And | Int | Nr | | ALoad | addr | Jle | addr | Div | Not | | | | Stor | | Call | addr | Sub | Or | | | | Load | | Ret | | Add | Xor | | | | Push | zahl | | | Incr | | | | | Pop | | | | Decr | | | | | Dbl | | | | Neg | | | | | swap | | | | | | | | | | | | | | | | | +--------+-----------+--------+-----------+-----------------------+------------------+--------+------------+ Code: [AUSKLAPPEN] +----------+---------------+------------------------------------------------------------------------+ | | | | | Befehl | Parameter | Beschreibung | | | | | +----------+---------------+------------------------------------------------------------------------+ |###################################################################################################| +----------+----------------------------------------------------------------------------------------+ | | | | | Push | Zahl | Die Konstante Zahl wird auf den Stack gelegt. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Pop | | Das oberste Stackelement wird gelöscht. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | dbl | | Das oberste Stackelement wird erneut auf den Stack gelegt. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Swap | | Die beiden obersten Stackelemente werden getauscht. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Mul | | Die beiden obersten Elemente werden vom Stack genommen und das | | | | Ergebnis der Rechenoperation auf dem Stack abgelegt. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Div | | Die beiden obersten Elemente werden vom Stack genommen und das | | | | Ergebnis der Rechenoperation auf dem Stack abgelegt. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Sub | | Die beiden obersten Elemente werden vom Stack genommen und das | | | | Ergebnis der Rechenoperation auf dem Stack abgelegt. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Neg | | Das Vorzeichen des obersten Stackelementes wird umgekehrt. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Incr | | Der Wert des oberste Stackelementes wird um eins erhöht. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Decr | | Der Wert des oberste Stackelementes wird um eins erniedrigt. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | And | | Die beiden obersten Elemente werden vom Stack genommen und das | | | | Ergebnis der Rechenoperation auf dem Stack abgelegt. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Not | | Das oberste Stackelement wird vom Stack genommen und das Rechenerbinis | | | | auf den Stack abgelegt. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Or | | Die beiden obersten Elemente werden vom Stack genommen und das | | | | Ergebnis der Rechenoperation auf dem Stack abgelegt. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Xor | | Die beiden obersten Elemente werden vom Stack genommen und das | | | | Ergebnis der Rechenoperation auf dem Stack abgelegt. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Call | addr | Durch diesen Befehl wird ein Unterprogramm auf gerufen. Zuerst wird | | | | die Rücksprungsadresse auf den Returnstack abgelegt. Danach wird zur | | | | Adresse addr gesprungen. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Ret | | Durch diesen Befehl wird das Unterprogramm verlassen. | | | | Es wird die Adresse addr vom Returnstack genommen und dort | | | | hingesprungen. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Jmp | addr | Unbedingter Sprung zur Instruktion an Adresse addr. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Jle | addr | Sprung zur Instruktion an Adresse addr, falls das oberste Stackelement | | | | kleiner oder gleich 0 ist. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | AStor | addr | Das oberste Element wird vom Stack genommen und im Speicher unter addr | | | | im Datasegment abgelegt. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | ALoad | addr | Eine Zahl wird von der Speicheradresse addr im Datasegment gelesen und | | | | auf den Stack gelegt. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Stor | | Die Adressse addr wird vom Stack genommen. | | | | Die Zahl wird v om Stack genommen und unter der Adresse addr im | | | | Datasegment gespeichert. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Load | | Dieser Befehl liest eine Zahl unter der Adresee addr im Datasegment | | | | ein und legt diese auf den Stack ab. Die Adresse addr wird datei vom | | | | Stack genommen. | | | | | +----------+---------------+------------------------------------------------------------------------+ | | | | | Int | Nr | Durch diesen Befehl wird eine VM-Funktion mit der Funktions-Nummer Nr | | | | aufgerufen. | | | | | +----------+---------------+------------------------------------------------------------------------+ Code: [AUSKLAPPEN] +---------------------------------------------------------------------------------------------------+ | | | B E F E H L S S A T Z | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Befehl | Codesegment | Datasegment | Stacksegment | Returnstacksegment | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ |###################################################################################################| +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Push | XX | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Pop | -- | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Dbl | -- | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Swap | -- | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Mul | -- | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Div | -- | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Sub | -- | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Add | -- | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Neg | -- | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Incr | -- | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Decr | -- | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | And | -- | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Not | -- | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Or | -- | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Xor | -- | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Call | XX | -- | -- | XX | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Ret | XX | -- | -- | XX | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Jmp | XX | -- | -- | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Jle | XX | -- | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | AStor | -- | XX | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | ALoad | -- | XX | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Stor | XX | XX | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Load | XX | XX | XX | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ | | | | | | | Int | XX | -- | -- | -- | | | | | | | +----------+------------------+---------------------+-------------------+---------------------------+ Code: [AUSKLAPPEN] Const MaxCode = 4096 Const MaxData = 4096 Const MaxStack = 1024 Const MaxReturnStack= 1024 Const cPush = 1 Const cPop = 2 Const cDbl = 3 Const cSwap = 4 Const cMul = 5 Const cDiv = 6 Const cSub = 7 Const cAdd = 8 Const cNeg = 9 Const cIncr =10 Const cDecr =11 Const cAnd =12 Const cNot =13 Const cOr =14 Const cXor =15 Const cCall =16 Const cRet =17 Const cJmp =18 Const cJle =19 Const cAStor =20 Const cALoad =21 Const cStor =22 Const cLoad =23 Const cInt =24 Global PCodeName$[24] PCodeName[cPush] = "Push " PCodeName[cPop] = "Pop " PCodeName[cDbl] = "Dbl " PCodeName[cSwap] = "Swap " PCodeName[cMul] = "Mul " PCodeName[cDiv] = "Div " PCodeName[cSub] = "Sub " PCodeName[cAdd] = "Add " PCodeName[cNeg] = "Neg " PCodeName[cIncr] = "Incr " PCodeName[cDecr] = "Decr " PCodeName[cAnd] = "And " PCodeName[cNot] = "Not " PCodeName[cOr] = "Or " PCodeName[cXor] = "Xor " PCodeName[cCall] = "Call " PCodeName[cRet] = "Ret " PCodeName[cJmp] = "Jmp " PCodeName[cJle] = "Jle " PCodeName[cAStor] = "AStor" PCodeName[cALoad] = "ALoad" PCodeName[cStor] = "Stor " PCodeName[cLoad] = "Load " PCodeName[cInt] = "Int " Type TVM Field CS[MaxCode ] Field DS[MaxData ] Field SS[MaxStack ] Field RS[MaxReturnStack] Field IP Field SP Field RP End Type Global VM.TVM VM=New TVM VM\CS[0]=cPush VM\CS[1]=100 VM\CS[2]=CPush VM\CS[3]=2 VM\CS[4]=cMul VM\CS[5]=CInt VM\CS[6]=1 VM\CS[7]=CInt VM\CS[8]=2 Run_VM End VM\CS[0]=cPush VM\CS[1]=100 VM\CS[2]=CPush VM\CS[3]=20 VM\CS[4]=cAStor VM\CS[5]=1 VM\CS[6]=cincr VM\CS[7]=CPush VM\CS[8]=1000 VM\CS[9]=cALoad VM\CS[10]=1 VM\CS[11]=CInt VM\CS[12]=1 VM\CS[13]=CInt VM\CS[14]=2 Run_VM Function Load_VM(Dateiname$) FileNr=ReadFile(DateiName$) If FileNr=0 Then Return False WMaxCode=ReadInt(FileNr) WMaxData=ReadInt(FileNr) WMaxStack=ReadInt(FileNr) WMaxReturnStack=ReadFile(FileNr) IP=ReadInt(FileNr) SP=ReadInt(FileNr) RP=ReadInt(FileNr) VM=New TVM For Zeiger=0 To WMaxCode VM\CS[Zeiger]=ReadInt(FileNr) Next For Zeiger=0 To WMaxData VM\DS[Zeiger]=ReadInt(FileNr) Next For Zeiger=0 To WMaxStack VM\SS[Zeiger]=ReadInt(FileNr) Next For Zeiger=0 To WMaxReturnStack VM\RS[Zeiger]=ReadInt(FileNr) Next CloseFile FileNr Return True End Function Function Save_VM(Dateiname$) FileNr=WriteFile(Dateiname$) If FileNr=0 Then Return False WriteInt FileNr,MaxCode WriteInt FileNr,MaxData WriteInt FileNr,MaxStack WriteInt FileNr,MaxReturnStack WriteInt FileNr,VM\IP WriteInt FileNr,VM\SP WriteInt FileNr,VM\RP For Zeiger=0 To MaxCode WriteInt FileNr,VM\CS[Zeiger] Next For Zeiger=0 To MaxData WriteInt FileNr,VM\DS[Zeiger] Next For Zeiger=0 To MaxStack WriteInt FileNr,VM\SS[Zeiger] Next For Zeiger=0 To MaxReturnStack WriteInt FileNr,VM\RS[Zeiger] Next CloseFile FileNr Return True End Function Function Run_VM() Repeat IP=VM\IP Select VM\CS[VM\IP] Case cPush VM\SS[VM\SP]=VM\CS[VM\IP+1] VM\SP=VM\SP+1 VM\IP=VM\IP+2 Case cPop VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cDbl VM\SS[VM\SP]=VM\SS[VM\SP-1] VM\SP=VM\SP+1 VM\IP=VM\IP+1 Case cSwap VM\SS[VM\SP-1]=VM\SS[VM\SP-1]+VM\SS[VM\SP-2] VM\SS[VM\SP-2]=VM\SS[VM\SP-1]-VM\SS[VM\SP-2] VM\SS[VM\SP-1]=VM\SS[VM\SP-1]-VM\SS[VM\SP-2] VM\IP=VM\IP+1 Case cMul VM\SS[VM\SP-2]=VM\SS[VM\SP-1]*VM\SS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cDiv VM\SS[VM\SP-2]=VM\SS[VM\SP-1]/VM\SS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cSub VM\SS[VM\SP-2]=VM\SS[VM\SP-1]-VM\SS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cAdd VM\SS[VM\SP-2]=VM\SS[VM\SP-1]+VM\SS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cNeg VM\SS[VM\SP-1]=-VM\SS[VM\SP-1] VM\IP=VM\IP+1 Case cIncr VM\SS[VM\SP-1]=VM\SS[VM\SP-1]+1 VM\IP=VM\IP+1 Case cNot VM\SS[VM\SP-1]=Not VM\SS[VM\SP-1] VM\IP=VM\IP+1 Case cDecr VM\SS[VM\SP-1]=VM\SS[VM\SP-1]-1 VM\IP=VM\IP+1 Case cAnd VM\SS[VM\SP-2]=VM\SS[VM\SP-1] And VM\SS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cOr VM\SS[VM\SP-2]=VM\SS[VM\SP-1] Or VM\SS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cXor VM\SS[VM\SP-2]=VM\SS[VM\SP-1] Xor VM\SS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cCall VM\RS[VM\RP]=VM\IP+2 VM\IP=VM\CS[VM\IP+1] VM\RP=VM\RP+1 Case cRet VM\RP=VM\RP-1 VM\IP=VM\RS[VM\RP] Case cJmp VM\IP=VM\CS[VM\IP+1] Case cJle If VM\DS[VM\SP-1]=<0 Then VM\IP=VM\CS[VM\IP+1] Else VM\IP=VM\IP+2 EndIf Case cAStor VM\SP=VM\SP-1 VM\DS[VM\CS[VM\IP+1]]=VM\SS[VM\SP] VM\IP=VM\IP+2 Case cALoad VM\SS[VM\SP]=VM\DS[VM\CS[VM\IP+1]] VM\SP=VM\SP+1 VM\IP=VM\IP+2 Case cStor VM\DS[VM\SS[SP-1]]=VM\SS[VM\SP-2] VM\SP=VM\SP-1 VM\IP=VM\IP+1 Case cLoad VM\SS[SP-1]=VM\DS[VM\SS[VM\SP-1]] VM\IP=VM\IP+1 Case cInt Schnittstelle VM\CS[VM\IP+1] VM\IP=VM\IP+2 Default End Select Forever End Function Function Schnittstelle(Nr) Select Nr Case 1 Print Pop() Case 2 WaitKey End End Select End Function Function Push(Wert) VM\SS[VM\SP]=Wert VM\SP=VM\SP+1 End Function Function Pop() VM\SP=VM\SP-1 Return VM\SS[VM\SP] End Function Function PopString$() Wert=Pop() While Wert<>0 S$=Chr$(Wert)+S$ Wert=Pop() Wend Return S$ End Function Function PushString(S$) Slen=Len(S$) Push 0 For P=1 To SLEN Push Asc(Mid$(S$,P,1)) Next End Function |
||
Das große BlitzBasic Community Tutorial
Stackmaschine 2.0 |
- Zuletzt bearbeitet von Florian am So, Apr 09, 2006 21:19, insgesamt 13-mal bearbeitet
Florian |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Basic Compiler ver 0.7
Code: [AUSKLAPPEN] Befehle: Mul Var1, Var2 Div Var1, Var2 Add Var1, var2 Swap Var1, var2 Mul Var, Wert Div Var, Wert Add Var, Wert Swap Var, Wert Int Nr , Parameter1, Parameter2, ... Incr Var Decr Var Not Var Asm End Asm Call Name Parameter1, Parameter2, ... Callx Name Parameter1, Parameter2, ... Sub Name Parameter1, Parameter2, ... Exitsub End sub Code: [AUSKLAPPEN] Const MaxCallStack=16 Global CallStackP Global CallStack$[MaxCallStack] Global InAsm=False Global InSub=False Global SubName$ Global OutputNr=WriteFile("VMASM.TXT") Global StackOben$ Global AStorStack$ Global LeerZeile Global Leerzeichen$ Const MaxConst=1024 Global ConstName$[MaxConst] Global ConstWert[MaxConst] Global ConstZeiger Const MaxIntFunction=256 Global IntFunctionName$[MaxIntFunction] Global IntFunctionNr[MaxIntFunction] Global IntFunctionZeiger Const MaxStringconst=1024 Global StringconstName$[MaxStringconst] Global StringconstWert$[MaxStringconst] Compiler_Basic_in_Asm "VMTest.bb" Function Compiler_Basic_in_Asm(InputDatei$,OutputNrDatei$="VM_Stackmaschine.ASM") OutputNr=WriteFile(OutputNrDatei$) InputNr=ReadFile(InputDatei$) If OutputNr=0 Or InputNr=0 Then If OutputNr<>0 Then CloseFile OutputNr If InputNr<>0 Then CloseFile InputNr Return False EndIf While Not(Eof(InputNr)) ZeilenNr=ZeilenNr+1 Zeile$=ReadLine$(InputNr) If BasicInAsm(Zeile$)=False Then Print "Fehler in Zeilen Nr."+Str$(ZeilenNr) Print "Zeile: "+Zeile$ WaitKey Exit EndIf Wend CloseFile OutputNr CloseFile InputNr Return True End Function Function Add_Const(Name$,Wert) ConstName[ConstZeiger]=Name$ ConstWert[ConstZeiger]=Wert ConstZeiger=ConstZeiger+1 End Function Function Suche_Const(Name$) Name$=Lower$(Name$) For P=0 To ConstZeiger-1 If Lower$(ConstName[P])=Name$ Then Return P EndIf Next Return -1 End Function Function BasicInAsm(Zeile$) ParameterZahl=ArgC2(Zeile$) Leerzeichen$=String$(" ",InSub) Select Lower$(ArgV2$(Zeile$,1)) Case "const" If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ ParameterZahl=ArgC(Zeile$) Wert$=ArgV$(Zeile$,3) If TestZahl(Wert$)=True Then Add_Const ArgV$(Zeile$,2),Wert$ ElseIf Suche_Const(Wert$)>-1 Then Wert$=ConstWert[Suche_Const(Wert$)] Add_Const ArgV$(Zeile$,2),Wert$ ElseIf "sub"=Lower$(Wert$) If TestZahl(ArgV$(Zeile$,4))=True Then If TestZahl(ArgV$(Zeile$,5))=True Then Add_Const ArgV$(Zeile$,2),Int(ArgV$(Zeile$,4))-Int(ArgV$(Zeile$,5)) Else EndIf Else EndIf ElseIf "div" ElseIf "mul" ElseIf "add" ElseIf "and" ElseIf "or" ElseIf "xor" EndIf Case "goto" If ParameterZahl<>2 Then Return False EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"Jmp "+ArgV2$(Zeile$,2) LeerZeile=True If ParameterZahl<>2 Then Return False EndIf Case "gosub" If ParameterZahl<>2 Then Return False EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"call "+ArgV2$(Zeile$,2) LeerZeile=True Case "return" If ParameterZahl>1 Then Return False EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"ret" LeerZeile=True Case "int" ParameterZahl=ArgC(Zeile$) If ParameterZahl<2 Then Return False EndIf If Len(StackOben$)<>0 Then WriteLine OutputNr, Leerzeichen$+"AStor "+StackOben$ StackOben$="" EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ Arg$="" Function_Nr$=ArgV$(Zeile$,2) If TestZahl(Function_Nr$)=False Then ConstNr=Suche_Const(Function_Nr$) Print ConstNr If ConstNr=-1 Then ;Error Return False EndIf Function_Nr$=ConstWert[ConstNr] EndIf For Zeiger=3 To ParameterZahl Arg$=ArgV$(Zeile$,Zeiger) If ArgTyp$(Zeile$,Zeiger)="$" Then Arg$=Chr$(34)+Arg$ CallStack_Push Arg$ Next While CallStackP<>0 Parameter$=CallStack_Pop$() If TestZahl(Parameter$)=True Then WriteLine OutputNr,Leerzeichen$+"Push "+Parameter$ ElseIf Mid$(Parameter$,1,1)=Chr$(34) Then WriteAsmString Mid$(Parameter$,2) Else WriteLine OutputNr,Leerzeichen$+"Aload "+Parameter$ EndIf Wend WriteLine OutputNr, Leerzeichen$+"Int "+Int(Function_Nr$) LeerZeile=True StackOben$="" Case "call" If ParameterZahl<2 Then Return False EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ Function_Name$=ArgV2$(Zeile$,2) For Zeiger=3 To ParameterZahl CallStack_Push ArgV2$(Zeile$,Zeiger) Next While CallStackP<>0 Parameter$=CallStack_Pop$() If TestZahl(Parameter$)=True Then WriteLine OutputNr,Leerzeichen$+"Push "+Parameter$ ElseIf Suche_Const(Parameter$)>-1 Then WriteLine OutputNr,Leerzeichen$+"Push "+ConstWert[Suche_Const(Parameter$)] Else WriteLine OutputNr,Leerzeichen$+"Aload "+Parameter$ EndIf Wend WriteLine OutputNr, Leerzeichen$+"Call "+Function_Name$ LeerZeile=True Case "callx" If ParameterZahl<2 Then Return False EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ Function_Name$=ArgV2$(Zeile$,2) For Zeiger=3 To ParameterZahl CallStack_Push ArgV2$(Zeile$,Zeiger) Next WriteLine OutputNr,Leerzeichen$+"Push "+Str$(ParameterZahl-2) While CallStackP<>0 Parameter$=CallStack_Pop$() If TestZahl(Parameter$)=True Then WriteLine OutputNr,Leerzeichen$+"Push "+Parameter$ ElseIf Suche_Const(Parameter$)>-1 Then WriteLine OutputNr,Leerzeichen$+"Push "+ConstWert[Suche_Const(Parameter$)] Else WriteLine OutputNr,Leerzeichen$+"Aload "+Parameter$ EndIf Wend WriteLine OutputNr, Leerzeichen$+"Call "+Function_Name$ LeerZeile=True Case "sub" If Len(StackOben$)<>0 Then WriteLine OutputNr, Leerzeichen$+"AStor "+StackOben$ StackOben$="" EndIf InSub=True If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ Function_Name$=ArgV2$(Zeile$,2) SubName$=Function_Name$ WriteLine OutputNr, Function_Name$+":" For Zeiger=3 To ParameterZahl WriteLine OutputNr," AStor "+ArgV2$(Zeile$,Zeiger) Next WriteLine OutputNr, "" For Zeiger=3 To ParameterZahl WriteLine OutputNr," "+ArgV2$(Zeile$,Zeiger)+" dw 0" Next WriteLine OutputNr, "" LeerZeile=False Case "exitsub" If ParameterZahl<>1 Then Return False EndIf If Len(StackOben$)<>0 Then WriteLine OutputNr, Leerzeichen$+"AStor "+StackOben$ StackOben$="" EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, "Ret" LeerZeile=True Case "endsub" If ParameterZahl<>1 Then Return False EndIf If Len(StackOben$)<>0 Then WriteLine OutputNr, Leerzeichen$+"AStor "+StackOben$ StackOben$="" EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, "Ret" InSub=False SubName$="" LeerZeile=True Case "end" Select Lower$(ArgV2$(Zeile$,2)) Case "sub" If ParameterZahl<>2 Then Return False EndIf If Len(StackOben$)<>0 Then WriteLine OutputNr, Leerzeichen$+"AStor "+StackOben$ StackOben$="" EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, "Ret" InSub=False SubName$="" LeerZeile=True Case "asm" If ParameterZahl<>2 Then Return False EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ InAsm=False End Select Case "asm" If ParameterZahl<>1 Then Return False EndIf If Len(StackOben$)<>0 Then WriteLine OutputNr, Leerzeichen$+"AStor "+StackOben$ StackOben$="" EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ InAsm=True LeerZeile=True Case "endasm" If ParameterZahl<>1 Then Return False EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ InAsm=False LeerZeile=True Case "mul" ParameterZahl=ArgC(Zeile$) If ParameterZahl<>3 Then Return False EndIf If StackOben$=ArgV2$(Zeile$,2) Then If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ If TestZahl(ArgV2$(Zeile$,3))=True Then WriteLine OutputNr, Leerzeichen$+"Push "+ArgV2$(Zeile$,3) ElseIf Suche_Const(ArgV2$(Zeile$,3))>-1 Then WriteLine OutputNr,Leerzeichen$+"Push "+ConstWert[Suche_Const(ArgV2$(Zeile$,3))] Else WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,3) EndIf WriteLine OutputNr, Leerzeichen$+"Mul" LeerZeile=True ElseIf StackOben$=ArgV2$(Zeile$,3) Then If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"dbl" WriteLine OutputNr, Leerzeichen$+"AStor "+StackOben$ WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,2) WriteLine OutputNr, Leerzeichen$+"Mul" LeerZeile=True StackOben$=ArgV2$(Zeile$,2) Else If Len(StackOben$)<>0 Then WriteLine OutputNr, Leerzeichen$+"AStor "+StackOben$ EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,2) If TestZahl(ArgV2$(Zeile$,3))=True Then WriteLine OutputNr, Leerzeichen$+"Push "+ArgV2$(Zeile$,3) ElseIf Suche_Const(ArgV2$(Zeile$,3))>-1 Then WriteLine OutputNr,Leerzeichen$+"Push "+ConstWert[Suche_Const(ArgV2$(Zeile$,3))] Else WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,3) EndIf WriteLine OutputNr, Leerzeichen$+"Mul" LeerZeile=True StackOben=ArgV2$(Zeile$,2) EndIf Case "add" ParameterZahl=ArgC(Zeile$) If ParameterZahl<>3 Then Return False EndIf If StackOben$=ArgV2$(Zeile$,2) Then If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ If TestZahl(ArgV2$(Zeile$,3))=True Then WriteLine OutputNr, Leerzeichen$+"Push "+ArgV2$(Zeile$,3) ElseIf Suche_Const(ArgV2$(Zeile$,3))>-1 Then WriteLine OutputNr,Leerzeichen$+"Push "+ConstWert[Suche_Const(ArgV2$(Zeile$,3))] Else WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,3) EndIf LeerZeile=True WriteLine OutputNr, Leerzeichen$+"Add" ElseIf StackOben$=ArgV2$(Zeile$,3) Then If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"dbl" WriteLine OutputNr, Leerzeichen$+"AStor "+StackOben$ WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,2) WriteLine OutputNr, Leerzeichen$+"Add" LeerZeile=True StackOben$=ArgV2$(Zeile$,2) Else If Len(StackOben$)<>0 Then WriteLine OutputNr, Leerzeichen$+"AStor "+StackOben$ EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,2) If TestZahl(ArgV2$(Zeile$,3))=True Then WriteLine OutputNr, Leerzeichen$+"Push "+ArgV2$(Zeile$,3) ElseIf Suche_Const(ArgV2$(Zeile$,3))>-1 Then WriteLine OutputNr,Leerzeichen$+"Push "+ConstWert[Suche_Const(ArgV2$(Zeile$,3))] Else WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,3) EndIf WriteLine OutputNr, Leerzeichen$+"Add" LeerZeile=True StackOben$=ArgV2$(Zeile$,2) EndIf Case "div" ParameterZahl=ArgC(Zeile$) If ParameterZahl<>3 Then Return False EndIf If StackOben$=ArgV2$(Zeile$,2) Then If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ If TestZahl(ArgV2$(Zeile$,3))=True Then WriteLine OutputNr, Leerzeichen$+"Push "+ArgV2$(Zeile$,3) ElseIf Suche_Const(ArgV2$(Zeile$,3))>-1 Then WriteLine OutputNr,Leerzeichen$+"Push "+ConstWert[Suche_Const(ArgV2$(Zeile$,3))] Else WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,3) EndIf WriteLine OutputNr, Leerzeichen$+"Div" LeerZeile=True ElseIf StackOben$=ArgV2$(Zeile$,3) Then If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"dbl" WriteLine OutputNr, Leerzeichen$+"AStor "+StackOben$ WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,2) WriteLine OutputNr, Leerzeichen$+"Div" LeerZeile=True StackOben$=ArgV2$(Zeile$,2) Else If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,2) If TestZahl(ArgV2$(Zeile$,3))=True Then WriteLine OutputNr, Leerzeichen$+"Push "+ArgV2$(Zeile$,3) ElseIf Suche_Const(ArgV2$(Zeile$,3))>-1 Then WriteLine OutputNr,Leerzeichen$+"Push "+ConstWert[Suche_Const(ArgV2$(Zeile$,3))] Else WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,3) EndIf WriteLine OutputNr, Leerzeichen$+"Div" WriteLine OutputNr, Leerzeichen$+"AStor "+ArgV2$(Zeile$,2) LeerZeile=True EndIf Case "incr" If ParameterZahl<>2 Then Return False EndIf If StackOben$=ArgV2$(Zeile$,2) Then If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"Incr" LeerZeile=True Else If Len(StackOben$)<>0 Then WriteLine OutputNr, Leerzeichen$+"AStor "+StackOben$ EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,2) WriteLine OutputNr, Leerzeichen$+"Incr" StackOben$=ArgV2$(Zeile$,2) LeerZeile=True EndIf Case "decr" If ParameterZahl<>2 Then Return False EndIf If StackOben$=ArgV2$(Zeile$,2) Then If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"Decr" LeerZeile=True Else If Len(StackOben$)<>0 Then WriteLine OutputNr, Leerzeichen$+"AStor "+StackOben$ EndIf If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,2) WriteLine OutputNr, Leerzeichen$+"Decr" StackOben$=ArgV2$(Zeile$,2) LeerZeile=True EndIf Case "not" If ParameterZahl<>2 Then Return False EndIf If StackOben$=ArgV2$(Zeile$,2) Then If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"not" LeerZeile=True Else If Len(StackOben$)<>0 Then WriteLine OutputNr, Leerzeichen$+"AStor "+StackOben$ EndIf WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,2) WriteLine OutputNr, Leerzeichen$+"not" StackOben$=ArgV2$(Zeile$,2) LeerZeile=True EndIf Case "swap" ParameterZahl=ArgC(Zeile$) If ParameterZahl<>3 Then Return False EndIf If StackOben$=ArgV2$(Zeile$,2) Then If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,3) WriteLine OutputNr, Leerzeichen$+"Swap" WriteLine OutputNr, Leerzeichen$+"AStor "+ArgV2$(Zeile$,3) LeerZeile=True ElseIf StackOben$=ArgV2$(Zeile$,3) Then If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,2) WriteLine OutputNr, Leerzeichen$+"Swap" WriteLine OutputNr, Leerzeichen$+"AStor "+ArgV2$(Zeile$,2) LeerZeile=True Else If LeerZeile=True Then WriteLine OutputNr, "" WriteLine OutputNr, Leerzeichen$+";"+Zeile$ WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,2) WriteLine OutputNr, Leerzeichen$+"Aload "+ArgV2$(Zeile$,3) WriteLine OutputNr, Leerzeichen$+"Swap" WriteLine OutputNr, Leerzeichen$+"AStor "+ArgV2$(Zeile$,2) LeerZeile=True StackOben$=ArgV2$(Zeile$,3) EndIf Case "" If LeerZeile=True Then WriteLine OutputNr, "" LeerZeile=False Default WriteLine OutputNr, Leerzeichen$+Zeile$ End Select Return True End Function Function CallStack_Pop$() CallStackP=CallStackP-1 Return CallStack[CallStackP] End Function Function CallStack_Push(Wert$) CallStack[CallStackP]=Wert$ CallStackP=CallStackP+1 End Function Function WriteAsmString(S$) WriteLine OutputNr,Leerzeichen$+"Push "+0 Lang=Len(S$) For P=1 To Lang WriteLine OutputNr,Leerzeichen$+"Push "+Str$(Asc(Mid$(S$,P,1))) Next End Function Function TestZahl(S$) Slen=Len(S$) For P=1 To Slen If Instr("0123456789",Mid$(S$,P,1))=0 Then Return False Next Return True End Function Function ArgV$(Zeile$,arg) LenZeile=Len(Zeile$) For X=1 To LenZeile Select Mid$(Zeile$,X,1) Case " " ParameterAn=False Case ";" If NeuerParameter=True Then Return ;Error End If Return ;Argument nicht gefunden Case "," If NeuerParameter=True Then Return ;Error End If If Index<2 Then Return ;Error End If ParameterAn=False NeuerParameter=True Case Chr$(34);" If Index=>2 And NeuerParameter=False Then Return ; End If NeuerParameter=False index=index+1 NeuerParameter=False If index=arg Then For X=X+1 To LenZeile If Mid$(Zeile$,X,1)=Chr$(34) Then Exit Else Parameter$=Parameter$+ Mid$(Zeile$,X,1) End If Next Return Parameter$ Else For X=X+1 To LenZeile If Mid$(Zeile$,X,1)=Chr$(34) Then Exit Next End If Default If ParameterAn=False Then If Index=>2 And NeuerParameter=False Then Return ; End If NeuerParameter=False ParameterAn=True index=index+1 End If If index=arg Then Parameter$=Parameter$+ Mid$(Zeile$,X,1) End If End Select Next Return Parameter$ End Function Function ArgC(Zeile$) LenZeile=Len(Zeile$) For X=1 To LenZeile Select Mid$(Zeile$,X,1) Case " " ParameterAn=False Case ";" If NeuerParameter=True Then Return ;Error End If Return Index Case "," If NeuerParameter=True Then Return ;Error End If If Index<2 Then Return ;Error End If ParameterAn=False NeuerParameter=True Case Chr$(34);" If Index=>2 And NeuerParameter=False Then Return End If NeuerParameter=False index=index+1 NeuerParameter=False For X=X+1 To LenZeile If Mid$(Zeile$,X,1)=Chr$(34) Then Exit Next Default If ParameterAn=False Then If Index=>2 And NeuerParameter=False Then Return End If NeuerParameter=False ParameterAn=True index=index+1 End If End Select Next Return Index End Function Function ArgTest(Zeile$) LenZeile=Len(Zeile$) For X=1 To LenZeile Select Mid$(Zeile$,X,1) Case " " ParameterAn=False Case ";" If NeuerParameter=True Then Return False End If Return Index Case "," If NeuerParameter=True Then Return False End If If Index<2 Then Return False End If ParameterAn=False NeuerParameter=True Case Chr$(34);" If Index=>2 And NeuerParameter=False Then Return False End If NeuerParameter=False index=index+1 NeuerParameter=False For X=X+1 To LenZeile If Mid$(Zeile$,X,1)=Chr$(34) Then Exit Next Default If ParameterAn=False Then If Index=>2 And NeuerParameter=False Then Return False End If NeuerParameter=False ParameterAn=True index=index+1 End If End Select Next If NeuerParameter=True Then Return False Else Return True End If End Function Function ArgV2$(Zeile$,arg) LenZeile=Len(Zeile$) For X=1 To LenZeile Select Mid$(Zeile$,X,1) Case " " ParameterAn=False Case ";" If NeuerParameter=True Then Return ;Error End If Return ;Argument nicht gefunden Case "," If NeuerParameter=True Then Return ;Error End If If Index<2 Then Return ;Error End If ParameterAn=False NeuerParameter=True Case Chr$(34);" If Index=>3 And NeuerParameter=False Then Return ;Error End If NeuerParameter=False index=index+1 NeuerParameter=False If index=arg Then For X=X+1 To LenZeile If Mid$(Zeile$,X,1)=Chr$(34) Then Exit Else Parameter$=Parameter$+ Mid$(Zeile$,X,1) End If Next Return Parameter$ Else For X=X+1 To LenZeile If Mid$(Zeile$,X,1)=Chr$(34) Then Exit Next End If Default If ParameterAn=False Then If Index=>3 And NeuerParameter=False Then Return ;Error End If NeuerParameter=False ParameterAn=True index=index+1 End If If index=arg Then Parameter$=Parameter$+ Mid$(Zeile$,X,1) End If End Select Next Return Parameter$ End Function Function ArgTest2(Zeile$) LenZeile=Len(Zeile$) For X=1 To LenZeile Select Mid$(Zeile$,X,1) Case " " ParameterAn=False Case ";" If NeuerParameter=True Then Return False End If Return Index Case "," If NeuerParameter=True Then Return False End If If Index<2 Then Return False End If ParameterAn=False NeuerParameter=True Case Chr$(34);" If Index=>3 And NeuerParameter=False Then Return False End If NeuerParameter=False index=index+1 NeuerParameter=False For X=X+1 To LenZeile If Mid$(Zeile$,X,1)=Chr$(34) Then Exit Next Default If ParameterAn=False Then If Index=>3 And NeuerParameter=False Then Return False End If NeuerParameter=False ParameterAn=True index=index+1 End If End Select Next If NeuerParameter=True Then Return False Else Return True End If End Function Function Farbe(r,g,B) Return r*$10000 + g*$100 + b End Function Function ColorI(I) Color (I And $FF0000)/$10000,(I And $FF00)/$100,I And $FF End Function Function ArgC2(Zeile$) LenZeile=Len(Zeile$) For X=1 To LenZeile Select Mid$(Zeile$,X,1) Case " " ParameterAn=False Case ";" If NeuerParameter=True Then Return ;Error End If Return Index Case "," If NeuerParameter=True Then Return ;Error End If If Index<3 Then Return ;Error End If ParameterAn=False NeuerParameter=True Case Chr$(34);" If Index=>3 And NeuerParameter=False Then Return End If NeuerParameter=False index=index+1 NeuerParameter=False For X=X+1 To LenZeile If Mid$(Zeile$,X,1)=Chr$(34) Then Exit Next Default If ParameterAn=False Then If Index=>3 And NeuerParameter=False Then Return End If NeuerParameter=False ParameterAn=True index=index+1 End If End Select Next Return Index End Function Function ArgTyp$(Zeile$,arg) LenZeile=Len(Zeile$) For X=1 To LenZeile Select Mid$(Zeile$,X,1) Case " " ParameterAn=False Case ";" If NeuerParameter=True Then Return ;Error End If Return ;Argument nicht gefunden Case "," If NeuerParameter=True Then Return ;Error End If If Index<2 Then Return ;Error End If ParameterAn=False NeuerParameter=True Case Chr$(34);" If Index=>2 And NeuerParameter=False Then Return ;Error End If NeuerParameter=False index=index+1 NeuerParameter=False If index=arg Then Return "$" Else For X=X+1 To LenZeile If Mid$(Zeile$,X,1)=Chr$(34) Then Exit Next End If Default If ParameterAn=False Then If Index=>2 And NeuerParameter=False Then Return ;Error End If NeuerParameter=False ParameterAn=True index=index+1 End If If index=arg Then Return "Z" End If End Select Next End Function Function ArgTyp2$(Zeile$,arg) LenZeile=Len(Zeile$) For X=1 To LenZeile Select Mid$(Zeile$,X,1) Case " " ParameterAn=False Case ";" If NeuerParameter=True Then Return ;Error End If Return ;Argument nicht gefunden Case "," If NeuerParameter=True Then Return ;Error End If If Index<3 Then Return ;Error End If ParameterAn=False NeuerParameter=True Case Chr$(34);" If Index=>3 And NeuerParameter=False Then Return ;Error End If NeuerParameter=False index=index+1 NeuerParameter=False If index=arg Then Return "$" Else For X=X+1 To LenZeile If Mid$(Zeile$,X,1)=Chr$(34) Then Exit Next End If Default If ParameterAn=False Then If Index=>3 And NeuerParameter=False Then Return ;Error End If NeuerParameter=False ParameterAn=True index=index+1 End If If index=arg Then Return "Z" End If End Select Next End Function Function Lower$(S$) Slen=Len(S) If Slen>0 Then For P=1 To Slen ASCII=Asc(Mid$(S$,P,1)) If Ascii>64 And Ascii<92 Then Ascii=Ascii+32 ElseIf Ascii=220 Then ;ü Ascii=252 ElseIf Ascii=196 Then ;ä Ascii=228 ElseIf Ascii=214 Then ;ö Ascii=246 End If R$=R$+Chr$(ASCII) Next Return R$ End If End Function |
||
Das große BlitzBasic Community Tutorial
Stackmaschine 2.0 |
- Zuletzt bearbeitet von Florian am Do, Apr 06, 2006 19:27, insgesamt 6-mal bearbeitet
![]() |
IronstormErstklassiger Contest-Veranstalter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kannst du mir mal bitte erlären was das sein soll? Hab nämlich kein durchblick^^
MFG Blitzmaker |
||
Florian |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Assembler
Code: [AUSKLAPPEN] Befehle: Push Pop Dbl Swap Mul Div Sub Add Neg Incr Decr And Not Or Xor Call Ret Jmp Jle AStor ALoad Stor Load Int |
||
Das große BlitzBasic Community Tutorial
Stackmaschine 2.0 |
- Zuletzt bearbeitet von Florian am Di, März 28, 2006 6:26, insgesamt 2-mal bearbeitet
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Man muss schon recht "masochistisch" veranlagt sein, wenn man in Blitz ASM "nachprogrammiert" ![]() Aber nichts desto trotz beeindruckend. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Florian |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Code: [AUSKLAPPEN] Function Arg$(Zeile$,Index) Lang=Len(Zeile$) P=1 Parameter$="" For P=P To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then For P=P+1 To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then Exit EndIf Parameter$=Parameter$+Mid$(Zeile$,P,1) Next ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="(" Then ParameterZahl=ParameterZahl+1 Parameter$="(" ElseIf Mid$(Zeile$,P,1)=")" Then ParameterZahl=ParameterZahl+1 Parameter$=")" ElseIf Mid$(Zeile$,P,1)="+" Then ParameterZahl=ParameterZahl+1 Parameter$="+" ElseIf Mid$(Zeile$,P,1)="-" Then ParameterZahl=ParameterZahl+1 Parameter$="-" ElseIf Mid$(Zeile$,P,1)="*" Then ParameterZahl=ParameterZahl+1 Parameter$="*" ElseIf Mid$(Zeile$,P,1)="/" Then ParameterZahl=ParameterZahl+1 Parameter$="/" ElseIf Mid$(Zeile$,P,1)="," Then ParameterZahl=ParameterZahl+1 Parameter$="," ElseIf Mid$(Zeile$,P,1)=";" Then Return "" ElseIf Mid$(Zeile$,P,1)=" " Then Parameter$="" ElseIf Mid$(Zeile$,P,1)="=" Then ParameterZahl=ParameterZahl+1 If P<Lang Then If Mid$(Zeile$,P+1,1)=">" Then Parameter$="=>" P=P+1 ElseIf Mid$(Zeile$,P+1,1)="<" Then Parameter$="=<" P=P+1 Else Parameter$="=" EndIf Else Parameter$="=" EndIf ElseIf Mid$(Zeile$,P,1)=">" Then ParameterZahl=ParameterZahl+1 If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then Parameter$="=>" P=P+1 Else Parameter$=">" EndIf Else Parameter$=">" EndIf ElseIf Mid$(Zeile$,P,1)="<" Then ParameterZahl=ParameterZahl+1 If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then Parameter$="=<" P=P+1 Else Parameter$="<" EndIf Else Parameter$="<" EndIf Else Parameter$="" ParameterZahl=ParameterZahl+1 For P=P To lang If Mid$(Zeile$,P,1)=" " Then Exit ElseIf Mid$(Zeile$,P,1)="(" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=")" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="+" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="-" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="*" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="/" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="," Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="=" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=">" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="<" Then P=P-1 Exit Else Parameter$=Parameter$+Mid$(Zeile$,P,1) EndIf Next EndIf If Index=ParameterZahl Then Return Parameter$ Next End Function Function ArgZahl(Zeile$) Lang=Len(Zeile$) P=1 For P=P To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then For P=P+1 To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then Exit EndIf Next ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="(" Then ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)=")" Then ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="+" Then ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="-" Then ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="*" Then ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="/" Then ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="," Then ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)=";" Then Return ParameterZahl ElseIf Mid$(Zeile$,P,1)=" " Then ElseIf Mid$(Zeile$,P,1)="=" Then ParameterZahl=ParameterZahl+1 If P<Lang Then If Mid$(Zeile$,P+1,1)=">" Then P=P+1 ElseIf Mid$(Zeile$,P+1,1)="<" Then P=P+1 EndIf EndIf ElseIf Mid$(Zeile$,P,1)=">" Then ParameterZahl=ParameterZahl+1 If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then P=P+1 EndIf EndIf ElseIf Mid$(Zeile$,P,1)="<" Then ParameterZahl=ParameterZahl+1 If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then P=P+1 EndIf EndIf Else ParameterZahl=ParameterZahl+1 For P=P To lang If Mid$(Zeile$,P,1)=" " Then Exit ElseIf Mid$(Zeile$,P,1)="(" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=")" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="+" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="-" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="*" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="/" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="," Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="=" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=">" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="<" Then P=P-1 Exit EndIf Next EndIf Next Return ParameterZahl End Function Function ArgTyp$(Zeile$,Index) Lang=Len(Zeile$) P=1 For P=P To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then For P=P+1 To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then Exit EndIf Next ParameterTyp$="$" ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="(" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" ElseIf Mid$(Zeile$,P,1)=")" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" ElseIf Mid$(Zeile$,P,1)="+" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" ElseIf Mid$(Zeile$,P,1)="-" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" ElseIf Mid$(Zeile$,P,1)="*" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" ElseIf Mid$(Zeile$,P,1)="/" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" ElseIf Mid$(Zeile$,P,1)="," Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" ElseIf Mid$(Zeile$,P,1)=";" Then Return "" ElseIf Mid$(Zeile$,P,1)=" " Then ElseIf Mid$(Zeile$,P,1)="=" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" If P<Lang Then If Mid$(Zeile$,P+1,1)=">" Then P=P+1 ElseIf Mid$(Zeile$,P+1,1)="<" Then P=P+1 EndIf EndIf ElseIf Mid$(Zeile$,P,1)=">" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then P=P+1 EndIf EndIf ElseIf Mid$(Zeile$,P,1)="<" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then P=P+1 EndIf EndIf Else ParameterZahl=ParameterZahl+1 ParameterTyp$="z" For P=P To lang If Mid$(Zeile$,P,1)=" " Then Exit ElseIf Mid$(Zeile$,P,1)="(" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=")" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="+" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="-" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="*" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="/" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="," Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="=" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=">" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="<" Then P=P-1 Exit EndIf Next EndIf If Index=ParameterZahl Then Return ParameterTyp$ EndIf Next End Function Function ArgTyps$(Zeile$) Lang=Len(Zeile$) P=1 For P=P To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then For P=P+1 To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then Exit EndIf Next ParameterTyp$=ParameterTyp$+"$" ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="(" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" ElseIf Mid$(Zeile$,P,1)=")" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" ElseIf Mid$(Zeile$,P,1)="+" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" ElseIf Mid$(Zeile$,P,1)="-" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" ElseIf Mid$(Zeile$,P,1)="*" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" ElseIf Mid$(Zeile$,P,1)="/" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" ElseIf Mid$(Zeile$,P,1)="," Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" ElseIf Mid$(Zeile$,P,1)=";" Then Return ParameterTyp$ ElseIf Mid$(Zeile$,P,1)=" " Then ElseIf Mid$(Zeile$,P,1)="=" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" If P<Lang Then If Mid$(Zeile$,P+1,1)=">" Then P=P+1 ElseIf Mid$(Zeile$,P+1,1)="<" Then P=P+1 EndIf EndIf ElseIf Mid$(Zeile$,P,1)=">" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then P=P+1 EndIf EndIf ElseIf Mid$(Zeile$,P,1)="<" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then P=P+1 EndIf EndIf Else ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"z" For P=P To lang If Mid$(Zeile$,P,1)=" " Then Exit ElseIf Mid$(Zeile$,P,1)="(" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=")" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="+" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="-" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="*" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="/" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="," Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="=" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=">" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="<" Then P=P-1 Exit EndIf Next EndIf Next Return ParameterTyp$ End Function |
||
Das große BlitzBasic Community Tutorial
Stackmaschine 2.0 |
Florian |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Assembler
Code: [AUSKLAPPEN] Const cPush = 1 Const cPop = 2 Const cDbl = 3 Const cSwap = 4 Const cMul = 5 Const cDiv = 6 Const cSub = 7 Const cAdd = 8 Const cNeg = 9 Const cIncr =10 Const cDecr =11 Const cAnd =12 Const cNot =13 Const cOr =14 Const cXor =15 Const cCall =16 Const cRet =17 Const cJmp =18 Const cJle =19 Const cAStor =20 Const cALoad =21 Const cStor =22 Const cLoad =23 Const cInt =24 Const MaxVMBefehle=24 Global CodeName$[MaxVMBefehle] Global BefehlLang[MaxVMBefehle] CodeName[cPush] = "push" CodeName[cPop] = "pop" CodeName[cDbl] = "dbl" CodeName[cSwap] = "swap" CodeName[cMul] = "mul" CodeName[cDiv] = "div" CodeName[cSub] = "sub" CodeName[cAdd] = "add" CodeName[cNeg] = "neg" CodeName[cIncr] = "incr" CodeName[cDecr] = "decr" CodeName[cAnd] = "and" CodeName[cNot] = "not" CodeName[cOr] = "or" CodeName[cXor] = "xor" CodeName[cCall] = "call" CodeName[cRet] = "ret" CodeName[cJmp] = "jmp" CodeName[cJle] = "jle" CodeName[cAStor] = "astor" CodeName[cALoad] = "aload" CodeName[cStor] = "stor" CodeName[cLoad] = "load" CodeName[cInt] = "int" BefehlLang[cPush] = 2 BefehlLang[cPop] = 1 BefehlLang[cDbl] = 1 BefehlLang[cSwap] = 1 BefehlLang[cMul] = 1 BefehlLang[cDiv] = 1 BefehlLang[cSub] = 1 BefehlLang[cAdd] = 1 BefehlLang[cNeg] = 1 BefehlLang[cIncr] = 1 BefehlLang[cDecr] = 1 BefehlLang[cAnd] = 1 BefehlLang[cNot] = 1 BefehlLang[cOr] = 1 BefehlLang[cXor] = 1 BefehlLang[cCall] = 2 BefehlLang[cRet] = 1 BefehlLang[cJmp] = 2 BefehlLang[cJle] = 2 BefehlLang[cAStor] = 2 BefehlLang[cALoad] = 2 BefehlLang[cStor] = 1 BefehlLang[cLoad] = 1 BefehlLang[cInt] = 2 Const MaxCode = 4096 Const MaxData = 4096 Const MaxStack = 1024 Const MaxReturnStack= 1024 Type TVM Field CS[MaxCode ] Field DS[MaxData ] Field SS[MaxStack ] Field RS[MaxReturnStack] Field IP Field SP Field RP End Type Global VM.TVM VM=New TVM Asm "VM_Stackmaschine.Asm" Run_VM Function Asm(InputFile$,OutputFile$="") InputNr=ReadFile(InputFile$) If InputNr=0 Then Return False If Len(OutputFile$)>0 Then OutputNr=WriteFile(OutputFile$) If OutputNr=0 Then CloseFile InputNr Return False EndIf EndIf While Not(Eof(InputNr)) Zeile$=ReadLine$(InputNr) ParameterZahl=ArgZahl(Zeile$) If ParameterZahl=>1 Then If ArgTyp$(Zeile$,1)<>"z" Then Syntaxerror=True Exit EndIf For BefehlNr=1 To MaxVMBefehle If Lower$(Arg$(Zeile$,1))=CodeName[BefehlNr] Then If BefehlLang[BefehlNr]<>ParameterZahl Then Syntaxerror=True Exit EndIf If OutputNr<>0 Then WriteLine OutputNr,Str$(BefehlNr) Else VM\CS[BefehlZeiger]=BefehlNr EndIf BefehlZeiger=BefehlZeiger+1 If ParameterZahl=2 Then If ArgTyp$(Zeile$,2)<>"z" Then Syntaxerror=True Exit EndIf If TestZahl(Arg$(Zeile$,2))=False Then Syntaxerror=True Exit EndIf If OutputNr<>0 Then WriteLine OutputNr,Arg$(Zeile$,2) Else VM\CS[BefehlZeiger]=Arg$(Zeile$,2) EndIf BefehlZeiger=BefehlZeiger+1 EndIf EndIf Next EndIf If Syntaxerror=True Then Exit Wend CloseFile InputNr If OutputNr<>0 Then CloseFile OutputNr EndIf If Syntaxerror=True Then Return False Else Return True EndIf End Function Function Arg$(Zeile$,Index) Lang=Len(Zeile$) P=1 Parameter$="" For P=P To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then For P=P+1 To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then Exit EndIf Parameter$=Parameter$+Mid$(Zeile$,P,1) Next ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="(" Then ParameterZahl=ParameterZahl+1 Parameter$="(" ElseIf Mid$(Zeile$,P,1)=")" Then ParameterZahl=ParameterZahl+1 Parameter$=")" ElseIf Mid$(Zeile$,P,1)="+" Then ParameterZahl=ParameterZahl+1 Parameter$="+" ElseIf Mid$(Zeile$,P,1)="-" Then ParameterZahl=ParameterZahl+1 Parameter$="-" ElseIf Mid$(Zeile$,P,1)="*" Then ParameterZahl=ParameterZahl+1 Parameter$="*" ElseIf Mid$(Zeile$,P,1)="/" Then ParameterZahl=ParameterZahl+1 Parameter$="/" ElseIf Mid$(Zeile$,P,1)="," Then ParameterZahl=ParameterZahl+1 Parameter$="," ElseIf Mid$(Zeile$,P,1)=";" Then Return "" ElseIf Mid$(Zeile$,P,1)=" " Then Parameter$="" ElseIf Mid$(Zeile$,P,1)="=" Then ParameterZahl=ParameterZahl+1 If P<Lang Then If Mid$(Zeile$,P+1,1)=">" Then Parameter$="=>" P=P+1 ElseIf Mid$(Zeile$,P+1,1)="<" Then Parameter$="=<" P=P+1 Else Parameter$="=" EndIf Else Parameter$="=" EndIf ElseIf Mid$(Zeile$,P,1)=">" Then ParameterZahl=ParameterZahl+1 If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then Parameter$="=>" P=P+1 Else Parameter$=">" EndIf Else Parameter$=">" EndIf ElseIf Mid$(Zeile$,P,1)="<" Then ParameterZahl=ParameterZahl+1 If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then Parameter$="=<" P=P+1 Else Parameter$="<" EndIf Else Parameter$="<" EndIf Else Parameter$="" ParameterZahl=ParameterZahl+1 For P=P To lang If Mid$(Zeile$,P,1)=" " Then Exit ElseIf Mid$(Zeile$,P,1)="(" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=")" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="+" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="-" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="*" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="/" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="," Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="=" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=">" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="<" Then P=P-1 Exit Else Parameter$=Parameter$+Mid$(Zeile$,P,1) EndIf Next EndIf If Index=ParameterZahl Then Return Parameter$ Next End Function Function ArgZahl(Zeile$) Lang=Len(Zeile$) P=1 For P=P To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then For P=P+1 To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then Exit EndIf Next ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="(" Then ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)=")" Then ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="+" Then ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="-" Then ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="*" Then ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="/" Then ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="," Then ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)=";" Then Return ParameterZahl ElseIf Mid$(Zeile$,P,1)=" " Then ElseIf Mid$(Zeile$,P,1)="=" Then ParameterZahl=ParameterZahl+1 If P<Lang Then If Mid$(Zeile$,P+1,1)=">" Then P=P+1 ElseIf Mid$(Zeile$,P+1,1)="<" Then P=P+1 EndIf EndIf ElseIf Mid$(Zeile$,P,1)=">" Then ParameterZahl=ParameterZahl+1 If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then P=P+1 EndIf EndIf ElseIf Mid$(Zeile$,P,1)="<" Then ParameterZahl=ParameterZahl+1 If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then P=P+1 EndIf EndIf Else ParameterZahl=ParameterZahl+1 For P=P To lang If Mid$(Zeile$,P,1)=" " Then Exit ElseIf Mid$(Zeile$,P,1)="(" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=")" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="+" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="-" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="*" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="/" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="," Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="=" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=">" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="<" Then P=P-1 Exit EndIf Next EndIf Next Return ParameterZahl End Function Function ArgTyp$(Zeile$,Index) Lang=Len(Zeile$) P=1 For P=P To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then For P=P+1 To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then Exit EndIf Next ParameterTyp$="$" ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="(" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" ElseIf Mid$(Zeile$,P,1)=")" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" ElseIf Mid$(Zeile$,P,1)="+" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" ElseIf Mid$(Zeile$,P,1)="-" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" ElseIf Mid$(Zeile$,P,1)="*" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" ElseIf Mid$(Zeile$,P,1)="/" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" ElseIf Mid$(Zeile$,P,1)="," Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" ElseIf Mid$(Zeile$,P,1)=";" Then Return "" ElseIf Mid$(Zeile$,P,1)=" " Then ElseIf Mid$(Zeile$,P,1)="=" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" If P<Lang Then If Mid$(Zeile$,P+1,1)=">" Then P=P+1 ElseIf Mid$(Zeile$,P+1,1)="<" Then P=P+1 EndIf EndIf ElseIf Mid$(Zeile$,P,1)=">" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then P=P+1 EndIf EndIf ElseIf Mid$(Zeile$,P,1)="<" Then ParameterZahl=ParameterZahl+1 ParameterTyp$="#" If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then P=P+1 EndIf EndIf Else ParameterZahl=ParameterZahl+1 ParameterTyp$="z" For P=P To lang If Mid$(Zeile$,P,1)=" " Then Exit ElseIf Mid$(Zeile$,P,1)="(" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=")" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="+" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="-" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="*" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="/" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="," Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="=" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=">" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="<" Then P=P-1 Exit EndIf Next EndIf If Index=ParameterZahl Then Return ParameterTyp$ EndIf Next End Function Function ArgTyps$(Zeile$) Lang=Len(Zeile$) P=1 For P=P To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then For P=P+1 To Lang If Mid$(Zeile$,P,1)=Chr$(34) Then Exit EndIf Next ParameterTyp$=ParameterTyp$+"$" ParameterZahl=ParameterZahl+1 ElseIf Mid$(Zeile$,P,1)="(" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" ElseIf Mid$(Zeile$,P,1)=")" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" ElseIf Mid$(Zeile$,P,1)="+" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" ElseIf Mid$(Zeile$,P,1)="-" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" ElseIf Mid$(Zeile$,P,1)="*" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" ElseIf Mid$(Zeile$,P,1)="/" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" ElseIf Mid$(Zeile$,P,1)="," Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" ElseIf Mid$(Zeile$,P,1)=";" Then Return ParameterTyp$ ElseIf Mid$(Zeile$,P,1)=" " Then ElseIf Mid$(Zeile$,P,1)="=" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" If P<Lang Then If Mid$(Zeile$,P+1,1)=">" Then P=P+1 ElseIf Mid$(Zeile$,P+1,1)="<" Then P=P+1 EndIf EndIf ElseIf Mid$(Zeile$,P,1)=">" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then P=P+1 EndIf EndIf ElseIf Mid$(Zeile$,P,1)="<" Then ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"#" If P<Lang Then If Mid$(Zeile$,P+1,1)="=" Then P=P+1 EndIf EndIf Else ParameterZahl=ParameterZahl+1 ParameterTyp$=ParameterTyp$+"z" For P=P To lang If Mid$(Zeile$,P,1)=" " Then Exit ElseIf Mid$(Zeile$,P,1)="(" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=")" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="+" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="-" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="*" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="/" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="," Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="=" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)=">" Then P=P-1 Exit ElseIf Mid$(Zeile$,P,1)="<" Then P=P-1 Exit EndIf Next EndIf Next Return ParameterTyp$ End Function Function TestZahl(S$) Slen=Len(S$) For P=1 To Slen If Instr("0123456789",Mid$(S$,P,1))=0 Then Return False Next Return True End Function |
||
Das große BlitzBasic Community Tutorial
Stackmaschine 2.0 |
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ach du Hölle! ![]() |
||
MrKeks.net |
![]() |
Justus |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Florian: Ich empfehle dir, zu erwähnen wozu der Krempel überhaupt gut ist, sonst wirst du nicht allzu viel Resonanz bekommen. | ||
![]() |
IronstormErstklassiger Contest-Veranstalter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Justus hat Folgendes geschrieben: @Florian: Ich empfehle dir, zu erwähnen wozu der Krempel überhaupt gut ist, sonst wirst du nicht allzu viel Resonanz bekommen.
Endlich mal einer der mir hilft. Ich warte immer noch auf die Antwort meiner Frage. [grrübel]Warum das nicht Dreamora schon getan hat? Sonst kommt immer eine Antwort zu meinen Fragen[/grübel] |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Auch Dreamora kann nicht alles wissen ![]() Aber das lesen obiger Beiträge sagt mir, dass Stackmaschinen für Codeparsing eingesetzt werden. Der Kern von BP Script (dem Modul für BM) sieht nämlich ähnlich aus. Aber mehr kann ich da leider auch net sagen, habe mich nie eingehend damit auseinander gesetzt ... Von der Theorie her kann ich sagen, dass du Stacks für alles brauchst, was "Scopen" (also IF, Loops etc) kann ... Aber der "Entwickler" sollte glaube ich da mehr Auskunft geben können (ob es eine anfängertaugliche Erklärung gibt, ist dann jedoch etwas anderes) |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Sebastian |
![]() Antworten mit Zitat ![]() |
---|---|---|
Darf ich mal die vorsichtige Vermutung äußer das das ganze so ne Art Stack-Simulator ist, der asm (simuliert) ausführen kann , also ne art VM ?????
So sieht das für mich nämlich aus ..... |
||
Seit 2 Jahren kein BlitzBasic und kein Windows mehr, und stolz darauf ! |
Florian |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Was ist eine Stackmaschine
Die Register könnten nicht direckt durch Befehle verändert werden. Es gibt kein Befehl der ein Register ansprechen kann. Alle Arithmetische Befehle und Logische Befehle verwenden den Stack. Durch die Transportbefehle kann man Wert aufden Stack lagen ober wegnemmen. |
||
Das große BlitzBasic Community Tutorial
Stackmaschine 2.0 |
ke^kx |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Und was ist der Stack?
Jiriki |
||
http://i3u8.blogspot.com
Asus Striker II Intel Core2Quad Q9300 @ 2,5 GHz (aber nur zwei Kerne aktiv aufgrund der Instabilität -.-) Geforce 9800 GTX 2GB RAM |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ein bereich im Arbeitsspeicher, wobei ich acuh finde, das Florian ruhig generell etwas mehr schreiben könnte!^^ | ||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
Florian |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ein Stack ist ein Stapelspeicher.
http://de.wikipedia.org/wiki/Stapelspeicher Man kann auf den Stapel werte drauflegen und herunternehmen. Der Stack einer Stackmaschine funktioniert nach dem Prinzip Last In – First Out. http://de.wikipedia.org/wiki/L..._First_Out Es gibt auch ein First In – First Out Stack. |
||
Das große BlitzBasic Community Tutorial
Stackmaschine 2.0 |
lettorTrepuS |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger. | ||
![]() |
d-bug |
![]() Antworten mit Zitat ![]() |
---|---|---|
~EDITIERT~ Hab mal die Schrottpostings von ST entfernt ! cheers |
||
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo....
höchst beeindruckend. Damit lieseen sich einige nette Experimente machen. Ich nehme mal an du hast das aus Intresse zur Materie gemacht. Ich habe zu Zeiten des C64 das letzte mal jemanden gesehen der sich solche mühe mit einer Stackmaschiene gemacht hat. Auf jeden fall .......... weiter so. |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group