PureBasic für ARM in arbeit?

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Kevin
Beiträge: 236
Registriert: 11.06.2007 12:55

PureBasic für ARM in arbeit?

Beitrag von Kevin »

LINK Mein Englisch ist nicht so gut aber bedeutet das an einer ARM unterstützen gearbeitet wird?
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: PureBasic für ARM in arbeit?

Beitrag von DarkDragon »

Nein, denn das wurde nicht offiziell bestätigt (Zumindest nicht in dem Thema).
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
IronEagle
Beiträge: 64
Registriert: 13.10.2012 14:41
Wohnort: Berlin

Re: PureBasic für ARM in arbeit?

Beitrag 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 :)
PureBasic 5.71 | Windows 10 Home (x64)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: PureBasic für ARM in arbeit?

Beitrag von ts-soft »

Zur Zeit ist da nichts geplant und es müßte schon eine Menge passieren, bevor sich da was ändert :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: PureBasic für ARM in arbeit?

Beitrag 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).
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: PureBasic für ARM in arbeit?

Beitrag 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:
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: PureBasic für ARM in arbeit?

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: PureBasic für ARM in arbeit?

Beitrag 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*
Zuletzt geändert von Regenduft am 10.09.2013 18:10, insgesamt 1-mal geändert.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: PureBasic für ARM in arbeit?

Beitrag von ts-soft »

Okay, den hab ich tatsächlich verpeilt :lol:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: PureBasic für ARM in arbeit?

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Antworten