Seite 1 von 1

Procedure Parameter Typ

Verfasst: 20.12.2022 16:21
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)

Re: Procedure Parameter Typ

Verfasst: 20.12.2022 16:41
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.

Re: Procedure Parameter Typ

Verfasst: 20.12.2022 16:51
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.

Re: Procedure Parameter Typ

Verfasst: 20.12.2022 17:34
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)

Re: Procedure Parameter Typ

Verfasst: 20.12.2022 19:20
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)

Re: Procedure Parameter Typ

Verfasst: 21.12.2022 15:34
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)

Re: Procedure Parameter Typ

Verfasst: 21.12.2022 18:51
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