[Delphi] Odpowiednik funkcji shld z asma.

0

Witam.

Nie wiem czy temat na pewno do Newbie, ale jak kiedyś wspominałem jestem "noga" z matematyki, a także slabo orientuje się w
operacjach na bitach. Dlatego czy ktoś może mi podpowiedzieć jak powinien wyglądac odpowiednik funkcji shld z asma w Delphi?
Próblowałem wstawki w asmie, ale mam zły wynik. Dla przykłądu w asmie mamy instrukcje SHLD EAX,EBX,8, gdzie rejestry wynoszą
(hex) EAX = 2004C0DE, a EBX 6F000000 i teraz funkcja ma zwrócić mi 04C0DE6F. Z góty dzięki za pomoc, bo nie ogarniam shl shr itp

2

No to tak (nazwijmy te rejestry a, b, liczbę bitów - n)

  1. Potrzebujemy odrzucić n najstarszych bitów liczby a - mamy do tego instrukcję... shl: a shl n.
  2. Potrzebujemy też n najstarszych bitów liczby b - można więc przesunąć tę liczbę o 32-n (zamień 32 na coś innego odpowiedniego, jeśli liczba nie jest 32-bitowa) bitów w prawo: b shr (32-n).
  3. Można teraz zsumować bitowo (instrukcja or) dwa otrzymane wyniki. Otrzymamy: (a shl n) or (b shr (32-n)) (chyba?)
0

Na pewno nie optymalnie, ale działa

 
var
  p:Int64;
begin
  p:=$2004C0DE6F000000;
  p:=p shl 8;
  p:=p shr 32;
  edit1.text:=inttostr(p);
end;
0

@mnbvcX: wielkie dzięki, o to chodziło. Funkcja zwraca to co powinna. A wygląda ona tak:

function SHLD(A, B, N : DWord) : DWord;
begin
  Result := (A shl N) or (B shr (32 - N));
end;

Czyli dokładnie tak, jak napisaleś. I mało osób tutaj to robi, ale ja daje Tobie +1 do zajebistości ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1