wollte ich nur mal kurz nachfragen ob Folgendes sowohl für 32bit/64bit als auch Win/Linux zuverlässig funktioniert:
Code: Alles auswählen
EnableExplicit
EnableASM
Procedure.w EndianW(val.w)
!MOV ax,word[p.v_val]
!XCHG al, ah
ProcedureReturn
EndProcedure
Procedure.l Endian(val.l)
!MOV Eax,dword[p.v_val]
!BSWAP Eax
ProcedureReturn
EndProcedure
CompilerIf #PB_Compiler_Processor=#PB_Processor_x64
Procedure.q EndianQ(val.q)
!MOV rax,qword[p.v_val]
!BSWAP rax
ProcedureReturn
EndProcedure
CompilerElse
Procedure.q EndianQ(val.q)
!MOV Eax,dword[p.v_val]
!MOV Edx,dword[p.v_val+4]
!BSWAP Eax
!BSWAP Edx
!MOV dword[p.v_val+4],Eax
!MOV dword[p.v_val],Edx
ProcedureReturn val
EndProcedure
CompilerEndIf
Dazu hätte ich noch zwei Fragen:
Woher weiß der Compiler welches Register(?)/Variable er bei ProcedureReturn zurückgeben soll.
Warum werden immer volle 8 Byte zurückgeben, so dass ich mit einer passenden Variablengröße "zurechtstutzen" muss? Sollte die Deklaration der Prozeduren nicht sicherstellen dass sowas nicht passiert? Oder wird das beim nutzen von ASM bewusst nicht gemacht um Performance zu sparen?
Code: Alles auswählen
Define word.w, long.l, quad.q
;Geht nicht:
Debug EndianW(EndianW(-1233))
Debug Endian (Endian (-1234))
quad = EndianW(EndianW(-1233))
Debug quad
quad = Endian (Endian (-1234))
Debug quad
;Geht:
Debug EndianQ(EndianQ(-1235))
word = EndianW(EndianW(-1233))
Debug word
long = Endian (Endian (-1234))
Debug long
quad = EndianQ(EndianQ(-1235))
Debug quad