AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein einzelne bytes in ein 4-byte int umwandeln
Thema durchsuchen
Ansicht
Themen-Optionen

einzelne bytes in ein 4-byte int umwandeln

Ein Thema von JayZ · begonnen am 20. Mär 2017 · letzter Beitrag vom 23. Mär 2017
Antwort Antwort
Seite 3 von 3     123   
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#21

AW: einzelne bytes in ein 4-byte int umwandeln

  Alt 22. Mär 2017, 08:51
Wenn es nicht 64-Bit sein muß, dann ginge auch noch sowas:

Delphi-Quellcode:
var
   b1,b2,b3,b4: byte;
begin
   Int:=$ABCDEF42;
   asm
      mov eax,Int
      mov b4,al
      mov b3,ah
      shl eax,2
      mov b2,al
      mov b1,ah
   end;
end;

Geändert von OlafSt (22. Mär 2017 um 08:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#22

AW: einzelne bytes in ein 4-byte int umwandeln

  Alt 22. Mär 2017, 16:01
Wenn es nicht 64-Bit sein muß, dann ginge auch noch sowas:

Delphi-Quellcode:
var
   b1,b2,b3,b4: byte;
begin
   Int:=$ABCDEF42;
   asm
      mov eax,Int
      mov b4,al
      mov b3,ah
      shl eax,2
      mov b2,al
      mov b1,ah
   end;
end;
Müßte es nicht
shl eax,16 Heißen?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
JayZ

Registriert seit: 14. Mai 2016
34 Beiträge
 
#23

AW: einzelne bytes in ein 4-byte int umwandeln

  Alt 23. Mär 2017, 19:40
Wow an eine inline assembly lösung dachte ich gar nicht. (Zum glück habe ich mir das vor ein paar wochen angefangen anzueignen )

So gehts: (shr eax, 16 ; wars )
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
  LInt : integer;

  LB1, LB2, LB3, LB4 : Byte;
begin
  LInt := $DEADBEEF;

  asm
    mov eax, LInt
    mov LB4, al
    mov LB3, ah
    shr eax, 16
    mov LB2, al
    mov LB1, ah
  end;

  ShowMessage(
    IntToHex(LB1, 2) +
    IntToHex(LB2, 2) +
    IntToHex(LB3, 2) +
    IntToHex(LB4, 2)
  );
end;
danke
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#24

AW: einzelne bytes in ein 4-byte int umwandeln

  Alt 23. Mär 2017, 20:10
Von inline Assembly würde ich abraten. Ist zwar tatsächlich schneller, als die vom Delphi Compiler ziemlich hirnlos generierte Übersetzung des Pascal Äquivalents, aber:
  1. es lässt sich deutlich schlechter lesen
  2. es ist verdammt Fehler-anfällig und schlecht zu warten
  3. 64-Bit unterstützt kein inline Assembly

Wenn du es doch umbedingt verwenden willst, dann solltest du dran denken volatile Register zu preserven:
Delphi-Quellcode:
asm
  push eax
  ..
  pop eax
end;
In der Standard Calling-Convention von Delphi wird EAX zwar final als Return-Value verwendet, aber theoretisch steht es dem Compiler frei auch mitten in der Funktion irgendwelche Werte in EAX abzulegen, die vielleicht nach deinem Assembler Block nochmal gebraucht werden.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
JayZ

Registriert seit: 14. Mai 2016
34 Beiträge
 
#25

AW: einzelne bytes in ein 4-byte int umwandeln

  Alt 23. Mär 2017, 20:23
stimmt, danke für den hinweis! =)
  Mit Zitat antworten Zitat
OlafSt

Registriert seit: 2. Mär 2007
Ort: Hamburg
284 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#26

AW: einzelne bytes in ein 4-byte int umwandeln

  Alt 23. Mär 2017, 23:04
Die ersten zwei Punkte kann man in diesem speziellen Fall nun wirklich ignorieren. Ein Kommentar hin und gut ist.

Weiterhin lassen sich manche Dinge in inline-ASM wirklich elegant lösen (wie dieses hier z.B. oder auch Little-Endian nach Big-Endian z.B.) - aber auch das sind nur maximal 4-Zeiler und mehr als das würde auch ich nicht empfehlen in Inline-ASM.

Genug OT
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz