Stackmaschine & Assembler 0.7 & Basic Compiler 0.7

Übersicht BlitzBasic Codearchiv

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Florian

Betreff: Stackmaschine & Assembler 0.7 & Basic Compiler 0.7

BeitragSo, März 26, 2006 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, März 27, 2006 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Ironstorm

Erstklassiger Contest-Veranstalter

BeitragMo, März 27, 2006 21:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst du mir mal bitte erlären was das sein soll? Hab nämlich kein durchblick^^

MFG
Blitzmaker
 

Florian

BeitragMo, März 27, 2006 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, März 27, 2006 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Man muss schon recht "masochistisch" veranlagt sein, wenn man in Blitz ASM "nachprogrammiert" Wink
Aber nichts desto trotz beeindruckend.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Florian

BeitragSo, Apr 02, 2006 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Apr 02, 2006 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Apr 02, 2006 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach du Hölle! Very Happy
MrKeks.net

Justus

BeitragSo, Apr 02, 2006 22:54
Antworten mit Zitat
Benutzer-Profile anzeigen
@Florian: Ich empfehle dir, zu erwähnen wozu der Krempel überhaupt gut ist, sonst wirst du nicht allzu viel Resonanz bekommen.

Ironstorm

Erstklassiger Contest-Veranstalter

BeitragSo, Apr 02, 2006 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 03, 2006 9:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Auch Dreamora kann nicht alles wissen Smile
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

BeitragMo, Apr 03, 2006 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 03, 2006 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 03, 2006 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 03, 2006 21:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Apr 03, 2006 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Apr 04, 2006 10:47
Antworten mit Zitat
Benutzer-Profile anzeigen
-aus Sicherheitsgründen gelöscht- Diese Information ist mit Ihrer Sicherheitsfreigabe leider nicht erhältlich, Bürger.

d-bug

BeitragDi, Apr 04, 2006 12:28
Antworten mit Zitat
Benutzer-Profile anzeigen
~EDITIERT~

Hab mal die Schrottpostings von ST entfernt !

cheers

tft

BeitragDi, Apr 04, 2006 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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 !!!!!!
 

Florian

BeitragDi, Apr 04, 2006 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Links rund um Thema

Mikroprozessor-Simulation und Befehlssatz

Maschinencode-Erzeugung
Compilerbau

Befehlssatz einer Stackmaschine beschreibung

Die virtuelle Maschine von Java (Befehlsbeschreibung)

JAVA die VM

Compilation auf virtuelle Maschine

Unterprogrammtechnik

Stack beispiel umsetzung in der Programmiersprache C

Stack beispiel in JAVA

Computer Geschichte

CISC und RISC
Rechnerarchitektur

Rechnerarchitektur II

Codeerzeugung

Stacks in verschiedenen Programmiersprachen

Konventionelle Maschinenebene

JavaProzessoren

C und die Speicherverwaltung

Allgemeine Programmierung

Assembler - programmierung
Das große BlitzBasic Community Tutorial
Stackmaschine 2.0

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group