Seite 1 von 1

PureBasic für ARM in arbeit?

Verfasst: 26.06.2011 12:04
von Kevin
LINK Mein Englisch ist nicht so gut aber bedeutet das an einer ARM unterstützen gearbeitet wird?

Re: PureBasic für ARM in arbeit?

Verfasst: 26.06.2011 12:10
von DarkDragon
Nein, denn das wurde nicht offiziell bestätigt (Zumindest nicht in dem Thema).

Re: PureBasic für ARM in arbeit?

Verfasst: 08.09.2013 14:26
von IronEagle
Hallo Leute,

weiß jemand, ob es mittlerweile von Fred & Co geplant ist, dass PureBasic irgendwann auch Software für ARM-Prozessoren erstellen kann ?

Viele Grüße :)

Re: PureBasic für ARM in arbeit?

Verfasst: 08.09.2013 14:34
von ts-soft
Zur Zeit ist da nichts geplant und es müßte schon eine Menge passieren, bevor sich da was ändert :wink:

Re: PureBasic für ARM in arbeit?

Verfasst: 10.09.2013 11:10
von Chimorin
Ich würde das begrüßen. Dann könnte ich mit PB wenigstens für einen RaspBerryPI programmieren (Würde sich der Kauf lohnen :D).

Re: PureBasic für ARM in arbeit?

Verfasst: 10.09.2013 16:06
von Regenduft
Von FASM gibt's doch auch eine (inoffizielle) Portierung für ARM. Theoretisch könnte man ja den PureBasic-ASM-Output parsen, konvertieren und erst dann kompilieren... :wink:

Re: PureBasic für ARM in arbeit?

Verfasst: 10.09.2013 17:29
von ts-soft
Regenduft hat geschrieben:Von FASM gibt's doch auch eine (inoffizielle) Portierung für ARM. Theoretisch könnte man ja den PureBasic-ASM-Output parsen, konvertieren und erst dann kompilieren... :wink:
So, so, ich denke das hilft hier gar nicht weiter.
PB lebt von seinen Libs. Die müssen alle neu geschrieben werden, weil das einzige was da gleich bleiben wird, ist die
Syntax. Viele Libs machen auf einem Smartphone oder Tablet aber keinen Sinn, viele existieren nicht und das Ergebnis
wird niemanden zufrieden stellen, da ja auch noch die Libs, geschrieben werden müssen, die so ein modernes Telefon
auszeichnen. Bewegungssensoren, Touch, Telefonie, usw. usw. usw.

Nette Theorie, aber sehr Praxisfern. Damit sich eine PB Version für SmartPhone oder Tablet lohnt, ist eine Menge an
Arbeit reinzustecken. Die Kompatibilität der Sprache wird sehr, sehr eingeschränkt sein (grösser als die Unterschiede
von MacOS, Linux und Windows).

Und solange das PB-TEAM nicht erheblich vergrössert wird, sehe ich da 0-Chance :wink:

Besser eine der vielen Sprachen nutzen, die es sowieso schon für SmartPhone und Tablet gibt.

Gruß
Thomas

Re: PureBasic für ARM in arbeit?

Verfasst: 10.09.2013 17:43
von Regenduft
Falls es nicht rüberkam: Ich habe nur einen flachen Witz gerissen! Aber danke für die ausführliche Antwort! :lol:

EDIT: Für den Lacher gibt's ein Danke! *klick*

Re: PureBasic für ARM in arbeit?

Verfasst: 10.09.2013 18:06
von ts-soft
Okay, den hab ich tatsächlich verpeilt :lol:

Re: PureBasic für ARM in arbeit?

Verfasst: 11.09.2013 08:22
von Thorium
Regenduft hat geschrieben:Von FASM gibt's doch auch eine (inoffizielle) Portierung für ARM. Theoretisch könnte man ja den PureBasic-ASM-Output parsen, konvertieren und erst dann kompilieren... :wink:
Kann man, das nennt sich dann ein statischer Recompiler. Das ist allerdings ne recht komplexe Angelegenheit und der resultierende ARM Code ist dann alles andere als optimal. Das größte Problem ist es aber die ganzen Libs zu rekompilieren und alle API's müssen auf die des Zielsystems gewrappt werden.

Ich hab ne Zeit lang an sowas gearbeitet. Allerdings sollte das fertige .exe'en rekompilieren.

Hier mal ein Snippet wie sowas aussehen kann:

Code: Alles auswählen

;byte and word register handling

;generates code for a low byte register access to start
;returns the ARMv7 register thats used for the actual read
Procedure.i Tr_StartLoByteRegAccess(Reg.i)
  
  Protected RegT.i
  
  RegT = GetFreeRegister()
  
  OutputAsmCode("ubfx " + GetArmRegString(RegT) + ", " + GetArmRegString(Reg) + ", 0, 8")
  
  ProcedureReturn RegT

EndProcedure

;generates code for a high byte register access to start
;returns the ARMv7 register thats used for the actual read
Procedure.i Tr_StartHiByteRegAccess(Reg.i)
  
  Protected RegT.i
  Protected sRegT.s
  
  RegT  = GetFreeRegister()
  sRegT = GetArmRegString(RegT)
  
  OutputAsmCode("ubfx " + GetArmRegString(RegT) + ", " + GetArmRegString(Reg) + ", 7, 8")
  
  ProcedureReturn RegT
  
EndProcedure

;generates code for a word register access to start
;returns the ARMv7 register thats used for the actual read
Procedure.i Tr_StartWordRegAccess(Reg.i)
  
  Protected RegT.i
  Protected sRegT.s
  
  RegT  = GetFreeRegister()
  sRegT = GetArmRegString(RegT)
  
  OutputAsmCode("ubfx " + GetArmRegString(RegT) + ", " + GetArmRegString(Reg) + ", 0, 16")
  
  ProcedureReturn RegT
  
EndProcedure

;generates code for the end of a register read smaller than dword
;if you got a temporary register for the read, pass this as the parameter
Procedure.i Tr_EndRegRead(Reg.i)
  
  FreeRegister(Reg)
  
EndProcedure

;generates code for a low byte register write to end
Procedure Tr_EndLoByteRegWrite(Reg.i, RegT.i)
  
  OutputAsmCode("bfi " + GetArmRegString(Reg) + ", " + GetArmRegString(RegT)) + ", 0, 8")
  
  FreeRegister(RegT)

EndProcedure

;generates code for a high byte register write to end
Procedure Tr_EndHiByteRegWrite(Reg.i, RegT.i)

  OutputAsmCode("bfi " + GetArmRegString(Reg) + ", " + GetArmRegString(RegT)) + ", 8, 8")
  
  FreeRegister(RegT)

EndProcedure

;generates code for a word register write to end
Procedure Tr_EndWordRegWrite(Reg.i, RegT.i)

  OutputAsmCode("bfi " + GetArmRegString(Reg) + ", " + GetArmRegString(RegT)) + ", 0, 16")
  
  FreeRegister(RegT)

EndProcedure

;generates code for updateing the status flags of the APSR register
;if you got a temporary register for the write access, pass this as the parameter
Procedure Tr_UpdateStatusFlagsByteReg(Reg.i)
  
  Protected RegT.i
  
  RegT = GetFreeRegister()
  
  OutputAsmCode("lsls " + GetArmRegString(RegT) + ", " + GetArmRegString(Reg) + ", 24")
  
  FreeRegister(RegT)
  
EndProcedure

;generates code for updateing the status flags of the APSR register
;if you got a temporary register for the write access, pass this as the parameter
Procedure Tr_UpdateStatusFlagsWordReg(Reg.i)
  
  Protected RegT.i
  
  RegT = GetFreeRegister()
  
  OutputAsmCode("lsls " + GetArmRegString(RegT) + ", " + GetArmRegString(Reg) + ", 16")
  
  FreeRegister(RegT)
  
EndProcedure

;----------------------------------------------------------
;memory access handling

;generates code for a read memory access
;returns the register the read is targeting
Procedure.i Tr_ReadMemAccess(Size.i, BaseReg.i, IndexRegSign.i, IndexReg.i, Scale.i, Displacement.i)
  
  Protected RegT.i
  Protected RegT2.i
  Protected sIndexSign.s
  Protected sDisplacementSign.s
  Protected sShift.s
  Protected sInstruction.s
  
  Select Size
    Case 8
      sInstruction = "ldrb "
    Case 16
      sInstruction = "ldrh "
    Case 32
      sInstruction = "ldr "
  EndSelect
  
  If IndexRegSign = 0
    sIndexSign = "+"
  Else
    sIndexSign = "-"
  EndIf
  
  If Displacement > 0
    sDisplacementSign = "+"
  Else
    sDisplacementSign = "-"
  EndIf
  
  Select Scale
    Case 2
      sShift = "1"
    Case 4
      sShift = "2"
    Case 8
      sShift = "3"
  EndSelect
  
  RegT = GetFreeRegister()
  
  ;address in register
  If BaseReg <> 0 And IndexReg = 0 And Scale = 0 And Displacement = 0
    
    OutputAsmCode(sInstruction + GetArmRegString(RegT) + ", [" + GetArmRegString(BaseReg) + "]")
    
  ;address in register + offset in register
  ElseIf BaseReg <> 0 And IndexReg <> 0 And Scale = 0 And Displacement = 0
  
    OutputAsmCode(sInstruction + GetArmRegString(RegT) + ", [" + GetArmRegString(BaseReg) + ", " + sIndexSign + GetArmRegString(IndexReg) + "]")
    
  ;address in register + multiplied offset in register
  ElseIf BaseReg <> 0 And IndexReg <> 0 And Scale <> 0 And Displacement = 0
  
    OutputAsmCode(sInstruction + GetArmRegString(RegT) + ", [" + GetArmRegString(BaseReg) + ", " + sIndexSign + GetArmRegString(IndexReg) + ", " + "lsl " + sShift + "]")
  
  ;static address
  ElseIf BaseReg = 0 And IndexReg = 0 And Scale = 0 And Displacement <> 0
    
    ;check if displacement is bigger than 12 bits, if yes it needs to be put into a register
    If Displacement & $FFFFF000 <> 0
      
      OutputAsmCode("movw " + GetArmRegString(RegT) + ", " + Hex(Displacement & $FFFF) + "h")
      
      ;check if displacement is bigger than 16 bits, if yes construct it in the register
      If Displacement & $FFFF0000 <> 0
        OutputAsmCode("movt " + GetArmRegString(RegT) + ", " + Hex(Displacement >> 16) + "h")
      EndIf
      
      OutputAsmCode(sInstruction + GetArmRegString(RegT) + ", [" + GetArmRegString(RegT) + "]")
      
    Else
      
      OutputAsmCode("mov " + GetArmRegString(RegT) + ", " + Hex(Displacement) + "h")
      OutputAsmCode(sInstruction + GetArmRegString(RegT) + ", [" + GetArmRegString(RegT) + "]")
      
    EndIf

  ;address in register + constant offset
  ElseIf BaseReg <> 0 And IndexReg = 0 And Scale = 0 And Displacement <> 0
  
    ;check if displacement is bigger than 12 bits, if yes it needs to be put into a register
    If Displacement & $FFFFF000 <> 0
      
      OutputAsmCode("movw " + GetArmRegString(RegT) + ", " + Hex(Displacement & $FFFF) + "h")
      
      ;check if displacement is bigger than 16 bits, if yes construct it in the register
      If Displacement & $FFFF0000 <> 0
        OutputAsmCode("movt " + GetArmRegString(RegT) + ", " + Hex(Displacement >> 16) + "h")
      EndIf
      
      OutputAsmCode(sInstruction + GetArmRegString(RegT) + ", [" + GetArmRegString(BaseReg) + ", " + sDisplacementSign + GetArmRegString(RegT) + "]")
      
    Else

      OutputAsmCode(sInstruction + GetArmRegString(RegT) + ", [" + GetArmRegString(BaseReg) + ", " + sDisplacementSign + Hex(Displacement) + "]")
      
    EndIf

  ;address in register + offset in register + constant offset
  ElseIf BaseReg <> 0 And IndexReg <> 0 And Scale = 0 And Displacement <> 0

    ;check if displacement is bigger than 12 bits, if yes it needs to be put into a register
    If Displacement & $FFFFF000 <> 0
      
      OutputAsmCode("movw " + GetArmRegString(RegT) + ", " + Hex(Displacement & $FFFF) + "h")
      
      ;check if displacement is bigger than 16 bits, if yes construct it in the register
      If Displacement & $FFFF0000 <> 0
        OutputAsmCode("movt " + GetArmRegString(RegT) + ", " + Hex(Displacement >> 16) + "h")
      EndIf
      
      If Displacement > 0
        OutputAsmCode("add " + GetArmRegString(RegT) + ", " + GetArmRegString(IndexReg) + ", " + GetArmRegString(RegT))
      Else
        OutputAsmCode("sub " + GetArmRegString(RegT) + ", " + GetArmRegString(IndexReg) + ", " + GetArmRegString(RegT))
      EndIf
      
      OutputAsmCode(sInstruction + GetArmRegString(RegT) + ", [" + GetArmRegString(BaseReg) + ", " + sIndexSign + GetArmRegString(RegT) + "]")

    Else
    
      If Displacement > 0
        OutputAsmCode("add " + GetArmRegString(RegT) + ", " + GetArmRegString(IndexReg) + ", " + Hex(Displacement) + "h")
      Else
        OutputAsmCode("sub " + GetArmRegString(RegT) + ", " + GetArmRegString(IndexReg) + ", " + Hex(Displacement) + "h")
      EndIf
      
      OutputAsmCode(sInstruction + GetArmRegString(RegT) + ", [" + GetArmRegString(BaseReg) + ", " + sIndexSign + GetArmRegString(RegT) + "]")
      
    EndIf

  ;address in register + multiplied offset in register + constant offset  
  ElseIf BaseReg <> 0 And IndexReg <> 0 And Scale <> 0 And Displacement <> 0
  
    ;check if displacement is bigger than 12 bits, if yes it needs to be put into a register
    If Displacement & $FFFFF000 <> 0
      
      OutputAsmCode("movw " + GetArmRegString(RegT) + ", " + Hex(Displacement & $FFFF) + "h")
      
      ;check if displacement is bigger than 16 bits, if yes construct it in the register
      If Displacement & $FFFF0000 <> 0
        OutputAsmCode("movt " + GetArmRegString(RegT) + ", " + Hex(Displacement >> 16) + "h")
      EndIf
      
      If Displacement > 0
        OutputAsmCode("add " + GetArmRegString(RegT) + ", " + GetArmRegString(RegT) + ", " + GetArmRegString(IndexReg) + ", lsl " + sShift)
      Else
        RegT2 = GetFreeRegister()
        OutputAsmCode("lsl " + GetArmRegString(RegT2) + ", " + GetArmRegString(IndexReg) + ", " + sShift)
        OutputAsmCode("sub " + GetArmRegString(RegT) + ", " + GetArmRegString(RegT) + ", " + GetArmRegString(RegT2))
        FreeRegister(RegT2)
      EndIf
    
      OutputAsmCode(sInstruction + GetArmRegString(RegT) + ", [" + GetArmRegString(BaseReg) + ", " + sIndexSign + GetArmRegString(RegT) + "]")
    
    Else
      
      OutputAsmCode("lsl " + GetArmRegString(RegT) + ", " + GetArmRegString(IndexReg) + ", " + sShift)
      If Displacement > 0
        OutputAsmCode("add " + GetArmRegString(RegT) + ", " + GetArmRegString(RegT) + ", " + Hex(Displacement) + "h")
      Else
        OutputAsmCode("sub " + GetArmRegString(RegT) + ", " + GetArmRegString(RegT) + ", " + Hex(Displacement) + "h")
      EndIf
      
      OutputAsmCode(sInstruction + GetArmRegString(RegT) + ", [" + GetArmRegString(BaseReg) + ", " + sIndexSign + GetArmRegString(RegT) + "]")

  EndIf
  
  ProcedureReturn RegT
  
EndProcedure
Das ist nur um einen Lesezugriff auf den Speicher zu übersetzen. Und dort wird Reallocation nicht berücksichtigt.