Mit ASM auf Longwert in Bytearray zugreifen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Mit ASM auf Longwert in Bytearray zugreifen?

Beitrag von Franky »

Hi Leute

Ich habe eine kleine Frage

Ich habe ein Array, das aus einer Structure besteht, die 4 Bytes enthält (4Byte=1Long :wink: ).
Nun möchte ich in diesem Array die jeweiligen bytes um -128 verändern (werden dann unsigned; rein theoretisch).

Jetzt ist aber mmein Problem folgendes:
Wie kann ich XOR die passende stelle übergeben?

Also, ich hab´s mal aus ratlosigkeit so probiert, das funzt nicht(ich glaub sogar zu wissen, warum)

Code: Alles auswählen

XOR picture(maxwerthoch-hoch,lang),-2139062144                                          


Naja, auf diese Art geht es

Code: Alles auswählen

                                            wert.l=PeekL(picture(maxwerthoch-hoch,lang))
XOR wert,-2139062144                                            PokeL(picture(maxwerthoch-hoch,lang),wert)
aber das ist ja eigentlich geschwindigkeitsmäßig schwachsinn, denn:

Ich will ja
-picture(maxwerthoch-hoch,lang) verändern

Das würde aber:
-picture(maxwerthoch-hoch,lang) in wert kopieren
-wert verändern
-wert in picture(maxwerthoch-hoch,lang) kopieren

2 Operationen zu viel
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Wenn man ein Array von Strukturen hat, dann befindet sich an der jeweiligen Stelle im Array, die man mit @Arrayname(offset) erreichen kann, nicht bereits der Wert, sondern lediglich ein Pointer auf die Struktur.
Möglichkeit 1 ist also, hier ebenfalls diesen Pointer zu nutzen:

Code: Alles auswählen

Structure FourBytes
  b1.b
  b2.b
  b3.b
  b4.b
EndStructure

Dim A.FourBytes(20)

Debug "Vorher"
For i=0 To 19 Step 4
  A(i)\b1 = i-10
  A(i)\b2 = i-9
  A(i)\b3 = i-8
  A(i)\b4 = i-7
  Debug A(i)\b1
  Debug A(i)\b2
  Debug A(i)\b3
  Debug A(i)\b4
Next

;/
For i=0 To 19
  *l.LONG = @A(i)             ; setze Pointer auf aktuelle Structure
  *l\l = *l\l ! $80808080     ; XORe, um die 4 Bytes je mit -128 zu verrechnen
Next
;/

Debug "Nachher"
For i=0 To 19 Step 4
  Debug A(i)\b1
  Debug A(i)\b2
  Debug A(i)\b3
  Debug A(i)\b4
Next
Als Alternative könntest Du überlegen, nicht die 4 Bytes in eine Struktur zu packen, sondern ein ganz normales Long-Array zu nutzen. Dann könnte die Hauptschleife direkt so aussehen:
Bei Long-Array A.l(19):

Code: Alles auswählen

For i=0 To 19
  A(i) = A(i) ! $80808080     ; XORe, um die 4 Bytes je mit -128 zu verrechnen
Next
Die 2te Möglichkeit dürfte also noch einen kleinen Tacken schneller sein (vielleicht aber auch nicht?), außerdem brauchst Du ggf. ein Struktur-Array ?
!UD2
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

So, hab´s jetzt mit Hilfe von El_Choni gelöst

Code: Alles auswählen

                              maximum=(maxwertlang+1)*(maxwerthoch+1)-1
                              *wert.LONG=picture(0,0)
                              For lang=0 To maximum 
                                             XOR *wert\l,-2139062144
                                            *wert=*wert+4
                              Next 
Wenn noch wer ne Möglichkeit kennt, etwas zeit zu Sparen, immer her damit :D
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Antworten