II: eine Virtuelle Maschine (VM) und ein Assembler

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Florian

Betreff: II: eine Virtuelle Maschine (VM) und ein Assembler

BeitragDi, Dez 30, 2008 12:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

hier mit stelle ich eine Virtuelle Maschine (VM) und einen Assembler zu Verfügung. Download

MFG

Florian

Header
VM_Header.bb
Code: [AUSKLAPPEN]

Const Direkt             = 1
Const Immediate          = 2
Const VarInt             = 3
Const CMarke             = 4
Const RegisterEAX        = 5
Const RegisterEBX        = 6
Const RegisterIndirektEAX= 7
Const RegisterIndirektEBX= 8
Const KeinParameter      = 9


Type ConstIntTyp
 Field Name$
 Field Wert
End Type 

Type MarkeTyp
 Field Name$
 Field Adresse
End Type

Type VariableTyp
 Field Name$
 Field Adresse
 Field Wert
End Type

Type AsmBefehlTypTyp
 Field BefehlNr
 Field Befehl$
 Field Parameter1Typ
 Field Parameter2Typ
 Field Lang
End Type

Type AssemblerTyp
 Field Position
 Field InputDatei$
 Field OutputDatei$

 Field Speicher

 Field InputDateiNr
 Field OutputDateiNr

 Field AusgabeArt
End Type

Type AsmBefehlTyp
 Field Parameter1$
 Field Parameter2$
 Field Parameter1Typ
 Field Parameter2Typ
 Field Position
 Field BefehlNr
End Type

Global ConstInt.ConstIntTyp
Global Marke.MarkeTyp
Global Variable.VariableTyp
Global AsmBefehlTyp.AsmBefehlTypTyp
Global Assembler.AssemblerTyp
Global AsmBefehl.AsmBefehlTyp


Global BefehlLang[32]
Global BefehlName$[32]
Global BefehlTyp$[32]

;MOV
Const MOV_EAX_EBX                 =   1                                                                       
Const MOV_EBX_EAX                 =   2 

Const MOV_EAX_Const               =   3                                                                       
Const MOV_EBX_Const               =   4

Const RESTORE_EAX_CONST           =   5
Const RESTORE_EBX_CONST           =   6

Const RESTORE_EAX_EBX             =   7
Const RESTORE_EBX_EAX             =   8
   
Const LOAD_EAX_CONST              =   9
Const LOAD_EBX_CONST              =  10

Const LOAD_EAX_EBX                =  11
Const LOAD_EBX_EAX                =  12
 
;Mathe                                                                     
Const ADD_EAX_EBX                 =  13
Const NEG_EAX                     =  14
Const SUB_EAX_EBX                 =  15
Const DIV_EAX_EBX                 =  16     
Const MUL_EAX_EBX                 =  17

;Setzt Zero=True
;EAX und EBX
                                         
Const LT_EAX_EBX                  =  18 ;* <
Const GT_EAX_EBX                  =  19 ;* >
Const LE_EAX_EBX                  =  20 ;* <=
Const GE_EAX_EBX                  =  21 ;* >=
Const EQ_EAX_EBX                  =  22 ;* <>
Const NE_EAX_EBX                  =  23 ;* =
                                       
;Push                                 
Const Push_EAX                    =  24
Const Push_EBX                    =  25
                                       
;Pop                                   
Const POP_EAX                     =  26
Const POP_EBX                     =  27
                                       
;Function                             
Const Call_Int                    =  28

Const JMP_CONST                   =  29
Const JZ_CONST                    =  30

Const Ret                         =  31
Const Call                        =  32

Type TaskTyp
 Field Speicher
 Field SpeicherByte

 Field EIP       
 Field ZERO

 ;Register
 Field EAX     
 Field EBX

 Field StackZeiger
 
End Type

Global Task.TaskTyp


Die Virtuelle Maschine (VM)
VM_runtime.bb:
Code: [AUSKLAPPEN]
 
Function Run_VM()
 Repeat
  Select PeekByte(Task\Speicher,Task\EIP)
   Case MOV_EAX_EBX
    Task\EAX=Task\EBX   
    Task\EIP=Task\EIP+1                                                                                   
   Case MOV_EBX_EAX
    Task\EBX=Task\EAX               
    Task\EIP=Task\EIP+1
 
   Case MOV_EAX_CONST
    Task\EAX=PeekInt(Task\Speicher,Task\EIP+1)
    Task\EIP=Task\EIP+5
   Case MOV_EBX_CONST
    Task\EBX=PeekInt(Task\Speicher,Task\EIP+1)
    Task\EIP=Task\EIP+5   

   Case RESTORE_EAX_CONST
    PokeInt Task\Speicher,PeekInt(Task\Speicher,Task\EIP+1),Task\EAX   
    Task\EIP=Task\EIP+5           
   Case RESTORE_EBX_CONST         
    PokeInt Task\Speicher,PeekInt(Task\Speicher,Task\EIP+1),Task\EBX     
    Task\EIP=Task\EIP+5 

   Case RESTORE_EAX_EBX
    PokeInt Task\Speicher,Task\EAX,Task\EBX 
    Task\EIP=Task\EIP+1               
   Case RESTORE_EBX_EAX           
    PokeInt Task\Speicher,Task\EBX,Task\EAX 
    Task\EIP=Task\EIP+1

   Case LOAD_EAX_CONST
    Task\EAX=PeekInt(Task\Speicher,PeekInt(Task\Speicher,Task\EIP+1))
    Task\EIP=Task\EIP+5               
   Case LOAD_EBX_CONST
    Task\EBX=PeekInt(Task\Speicher,PeekInt(Task\Speicher,Task\EIP+1))
    Task\EIP=Task\EIP+5

   Case LOAD_EAX_EBX
    Task\EAX=PeekInt(Task\Speicher,Task\EBX)             
    Task\EIP=Task\EIP+1                 
   Case LOAD_EBX_EAX
    Task\EBX=PeekInt(Task\Speicher,Task\EAX)               
    Task\EIP=Task\EIP+1 

   Case ADD_EAX_EBX
    Task\EAX=Task\EAX+Task\EBX
    Task\EIP=Task\EIP+1               
   Case NEG_EAX 
    Task\EAX=-Task\EAX
    Task\EIP=Task\EIP+1                   
   Case SUB_EAX_EBX   
    Task\EAX=Task\EAX-Task\EBX 
    Task\EIP=Task\EIP+1                 
   Case DIV_EAX_EBX 
    Task\EAX=Task\EAX/Task\EBX
    Task\EIP=Task\EIP+1               
   Case MUL_EAX_EBX
    Task\EAX=Task\EAX*Task\EBX                 
    Task\EIP=Task\EIP+1

   Case LT_EAX_EBX ; <
    If Task\EAX<Task\EBX Then
      Task\ZERO=True
     Else
      Task\ZERO=False 
    End If   
    Task\EIP=Task\EIP+1

   Case GT_EAX_EBX ; >
    If Task\EAX>Task\EBX Then
     Task\ZERO=True
    Else
     Task\ZERO=False 
    End If 
    Task\EIP=Task\EIP+1

   Case LE_EAX_EBX ; <=
    If Task\EAX<=Task\EBX Then
     Task\ZERO=True
    Else
     Task\ZERO=False 
    End If 
    Task\EIP=Task\EIP+1

   Case GE_EAX_EBX ; >=
    If Task\EAX>=Task\EBX Then
     Task\ZERO=True
    Else
     Task\ZERO=False 
    End If
    Task\EIP=Task\EIP+1
   Case EQ_EAX_EBX ; <>
    If Task\EAX<>Task\EBX Then
      Task\ZERO=True
    Else
      Task\ZERO=False 
    End If 
    Task\EIP=Task\EIP+1

   Case NE_EAX_EBX ; =
    If Task\EAX=Task\EBX Then
      Task\ZERO=True
    Else
      Task\ZERO=False 
    End If   
    Task\EIP=Task\EIP+1
                   
   Case Push_EAX
    PushInt Task\EAX
    Task\EIP=Task\EIP+1             
   Case Push_EBX                   
    PushInt Task\EBX
    Task\EIP=Task\EIP+1                                         
                                 
   Case POP_EAX
    Task\EAX=PopInt()
    Task\EIP=Task\EIP+1                   
   Case POP_EBX                   
    Task\EAX=PopInt()
    Task\EIP=Task\EIP+1 
           
   Case Call_Int
    Select PeekInt(Task\Speicher,Task\EIP+1)
     Case 1
      Print Task\EAX
     Case 3
      Print GetString$(Task\EAX)
     Case 2
      Print "ENDE"
      Return 
    End Select
    Task\EIP=Task\EIP+5


   Case JMP_CONST
    Task\EIP=PeekInt(Task\Speicher,Task\EIP+1)

   Case JZ_CONST
    If Task\ZERO=True Then
      Task\EIP=PeekInt(Task\Speicher,Task\EIP+1)
     Else
      Task\EIP=Task\EIP+5
    End If 

   Case RET
    Task\EIP=PopInt()                 
   Case Call                   
    PushInt(Task\EIP+5)
    Task\EIP=PeekInt(Task\Speicher,Task\EIP+1)   
  End Select 
 Forever
End Function

Function SetString(P,S$)
 LenS=Len(S$)-1
 For X=0 To LenS
  PokeByte Task\Speicher,P+X,Asc(Mid$(S$,X,1))
 Next
End Function 

Function GetString$(P)
 Zeichen=PeekByte(Task\Speicher,P)
 While Zeichen<>0
  S$=S$+Chr$(Zeichen)
  P=P+1
  Zeichen=PeekByte(Task\Speicher,P)
 Wend
 Return S$ 
End Function 


Function GetInt(IntNr)
 PeekInt(Task\Speicher,IntNr*4+5)
End Function 

Function PushInt(IntWert)
 PokeInt Task\Speicher,Task\StackZeiger,IntWert
 Task\StackZeiger=Task\StackZeiger+4
End Function

Function PopInt()
 Task\StackZeiger=Task\StackZeiger-4
 Return PeekInt(Task\Speicher,Task\StackZeiger)
End Function


Der Assembler
VM_Assembler.bb
Code: [AUSKLAPPEN]
                 
Function Inst_Assembler()
 BefehlLang[ 1]=1
 BefehlName[ 1]="MOV_EAX_EBX"
 BefehlTyp [ 1]="MOV"

 BefehlLang[ 2]=1                                                                             
 BefehlName[ 2]="MOV_EBX_EAX"
 BefehlTyp [ 2]="MOV"

 BefehlLang[ 3]=5           
 BefehlName[ 3]="MOV_EAX_Const" 
 BefehlTyp [ 3]="MOV"

 BefehlLang[ 4]=5                                                                                 
 BefehlName[ 4]="MOV_EBX_Const"
 BefehlTyp [ 4]="MOV"

 BefehlLang[ 5]=5               
 BefehlName[ 5]="RESTORE_EAX_CONST"
 BefehlTyp [ 5]="RESTORE"

 BefehlLang[ 6]=5         
 BefehlName[ 6]="RESTORE_EBX_CONST"
 BefehlTyp [ 6]="RESTORE"

 BefehlLang[ 7]=1         
 BefehlName[ 7]="RESTORE_EAX_EBX"
 BefehlTyp [ 7]="RESTORE"

 BefehlLang[ 8]=1         
 BefehlName[ 8]="RESTORE_EBX_EAX"
 BefehlTyp [ 8]="RESTORE" 
           
 BefehlLang[ 9]=5
 BefehlName[ 9]="LOAD_EAX_CONST"
 BefehlTyp [ 1]="LOAD"

 BefehlLang[10]=5           
 BefehlName[10]="LOAD_EBX_CONST"
 BefehlTyp [10]="LOAD"

 BefehlLang[11]=1           
 BefehlName[11]="LOAD_EAX_EBX"
 BefehlTyp [11]="LOAD"

 BefehlLang[12]=1               
 BefehlName[12]="LOAD_EBX_EAX"
 BefehlTyp [12]="LOAD"

 BefehlLang[13]=1                                                                                   
 BefehlName[13]="ADD_EAX_EBX"
 BefehlTyp [13]="LOAD"

 BefehlLang[14]=1               
 BefehlName[14]="NEG_EAX" 
 BefehlTyp [14]="NEG"
 
 BefehlLang[15]=1                 
 BefehlName[15]="SUB_EAX_EBX" 
 BefehlTyp [15]="SUB"
 
 BefehlLang[16]=1               
 BefehlName[16]="DIV_EAX_EBX"
 BefehlTyp [16]="DIV"
 
 BefehlLang[17]=1               
 BefehlName[17]="MUL_EAX_EBX" 
 BefehlTyp [17]="MUL"
 
 BefehlLang[18]=1                                                       
 BefehlName[18]="LT_EAX_EBX"
 BefehlTyp [18]="LT"
 
 BefehlLang[19]=1             
 BefehlName[19]="GT_EAX_EBX"
 BefehlTyp [19]="GT"
 
 BefehlLang[20]=1                 
 BefehlName[20]="LE_EAX_EBX"
 BefehlTyp [20]="LE"
 
 BefehlLang[21]=1               
 BefehlName[21]="GE_EAX_EBX"
 BefehlTyp [ 1]="GE"
 
 BefehlLang[22]=1                 
 BefehlName[22]="EQ_EAX_EBX"
 BefehlTyp [22]="EQ"
 
 BefehlLang[23]=1               
 BefehlName[23]="NE_EAX_EBX"
 BefehlTyp [23]="NE"
 
 BefehlLang[24]=1                                               
 BefehlName[24]="PUSH_EAX" 
 BefehlTyp [24]="PUSH"
   
 BefehlLang[25]=1               
 BefehlName[25]="PUSH_EBX" 
 BefehlTyp [25]="PUSH"
 
 BefehlLang[26]=1                                                   
 BefehlName[26]="POP_EAX"
 BefehlTyp [26]="POP"
 
 BefehlLang[27]=1                   
 BefehlName[27]="POP_EBX"
 BefehlTyp [27]="POP"
 
 BefehlLang[28]=5                                                 
 BefehlName[28]="CALL_INT"
 BefehlTyp [28]="CALL_INT"
 
 BefehlLang[29]=5                   
 BefehlName[29]="JMP_CONST" 
 BefehlTyp [29]="JMP"
   
 BefehlLang[30]=5               
 BefehlName[30]="JZ_CONST"
 BefehlTyp [30]="JZ"
 
 BefehlLang[31]=1                   
 BefehlName[31]="RET"   
 BefehlTyp [31]="RET"
                     
 BefehlLang[32]=5
 BefehlName[32]="CAll"
 BefehlTyp [32]="CALL"

     
 Inst_AsmBefehl "MOV"    ,MOV_EAX_EBX      ,RegisterEAX  ,RegisterEBX        ,1   
 Inst_AsmBefehl "MOV"    ,MOV_EBX_EAX      ,RegisterEBX  ,RegisterEAX        ,1 

 Inst_AsmBefehl "MOV"    ,MOV_EAX_Const    ,RegisterEAX  ,Direkt             ,5   
 Inst_AsmBefehl "MOV"    ,MOV_EBX_Const    ,RegisterEBX  ,Direkt             ,5
 Inst_AsmBefehl "MOV"    ,MOV_EAX_Const    ,RegisterEAX  ,CMarke             ,5   
 Inst_AsmBefehl "MOV"    ,MOV_EBX_Const    ,RegisterEBX  ,CMarke             ,5

 Inst_AsmBefehl "RESTORE",RESTORE_EAX_CONST,RegisterEAX  ,Immediate          ,5
 Inst_AsmBefehl "RESTORE",RESTORE_EBX_CONST,RegisterEBX  ,Immediate          ,5
 Inst_AsmBefehl "RESTORE",RESTORE_EAX_CONST,RegisterEAX  ,CMarke             ,5
 Inst_AsmBefehl "RESTORE",RESTORE_EBX_CONST,RegisterEBX  ,CMarke             ,5
 Inst_AsmBefehl "RESTORE",RESTORE_EAX_CONST,RegisterEAX  ,VarInt             ,5
 Inst_AsmBefehl "RESTORE",RESTORE_EBX_CONST,RegisterEBX  ,VarInt             ,5

 Inst_AsmBefehl "RESTORE",RESTORE_EAX_EBX  ,RegisterEAX  ,RegisterIndirektEBX,1
 Inst_AsmBefehl "RESTORE",RESTORE_EBX_EAX  ,RegisterEBX  ,RegisterIndirektEAX,1
         
 Inst_AsmBefehl "LOAD"   ,LOAD_EAX_EBX     ,RegisterEAX  ,RegisterIndirektEBX,1               
 Inst_AsmBefehl "LOAD"   ,LOAD_EBX_EAX     ,RegisterEBX  ,RegisterIndirektEAX,1
 
 Inst_AsmBefehl "LOAD"   ,LOAD_EAX_CONST   ,RegisterEAX  ,CMarke             ,5                 
 Inst_AsmBefehl "LOAD"   ,LOAD_EBX_CONST   ,RegisterEBX  ,CMarke             ,5
 Inst_AsmBefehl "LOAD"   ,LOAD_EAX_CONST   ,RegisterEAX  ,VarInt             ,5                 
 Inst_AsmBefehl "LOAD"   ,LOAD_EBX_CONST   ,RegisterEBX  ,VarInt             ,5             
 Inst_AsmBefehl "LOAD"   ,LOAD_EAX_CONST   ,RegisterEAX  ,Immediate          ,5                 
 Inst_AsmBefehl "LOAD"   ,LOAD_EBX_CONST   ,RegisterEBX  ,Immediate          ,5

                                                               
 Inst_AsmBefehl "ADD"    ,ADD_EAX_EBX      ,RegisterEAX  ,RegisterEBX        ,1                 
 Inst_AsmBefehl "NEG"    ,NEG_EAX          ,RegisterEAX  ,KeinParameter      ,1                     
 Inst_AsmBefehl "SUB"    ,SUB_EAX_EBX      ,RegisterEAX  ,RegisterEBX        ,1                 
 Inst_AsmBefehl "DIV"    ,DIV_EAX_EBX      ,RegisterEAX  ,RegisterEBX        ,1                 
 Inst_AsmBefehl "MUL"    ,MUL_EAX_EBX      ,RegisterEAX  ,RegisterEBX        ,1                 
                                         
 Inst_AsmBefehl "LT"     ,LT_EAX_EBX       ,RegisterEAX  ,RegisterEBX        ,1               
 Inst_AsmBefehl "GT"     ,GT_EAX_EBX       ,RegisterEAX  ,RegisterEBX        ,1                 
 Inst_AsmBefehl "LE"     ,LE_EAX_EBX       ,RegisterEAX  ,RegisterEBX        ,1               
 Inst_AsmBefehl "GE"     ,GE_EAX_EBX       ,RegisterEAX  ,RegisterEBX        ,1               
 Inst_AsmBefehl "EQ"     ,EQ_EAX_EBX       ,RegisterEAX  ,RegisterEBX        ,1               
 Inst_AsmBefehl "NE"     ,NE_EAX_EBX       ,RegisterEAX  ,RegisterEBX        ,1               
                                                                       
 Inst_AsmBefehl "PUSH"   ,Push_EAX         ,RegisterEAX  ,KeinParameter      ,1                     
 Inst_AsmBefehl "PUSH"   ,Push_EBX         ,RegisterEBX  ,KeinParameter      ,1                                                                                             
 Inst_AsmBefehl "POP"    ,POP_EAX          ,RegisterEAX  ,KeinParameter      ,1                     
 Inst_AsmBefehl "POP"    ,POP_EBX          ,RegisterEBX  ,KeinParameter      ,1
                                                                                         
 Inst_AsmBefehl "CALLINT",Call_Int         ,Direkt       ,KeinParameter      ,5                     
 Inst_AsmBefehl "JMP"    ,JMP_CONST        ,Immediate    ,KeinParameter      ,5                     
 Inst_AsmBefehl "JZ"     ,JZ_CONST         ,Immediate    ,KeinParameter      ,5
 Inst_AsmBefehl "JMP"    ,JMP_CONST        ,CMarke       ,KeinParameter      ,5                     
 Inst_AsmBefehl "JZ"     ,JZ_CONST         ,CMarke       ,KeinParameter      ,5                       
 Inst_AsmBefehl "RET"    ,Ret              ,KeinParameter,KeinParameter      ,5                           
 Inst_AsmBefehl "CALL"   ,Call             ,Immediate    ,KeinParameter      ,5
 Inst_AsmBefehl "CALL"   ,Call             ,CMarke       ,KeinParameter      ,5
 
End Function

Function Inst_AsmBefehl(BefehlName$,BefehlNr,Parameter1Typ,Parameter2Typ,Befehllang)
 AsmBefehlTyp.AsmBefehlTypTyp = New AsmBefehlTypTyp
 AsmBefehlTyp\Befehl$=BefehlName$
 AsmBefehlTyp\BefehlNr=BefehlNr
 AsmBefehlTyp\Parameter1Typ=Parameter1Typ
 AsmBefehlTyp\Parameter2Typ=Parameter2Typ
 AsmBefehlTyp\lang=Befehllang
End Function


;#ImmediateInt
;#ImmediateByte

;DirektInt

;RegisterEAX
;RegisterEBX

;@registerindirektEAX
;@registerindirektEBX



Function Kompiliere_ASM()



 For AsmBefehl.AsmBefehlTyp=Each AsmBefehlTyp
  ;Print BefehlName[AsmBefehl\BefehlNr]

  ;Print AsmBefehl\Parameter2Typ
  If AsmBefehl\Parameter1Typ=Direkt Then
   PokeByte Task\Speicher,AsmBefehl\Position+1,Int(AsmBefehl\Parameter1$)
  ElseIf AsmBefehl\Parameter1Typ=Immediate Then
   PokeByte Task\Speicher,AsmBefehl\Position+1,Int(AsmBefehl\Parameter1$)
  ElseIf AsmBefehl\Parameter1Typ=CMarke Then
   For Marke=Each MarkeTyp
    If Upper$(Marke\Name$)=Upper$(Mid$(AsmBefehl\Parameter1$,2)) Then
     PokeByte Task\Speicher,AsmBefehl\Position+1,Marke\Adresse 
    End If 
   Next
  ElseIf AsmBefehl\Parameter1Typ=VarInt Then
   For Variable = Each VariableTyp
     If Upper$(AsmBefehl\Parameter1$)=Upper$(Variable\Name$) Then   
      PokeByte Task\Speicher,AsmBefehl\Position+1,Variable\Adresse
     End If
   Next

  ElseIf AsmBefehl\Parameter2Typ=Direkt Then
   PokeByte Task\Speicher,AsmBefehl\Position+1,Int(AsmBefehl\Parameter2$)
  ElseIf AsmBefehl\Parameter2Typ=Immediate Then
   PokeByte Task\Speicher,AsmBefehl\Position+1,Int(AsmBefehl\Parameter2$)
  ElseIf AsmBefehl\Parameter2Typ=CMarke Then
   For Marke=Each MarkeTyp
    If Upper$(Marke\Name$)=Upper$(Mid$(AsmBefehl\Parameter2$,2)) Then
     PokeByte Task\Speicher,AsmBefehl\Position+1,Marke\Adresse 
    End If 
   Next
  ElseIf AsmBefehl\Parameter2Typ=VarInt Then

   For Variable = Each VariableTyp
    If Upper$(AsmBefehl\Parameter2$)=Upper$(Variable\Name$) Then   
     PokeByte Task\Speicher,AsmBefehl\Position+1,Variable\Adresse 
    End If
   Next
  End If     
 Next
End Function




Function AsmZeile(Zeile$)
 Befehl$=Trim$(Upper$(Mid$(Zeile$,1,Instr(Zeile$+" "," ")-1)))

 Local ParameterS$[8]
 Parameter$=Mid$(Zeile$,Instr(Zeile$+" "," ")+1)
 ParameterLang=Len(Parameter$)
 For Pos=1 To ParameterLang
  Select Mid$(Parameter$,Pos,1)
   Case " "
    If Len(ParameterS[ParameterNr])>0 Then
     ParameterNr=ParameterNr+1
    End If
   Case ";"
    Exit 
   Default
    If ParameterNr=8 Then
     Return ;Error
    End If
    ParameterS[ParameterNr]=ParameterS[ParameterNr]+Mid$(Parameter$,Pos,1)
  End Select
 Next

 Parameter1$=ParameterS[0]
 Parameter2$=ParameterS[1]
 Parameter3$=ParameterS[2]




 If Len(ParameterS[ParameterNr])=0 Then
  ParameterNr=ParameterNr-1
 End If     
 
 If     Befehl$="DB"            Then

  Zeilelang=Len(Zeile$)
  Start=Instr(Zeile$+" "," ")



  If Start=0 Then
   Return
  End If



  For POS=Start To Zeilelang

       
 
   Select Mid$(Zeile$,Pos,1)
    Case " "
     If ZeichenAn=True Then
       PokeByte Task\Speicher,Assembler\Position,Asc(Mid$(Zeile$,Pos))
       Assembler\Position=Assembler\Position+1
       ZahlenStrByte$=""
      Else
       If Len(ZahlenStrByte$)>0 Then
        ByteZahl=Int(ZahlenStrByte$)
        If ByteZahl>255 Then
         Return ;ERROR
        End If
        PokeByte Task\Speicher,Assembler\Position,ByteZahl
        Assembler\Position=Assembler\Position+1     
        ZahlenStrByte$=""
       End If
     End If 
    Case ","
     If ZeichenAn=True Then
       PokeByte Task\Speicher,Assembler\Position,Asc(Mid$(Zeile$,Pos))
       Assembler\Position=Assembler\Position+1
       ZahlenStrByte$=""
      Else
       If Len(ZahlenStrByte$)>0 Then
        ByteZahl=Int(ZahlenStrByte$)
        If ByteZahl>255 Then
         Return ;ERROR
        End If
        PokeByte Task\Speicher,Assembler\Position,ByteZahl
        Assembler\Position=Assembler\Position+1     
        ZahlenStrByte$=""
       End If 
     End If
    Case "'"
     If ZeichenAn=True Then
      PokeByte Task\Speicher,Assembler\Position,ZahlenStrByte$
      Assembler\Position=Assembler\Position+1     
      ZahlenStrByte$=""
     End If
     ZeichenAn=True-ZeichenAn
    Case "0","1","2","3","4","5","6","7","8","9"
     If ZeichenAn=True Then
       PokeByte Task\Speicher,Assembler\Position,Asc(Mid$(Zeile$,Pos))
       Assembler\Position=Assembler\Position+1
      Else
       zahlenstrByte$=zahlenstrByte$+Mid$(Zeile$,Pos,1)
     End If
    Case ";"
     If ZeichenAn=False Then
     ;ERROR
     Return
     End If
     PokeByte Task\Speicher,Assembler\Position,Asc(Mid$(Zeile$,Pos))
     Assembler\Position=Assembler\Position+1
     ZahlenStrByte$=""
    Default
     If ZeichenAn=True Then

       PokeByte Task\Speicher,Assembler\Position,Asc(Mid$(Zeile$,Pos))
       Assembler\Position=Assembler\Position+1
       ZahlenStrByte$=""

      Else
       Return ;ERROR
     End If 
   End Select
  Next
 
  If ZahlenStrByte$<>"" Then
   PokeByte Task\Speicher,Assembler\Position,Int(ZahlenStrByte$)
   Assembler\Position=Assembler\Position+1     
   ZahlenStrByte$=""
  End If 


 
 ElseIf Befehl$="DW"            Then
  Zeilelang=Len(Zeile$)
  Pos=Instr(Zeile$+" "," ")-1

  If Start=0 Then
   Return
  End If

  For POS=Start To Zeilelang
   Select Mid$(Zeile$,Pos)
    Case ";"
     If (ZahlenStrDB$)>0 Then
       Zahlshort=Int(ZahlenStrDB$)
       PokeShort Task\Speicher,Assembler\Position,Zahlshort
       ZahlenStrDB$=""
      Else
     End If
     Return 
    Case " "
     If (ZahlenStrDB$)>0 Then
       Zahlshort=Int(ZahlenStrDB$)
       PokeShort Task\Speicher,Assembler\Position,Zahlshort
       ZahlenStrDB$=""
      Else
     End If
    Case ","
     If (ZahlenStrDB$)>0 Then
       Zahlshort=Int(ZahlenStrDB$)
       PokeShort Task\Speicher,Assembler\Position,Zahlshort
       ZahlenStrDB$=""
      Else
     End If 
    Case "0","1","2","3","4","5","6","7","8","9"
     ZahlenStrDB$=ZahlenstrDB$+Mid$(Zeile$,Pos)
    Default
   End Select
  Next

  If (ZahlenStrDB$)>0 Then
   Zahlshort=Int(ZahlenStrDB$)
   PokeShort Task\Speicher,Assembler\Position,Zahlshort
   ZahlenStrDB$=""
  End If 

 ElseIf ISMarke(Befehl$)=True Then
  Marke=New MarkeTyp
  Marke\Name$= MarkeName$(Befehl$)
  Marke\Adresse=Assembler\Position
 ElseIf Befehl$="VAR"           Then

  If ISVariable(Upper$(Parameter1$))=False Then
   Return ;ERROR
  End If

  For Variable=Each VariableTyp
   If Upper$(Variable\Name$)=Upper$(Parameter1$) Then
    Return ;ERROR
   End If
  Next



  If Len(Parameter2$)=0 Or Parameter2$="?" Then
   Variable=New VariableTyp
   Variable\Name$=Upper$(Parameter1$)
   Variable\Adresse=Assembler\Position
   Variable\Wert=0
   Return
  End If


  If Parameter2$<>"=" Then
   Return ;ERROR
  End If   
 

  Variable=New VariableTyp
  Variable\Name$=Upper$(Parameter1$)
  Variable\Adresse=Assembler\Position
  Variable\Wert=Int(Parameter3$)
  PokeInt Task\Speicher,Assembler\Position,Variable\Wert
  Assembler\Position=Assembler\Position+4

  Return
 

 ElseIf Befehl$=";"             Then
  Return
 ElseIf Befehl$="INCLUDE$"      Then
 ElseIf ISMarke(Befehl$)=True Then
  Marke=New MarkeTyp
  Marke\Name$= MarkeName$(Befehl$)
  Marke\Adresse=Assembler\Position
  Return
 Else
  ASM Befehl$,Upper$(Parameter1$),Upper$(Parameter2$)
 End If   
End Function


Function ASM(Befehl$,Parameter1$="",Parameter2$="")
 Befehl$=Upper(Befehl$)



 If     Parameter1$="@EAX"    Then
  Parameter1Typ=RegisterIndirektEAX

 ElseIf Parameter1$="@EBX"    Then
  Parameter1Typ=RegisterIndirektEBX

 ElseIf Parameter1$="EAX"     Then
  Parameter1Typ=RegisterEAX

 ElseIf Parameter1$="EBX"     Then
  Parameter1Typ=RegisterEBX

 ElseIf Parameter1$=""        Then
  Parameter1Typ=KeinParameter

 ElseIf ISInt(Parameter1$)  Then
  Parameter1Typ=Direkt

 ElseIf ISMarke(Parameter1$)Then
  Parameter1Typ=CMarke
 ElseIf ISVariable(Upper$(Parameter1$))=True Then
  Parameter1Typ=VarInt
 ElseIf Parameter1$=";"       Then
  Parameter1$="" 
 End If 


 If     Parameter2$="@EAX"    Then
  Parameter2Typ=RegisterIndirektEAX

 ElseIf Parameter2$="@EBX"    Then
  Parameter2Typ=RegisterIndirektEBX

 ElseIf Parameter2$="EAX"     Then
  Parameter2Typ=RegisterEAX

 ElseIf Parameter2$="EBX"     Then
  Parameter2Typ=RegisterEBX

 ElseIf Parameter2$=""        Then
  Parameter2Typ=KeinParameter

 ElseIf ISInt(Parameter2$)  Then
  Parameter2Typ=Direkt

 ElseIf ISMarke(Parameter2$)Then
  Parameter2Typ=CMarke
 ElseIf ISVariable(Upper$(Parameter2$))=True Then
  Parameter2Typ=VarInt
 ElseIf Parameter2$=";"       Then
  Parameter2$=""
 End If
 

 For AsmBefehlTyp=Each AsmBefehlTypTyp

  If Upper$(Befehl$)=Upper$(AsmBefehlTyp\Befehl$) Then

   If Parameter1Typ=AsmBefehlTyp\Parameter1Typ Then
    If Parameter2Typ=AsmBefehlTyp\Parameter2Typ Then
      AsmBefehl=New AsmBefehlTyp
      AsmBefehl\Parameter1$=Parameter1$
      AsmBefehl\Parameter2$=Parameter2$
      AsmBefehl\Parameter1Typ=Parameter1Typ
      AsmBefehl\Parameter2Typ=Parameter2Typ
      AsmBefehl\Position=Assembler\Position
      AsmBefehl\BefehlNr=AsmBefehlTyp\BefehlNr
      PokeByte Task\Speicher,Assembler\Position,AsmBefehl\BefehlNr   
      Assembler\Position=Assembler\Position+AsmBefehlTyp\lang
      Return
    End If
   End If
  End If
 Next   
End Function

Function ISVariable(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
    ElseIf Ascii=220 Then ;ü   
    ElseIf Ascii=196 Then ;ä
    ElseIf Ascii=214 Then ;ö
    Else
     Return False
   End If
  Next
  Return True
 End If
End Function

Function MarkeName$(Marke$)
 Return Mid$(Marke$,2)
End Function

Function ISMarke(S$)
 Slen=Len(S)
 If Mid$(S$,1,1)<>":" Then Return False
 If Slen>0 Then
  For P=2 To Slen
   ASCII=Asc(Mid$(S$,P,1))
   If Ascii>64 And Ascii<92 Then
    ElseIf Ascii=220 Then ;ü   
    ElseIf Ascii=196 Then ;ä
    ElseIf Ascii=214 Then ;ö
    Else
     Return False
   End If
  Next
  Return True
 End If
End Function

Function ISInt(S$)
 Slen=Len(S$)
 For P=1 To Slen
  If Instr("0123456789",Mid$(S$,P,1))=0 Then Return False
 Next
 If Slen=0 Then
  Return False
 End If 
 Return True
End Function

Function Exist_Datei(Datei$)
 If FileType(datei)=1 Then
   Return True
  Else
   Return False
 End If 
End Function


String Funktionen
VM_String.bb
Code: [AUSKLAPPEN]

Function Upper$(S$)
 Slen=Len(S)
 If Slen>0 Then
  For P=1 To Slen
   ASCII=Asc(Mid$(S$,P,1))
   If Ascii>96 And Ascii<123 Then
     Ascii=Ascii-32
    ElseIf Ascii=252 Then ;ü
     Ascii=220     
    ElseIf Ascii=228 Then ;ä
     Ascii=196 
    ElseIf Ascii=246 Then ;ö
     Ascii=214
   End If
   R$=R$+Chr$(ASCII)
  Next
  Return R$
 End If
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



Beispiel:
VM_Beispiel.bb
Code: [AUSKLAPPEN]

Task=New TaskTyp

Inst_Assembler
Assembler=New AssemblerTyp
Assembler\Position=0
Task\Speicher=CreateBank(200)

asmZeile "Jmp :C"
asmzeile "var t = 5"
AsmZeile "MOV EAX 1000"
asmzeile ":Z"
asmzeile "DB 'Das ist ein Test.'"
asmzeile ":C"
AsmZeile "MOV EAX :Z"
AsmZeile "CALLINT 3"
AsmZeile "LOAD EAX T"
Asmzeile "Mov EBX 1"
Asmzeile "EQ EAX EBX"
AsmZeile "SUB EAX EBX"
AsmZeile "RESTORE EAX t"
Asmzeile "JZ :C"
Asmzeile "CALLINT 2"

DateiNr=WriteFile("Comp.txt")


Kompiliere_ASM
;WaitKey
Task=First TaskTyp
WriteBytes Task\Speicher,DateiNr,0,199

Run_VM

WaitKey

[/url]

Plasma

Betreff: cool

BeitragSo, Jan 04, 2009 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
thx Smile

Silver_Knee

BeitragSo, Jan 04, 2009 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn ich das richtig versanden habe kann man damit exen machen? oder nur assabler-code von deiner VM ausführen lassen?
 

Florian

BeitragSo, Jan 04, 2009 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
@Silver_Knee

Bisher kann man nur den P-CODE in der VM ausführen. Der P-Code lässt sich in Maschinencode umwandeln. Ich setze zurzeit das Programm in PowerBASIC um. Ich möchte das PowerBASIC-Programm so erweitern man Maschinencode erhält.

So habe ich den Ablauf vorgestellt:

Code: [AUSKLAPPEN]

+---------------------------------------+
| Quelltext Programmiersprache          |
+---------------------------------------+
                   |
                   |   (Compiler)
                   V

+---------------------------------------+
| VM Assembler Quelltext                |
+---------------------------------------+
                   |
                   |   (VM Assembler)
                   V

+--------------------------------------+
| P-Code                               |
+--------------------------------------+
        |                    | 
        |                    |
        V                    V 

+-----------------+  +-----------------+
|                 |  | Umsetzung von   |
| VM (ausführen)  |  | P-Code zu       |
|                 |  | Assembler       |
|                 |  | Quelltext       |
+-----------------+  +-----------------+   
                              |
                              | 
                              V

                     +-----------------+                               
                     | NASM            |
                     +-----------------+ 


Florian

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group