[gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

[gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag von Mijikai »

Ich würde diese Procedure gerne nach fasm übersetzen (für ein Objektmodul).

Code: Alles auswählen

;PB v.5.60 x64
Procedure.i Processed(Bytes.i,BytesProccessed)
  Protected Factor.f = Bytes / 100
  ProcedureReturn BytesProccessed / Factor
EndProcedure
Ziel -> Funktion als reinen fasm Code:

Code: Alles auswählen

proc Processed
...
endp
Zum Testen habe ich versucht das Ganze erst einmal mit Inline-fasm zu schreiben... leider ohne Erfolg. :(

Code: Alles auswählen

Procedure.i ASM_Processed(Bytes.i,BytesProcessed.i)
  !xor rax,rax
  !mov rbx,64h
  !fld qword[rsp+30h]
  !fdiv qword[rbx];<- Error: (read error at address 100) ???
  !fstp qword[rax]
  ProcedureReturn;Bytes / 100
EndProcedure
Was mache ich falsch? :freak:
Zuletzt geändert von Mijikai am 02.09.2017 19:13, insgesamt 2-mal geändert.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [Gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag von Mijikai »

Habs doch noch hinbekommen :D

Code: Alles auswählen

Procedure.i ASM_Processed(Bytes.i,BytesProcessed.i)
  !fild qword[rsp+30h]
  !mov qword[rsp+30h],64h
  !fild qword[rsp+30h]
  !fdivp
  !fild qword[rsp+38h]
  !fld st1
  !fdivp
  !fistp qword[rsp+30h]
  !mov rax,[rsp+30h]
  ProcedureReturn
EndProcedure
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: [Gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag von Bisonte »

Ich könnte es nicht ;)

Wobei ich dachte... cool... wird es wohl schneller sein... aber weit gefehlt.

Die ASM Procedure ist um etliche Ecken langsamer....
hab das mal im schleifendurchlauf mit 100000x Befehl ausführen probiert.

ASM ca 48ms
PB ca. 1ms

Ohne Debugger....

Und nun frag ich mich gerade warum das überhaupt in ASM sein muss ?
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Beitrag von Mijikai »

Bisonte hat geschrieben:Ich könnte es nicht ;)

Wobei ich dachte... cool... wird es wohl schneller sein... aber weit gefehlt.

Die ASM Procedure ist um etliche Ecken langsamer....
hab das mal im schleifendurchlauf mit 100000x Befehl ausführen probiert.

ASM ca 48ms
PB ca. 1ms

Ohne Debugger....

Und nun frag ich mich gerade warum das überhaupt in ASM sein muss ?
So groß ist der Unterschied (lt. Output) eigentlich nicht - 'fdivp' mag etwas langsamer sein.
Ich brauch das Ganze (abgewandelt) für ein Objektmodul das ich in fasm schreibe :)

Output PureBasic Procedure:

Code: Alles auswählen

48 89 4C 24 08        - mov [rsp+08],rcx
48 89 54 24 10        - mov [rsp+10],rdx
41 57                 - push r15
48 31 C0              - xor rax,rax
50                    - push rax
48 83 EC 28           - sub rsp,28 { 40 }
DF 6C 24 40           - fild qword ptr [rsp+40]
D8 35 113F0000        - fdiv dword ptr [IMAGE_BASE+5028] { [100.00] }
D9 5C 24 28           - fstp dword ptr [rsp+28]
4C 8B 7C 24 48        - mov r15,[rsp+48]
4C 89 7C 24 F8        - mov [rsp-08],r15
DF 6C 24 F8           - fild qword ptr [rsp-08]
D8 74 24 28           - fdiv dword ptr [rsp+28]
DF 7C 24 F8           - fistp qword ptr [rsp-08]
48 8B 44 24 F8        - mov rax,[rsp-08]
EB 03                 - jmp IMAGE_BASE+113B
48 31 C0              - xor rax,rax
48 83 C4 30           - add rsp,30 { 48 }
41 5F                 - pop r15
C3                    - ret 
Output PureBasic Inline-fasm Procedure:

Code: Alles auswählen

48 89 4C 24 08        - mov [rsp+08],rcx
48 89 54 24 10        - mov [rsp+10],rdx
48 83 EC 28           - sub rsp,28 { 40 }
DF 6C 24 30           - fild qword ptr [rsp+30]
48 C7 44 24 30 64     - mov [rsp+30],64 { 100 }
DF 6C 24 30           - fild qword ptr [rsp+30]
DE F9                 - fdivp st(1),st(0)
DF 6C 24 38           - fild qword ptr [rsp+38]
D9 C1                 - fld st(1)
DE F9                 - fdivp st(1),st(0)
DF 7C 24 30           - fistp qword ptr [rsp+30]
48 8B 44 24 30        - mov rax,[rsp+30]
EB 03                 - jmp IMAGE_BASE+1130
48 31 C0              - xor rax,rax
48 83 C4 28           - add rsp,28 { 40 }
C3                    - ret 
Der Testcode wäre interessant dann kann ich noch etwas rum experimentieren.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag von ccode_new »

Hi,
@Mijikai

ich kenne mich mit ASM nicht aus, aber deine Procedure (in ASM) liefert bei mir nur Müll.

Außerdem ist der erste Parameter der Procedure bei mir ja hier:

!fild qword[rsp+28h] ;Nehme den ersten Parameter (Bytes)

und der zweite Parameter ja hier:

!fild qword[rsp+30h] ;Nehme den zweiten Parameter (BytesProcessed)

Wie gesagt deine Procedure läuft irgend wie nicht.

Ich kenne mich mit Assembler aber auch nicht aus.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
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: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag von ts-soft »

Die Procedure ist nur für 64-Bit ausgelegt! Die funktioniert mit 32-Bit nicht :)

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
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag von ccode_new »

Hi ts-soft:

Das ist mir schon klar!

Das rsp, rsi, rax, .. Register gibt es ja auch nur unter 64 bit.

Trotzdem liefert die Procedure bei mir einen undefinierten Wert.

Außerdem liegt bei mir der erste Procedure-Parameter immer genau bei [rsp+28h] und der zweite Procedure-Parameter immer genau bei [rsp+30h].

Ob nun word, dword, qword, ... ist dabei egal.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag von Mijikai »

ccode_new hat geschrieben:...
Trotzdem liefert die Procedure bei mir einen undefinierten Wert.

Außerdem liegt bei mir der erste Procedure-Parameter immer genau bei [rsp+28h] und der zweite Procedure-Parameter immer genau bei [rsp+30h].

Ob nun word, dword, qword, ... ist dabei egal.
Welches OS?
Ich habs nur auf Win10 x64 getestet.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag von ccode_new »

Welches OS?

Ok, genau da liegt wahrscheinlich der Hund begraben.

*(Linux)* oh oh!
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: [gelöst] PureBasic nach (Inline -)FASM (Prozentrechnen)

Beitrag von Mijikai »

Das sollte immer gehen:

Code: Alles auswählen

Procedure.i ASM_Processed(Bytes.i,BytesProcessed.i)
  !fild qword[p.v_Bytes]
  !mov qword[p.v_Bytes],64h
  !fild qword[p.v_Bytes]
  !fdivp
  !fild qword[p.v_BytesProcessed]
  !fld st1
  !fdivp
  !fistp qword[p.v_Bytes]
  !mov rax,[p.v_Bytes]
  ProcedureReturn
EndProcedure
Antworten