PureBasic für ARM in arbeit?
PureBasic für ARM in arbeit?
LINK Mein Englisch ist nicht so gut aber bedeutet das an einer ARM unterstützen gearbeitet wird?
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: PureBasic für ARM in arbeit?
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.
Re: PureBasic für ARM in arbeit?
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
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)
- 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?
Zur Zeit ist da nichts geplant und es müßte schon eine Menge passieren, bevor sich da was ändert 

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- 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?
Ich würde das begrüßen. Dann könnte ich mit PB wenigstens für einen RaspBerryPI programmieren (Würde sich der Kauf lohnen
).

Re: PureBasic für ARM in arbeit?
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... 

PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
- 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?
So, so, ich denke das hilft hier gar nicht weiter.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...
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

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: PureBasic für ARM in arbeit?
Falls es nicht rüberkam: Ich habe nur einen flachen Witz gerissen! Aber danke für die ausführliche Antwort! 
EDIT: Für den Lacher gibt's ein Danke! *klick*

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)
- 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?
Okay, den hab ich tatsächlich verpeilt 

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: PureBasic für ARM in arbeit?
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.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...
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
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
