Entwickler-Ecke
Algorithmen, Optimierung und Assembler - SAR und AND $7F in Delphi
Flamefire - Di 18.03.08 18:48
Titel: SAR und AND $7F in Delphi
Ich habe ein Programm, dessen ASM code ich mir angeguckt habe
ich will eine Struktur daraus in einem anderen Programm anzeigen
gibts es für folgenden code eine andere Delphi entsprechung?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| feld:=Byte(tmp) and $7F; ... asm MOV EAX,tmp SAR EAX,7 MOV feld,EAX end; feld:=feld and $7F; |
Sirke - Di 18.03.08 23:07
Ich würde das ganze so schreiben:
Delphi-Quelltext
1:
| feld := (tmp div 128) and $7F; |
AXMD - Di 18.03.08 23:17
Da Byte ohnehin vorzeichenlos ist, könnte man dann nicht einfach feld := (tmp shr 7) and $7F schreiben? Oder übersehe ich etwas?
AXMD
Martok - Mi 19.03.08 00:36
Ich vermute ja... 10 Sekunden Google: "SAR is similar to SHR, but SAR preserves the most significant bit."
Also entweder so lassen, oder noch ein wenig rum-ODERn...
Wobei ich auch keine wirkliche Ahnung von ASM auf x86 habe...
EDIT: den
gegoogleten Artikel [
http://atrevida.comprenica.com/atrtut16.html] gelesen, jetzt weiß ich, dass
Sirke Recht hatte... Es ist wirklich einfach
DIV, das MSB wird da gehalten, damit das Vorzeichen nicht kaputt geht.
AXMD - Mi 19.03.08 00:43
Fragt sich nur, warum das MSB erhalten werden soll, wenn es in der letzten Zeile durch die $7F-Maske ohnehin auf 0 gesetzt wird :?
AXMD
Sirke - Mi 19.03.08 09:42
Wenn
tmp vom Typ Byte ist und dadurch das 8. Bit das MSB ist, dann kommt noch dazu, dass durch das Verschieben um 7 Bits die ersten 7 Bits "0" werden. Folglich sollte nach dem Maskieren immer $00 herauskommen!
Quelltext
1: 2: 3: 4: 5:
| tmp = 11111111 SAR 7 10000000 // Die 7 "1" fallen ja weg und werden durch "0" ersetzt! AND 01111111 -------- 00000000 |
Oder irre ich mich ... :?
Horst_H - Mi 19.03.08 10:25
Hallo,
falscher Fehler ;-)
Du schiebst links SHL oder SAL sind da gleich.
Hier wird aber nach rechts geschoben
Delphi-Quelltext
1: 2: 3: 4: 5:
| tmp = 10000000 SAR 7 11111111 AND 01111111 -------- 01111111 |
Wenn byte(tmp) >127 dann ist das Ergebnis anschließend 127, sonst 0.
Gruß Horst
Flamefire - Mi 19.03.08 12:28
moment
tmp und feld sind beide Cardinals (also 4Byte)
Das erste ist der erste Teil
Delphi-Quelltext
1:
| feld:=Byte(tmp) and $7F |
Gibts es dafür eine entsprechung? den ich glaube nicht, dass jmd tatsächlich mit nem AND befehl gecodet hat...
Das 2. Ist davon unabhängig
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| asm MOV EAX,tmp SAR EAX,7 MOV feld,EAX end; feld:=feld and $7F; |
hier werden die kompletten 4Byte verwendet
Auch hier glaube ich nicht, dass das jmd so gemacht hat
feld ist am ende ein index in nem 0-basierten array bis (glaube) 65 (+-2)
der erste befehl gibt mir den ersten index, der 2. befehl den 2. index zurück
hoffe das hilft
Sirke - Mi 19.03.08 12:40
Flamefire hat folgendes geschrieben: |
hier werden die kompletten 4Byte verwendet
Auch hier glaube ich nicht, dass das jmd so gemacht hat
feld ist am ende ein index in nem 0-basierten array bis (glaube) 65 (+-2) |
Wenn du gesagt hättest, ein 0-basierten Array bis 127, dann wäre es klar ;-)
So wie ich das sehe stehen in der Variable
tmp in den ersten beiden Bytes die Informationen. In den ersten 7 Bit die ersten Informationen und in den zweiten 7 Bit, also die Bits 8 bis 14, die zweiten!
Folglich kann man das so schreiben:
Delphi-Quelltext
1: 2:
| index1 := tmp and $7F; index2 := (tmp shr 7) and $7F; |
So würde ich das kürzen, bin mir aber nicht sicher ob ich da richtig liege! ;-)
Flamefire - Mi 19.03.08 13:12
hm...aber i-wie kanns das nicht sein
wer würde sowas programmieren?
Horst_H - Mi 19.03.08 13:34
Hallo,
da wollte einer kryptisch sein.
Bei 6 Bit breiten Indizes hätte man ja 5 in 32 Bit unterbringen können , aber so?
Gruß
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!