Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   einzelne bytes in ein 4-byte int umwandeln (https://www.delphipraxis.net/192101-einzelne-bytes-ein-4-byte-int-umwandeln.html)

OlafSt 22. Mär 2017 07:51

AW: einzelne bytes in ein 4-byte int umwandeln
 
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;

p80286 22. Mär 2017 15:01

AW: einzelne bytes in ein 4-byte int umwandeln
 
Zitat:

Zitat von OlafSt (Beitrag 1365011)
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
Delphi-Quellcode:
shl eax,16
Heißen?

Gruß
K-H

JayZ 23. Mär 2017 18:40

AW: einzelne bytes in ein 4-byte int umwandeln
 
Wow an eine inline assembly lösung dachte ich gar nicht. (Zum glück habe ich mir das vor ein paar wochen angefangen anzueignen :D)

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 :)

Zacherl 23. Mär 2017 19:10

AW: einzelne bytes in ein 4-byte int umwandeln
 
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.

JayZ 23. Mär 2017 19:23

AW: einzelne bytes in ein 4-byte int umwandeln
 
stimmt, danke für den hinweis! =)

OlafSt 23. Mär 2017 22:04

AW: einzelne bytes in ein 4-byte int umwandeln
 
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 ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:53 Uhr.
Seite 3 von 3     123   

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