Procedure Parameter Typ

Für allgemeine Fragen zur Programmierung mit PureBasic.
interfind
Beiträge: 12
Registriert: 04.02.2022 10:41

Procedure Parameter Typ

Beitrag von interfind »

Wie kann ich den Parameter Typ (Byte, Word, DWord, Quad)
bei einer Procedure beeinflussen.

Bei der nachfolgenden Procedure werden die übergebenen Werte
immer als Quadwert im Speicher abgelegt.

Für meine Funktion brauche ich die beiden Parameter als DWORD.

Code: Alles auswählen

Procedure Versuch(Parameter1.l, Parameter2.l)

  Debug "Speicheradresse: " + @Parameter1
  Debug Parameter1
  Debug Parameter2
  ShowMemoryViewer(@Parameter1, 16)

EndProcedure

Versuch (11, 22)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Procedure Parameter Typ

Beitrag von STARGÅTE »

interfind hat geschrieben: 20.12.2022 16:21 Wie kann ich den Parameter Typ (Byte, Word, DWord, Quad)
bei einer Procedure beeinflussen.
Genau so wie du das macht, .l gibt dir eine Long.
interfind hat geschrieben: 20.12.2022 16:21 Bei der nachfolgenden Procedure werden die übergebenen Werte
immer als Quadwert im Speicher abgelegt.
Wie kommst du darauf? Weil die Zahl 22 genau 8 Bytes hinter der Zahl 11 steht? Das liegt an deinem Betriebssystem (also x64 oder x86) und das diese immer in Prozessorwortgrößen arbeitet. Die Variablen Parameter1 und Parameter2 liegen auf dem Stack, der immer in 8 Byte bzw. 4 Byteschritten wächst.

Wenn du es selbst probierst, dann wirst du feststellen, dass du keine Quad übergeben kannst, sondern diese abgeschnitten wird.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
interfind
Beiträge: 12
Registriert: 04.02.2022 10:41

Re: Procedure Parameter Typ

Beitrag von interfind »

Ich möchte die Parameter an die Funktion CVTDQ2PD xmm1, mem64 , übergeben.
Also in der Form CVTDQ2PD xmm1, [p.v_Parameter1].
Die beiden Werte sollen als zwei Packed DWORD's in XMM1 (LOW) stehen.
Was aber irgendwie so nicht funktioniert.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Procedure Parameter Typ

Beitrag von STARGÅTE »

interfind hat geschrieben: 20.12.2022 16:51 Ich möchte die Parameter an die Funktion CVTDQ2PD xmm1, mem64 , übergeben.
Also in der Form CVTDQ2PD xmm1, [p.v_Parameter1].
Die beiden Werte sollen als zwei Packed DWORD's in XMM1 (LOW) stehen.
Was aber irgendwie so nicht funktioniert.
Dein Code übergibt ja nur Parameter1, warum soll Parameter2 da mit kommen?
Hier musst du erst mal Parameter1 und Parameter2 einzeln in ein extra register schieben oder einen Zwischenspeicher nutzen:

Code: Alles auswählen

Procedure Versuch(Parameter1.l, Parameter2.l)
	Define Buffer.q : PokeL(@Buffer, Parameter1) : PokeL(@Buffer+4, Parameter2) 
  Debug "Speicheradresse: " + @Buffer
  ShowMemoryViewer(@Buffer, 8)
EndProcedure

Versuch (11, 22)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
chi
Beiträge: 90
Registriert: 17.05.2007 09:30
Wohnort: Linz - Austria

Re: Procedure Parameter Typ

Beitrag von chi »

ohne Poke...

Code: Alles auswählen

CompilerIf Not Defined(LARGE_INTEGER, #PB_Structure)
  Structure LONG_PART
      LowPart.l
      HighPart.l  
  EndStructure  
  Structure LARGE_INTEGER
    StructureUnion
      LongPart.LONG_PART
      QuadPart.q     
    EndStructureUnion
  EndStructure
CompilerEndIf

Procedure Versuch(Parameter1.l, Parameter2.l)
  Define Buffer.LARGE_INTEGER
  Buffer\LongPart\LowPart = Parameter1
  Buffer\LongPart\HighPart = Parameter2
  Debug "Speicheradresse: " + @Buffer
  ShowMemoryViewer(@Buffer, 8)
EndProcedure

Versuch (11, 22)
interfind
Beiträge: 12
Registriert: 04.02.2022 10:41

Re: Procedure Parameter Typ

Beitrag von interfind »

Ich habe folgende Lösung gefunden:

Code: Alles auswählen

Procedure.q Versuch(Parameter1.q, Parameter2.q)

  Debug "Speicheradresse: " + @Parameter1
  Debug Parameter1
  Debug Parameter2

  Parameter1|Parameter2<<$20

  ShowMemoryViewer(@Parameter1, 8)

EndProcedure

a=49
b=6
Versuch (a, b)
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: Procedure Parameter Typ

Beitrag von juergenkulow »

Code: Alles auswählen

; CVTDQ2PD
Structure ZweiLongs
  a.l
  b.l
EndStructure

Define q.ZweiLongs\a=4711 
q\b=4712
! CVTDQ2PD xmm0,[v_q]

; Registerwert mit x64dbg
; xmm0: Double 4712 4711
; xmm0: Hex 40B268000000000040B2670000000000 
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Antworten