PureBasic für ARM in arbeit?
Verfasst: 26.06.2011 12:04
LINK Mein Englisch ist nicht so gut aber bedeutet das an einer ARM unterstützen gearbeitet wird?
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...
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...
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