rol und ror

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 7367
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

rol und ror

Beitrag von Mathias »

Wen ich ein Bit rotieren will, gibt es in Assembler rol und ror.
In fpc gibt es nur shl und shr.
Für rol und ror habe ich folgenden Code:

Code: Alles auswählen

var
  b2: byte = %00000001;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  b: byte;
begin
  b := b2;
  {$ASMMODE intel}
  asm
           Rol     b, 1
  end;
  b2 := b;
  Memo1.Lines.Add(IntToStr(b2));
end; 
Zur Frage, kann man die auch einfacher lösen ?

Ich habe noch so probiert:

Code: Alles auswählen

  asm
           Rol     b2, 1
  end;
Aber dann motzt der Compiler.

Code: Alles auswählen

unit1.pas(44,24) Error: Generating PIC, but reference is not PIC-safe
Mit Lazarus sehe ich grün
Mit Java, Python und C++ sehe ich rot

Warf
Beiträge: 2334
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: rol und ror

Beitrag von Warf »

Für rol könnte man auch einfach den arithmetischen Ausdruck:

Code: Alles auswählen

b * 2**i mod 255 // rotation links um i bits
verwenden

Mathias
Beiträge: 7367
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: rol und ror

Beitrag von Mathias »

Für rol könnte man auch einfach den arithmetischen Ausdruck:
Arithmetisch kann man es auch so machen;

Code: Alles auswählen

  b := (b shl 1) or (b shr 7);   // rechts
  b := (b shr 1) or (b shl 7);   // links
Bei deiner Formel hast du einen * zuviel.
Wen ich ein Bit rotieren will, gibt es in Assembler rol und ror.
Ich dachte es gäbe eine einfachere und direktere Lösung.
Mit Lazarus sehe ich grün
Mit Java, Python und C++ sehe ich rot

Horst_h
Beiträge: 74
Registriert: Mi 20. Mär 2013, 08:57

Re: rol und ror

Beitrag von Horst_h »

Hallo,

[user]Warf[/user] programm erzielt ja nicht das gewünschte Ergebnis.
Nach 8-mal ROL oder ROR sollte bei einem Byte das ursprüngliche Muster wieder auftauchen, wie eine 8-Bit Laufschrift
mal als Konsolenprogramm für Freepascal:

Code: Alles auswählen

program test;  
  {$MODE objFPC}
  {$ASMMODE intel}
  {$DEFINE RELEASE}
uses
  sysutils;
var
  b2: byte = %00000001;
 
procedure Button1Click;
begin
  asm
    Rol     b2, 1
  end;
end; 
// wie in Delphi werden die Daten je nach Anzahl und Format 
//in EAX,EDX und ECX und dann über den Stack übertragen 
function Roln(n: byte):byte;assembler;
asm
  ROL AL,1;
end;
function RolPascal(n: byte):byte;
var
  Carry : byte;
begin
  Carry := ORD((n AND 128)>0);// Bit 2^7 = 128 gesetzt-> 1 sonst 0 
  result := 2*n +Carry;
end;
 
var
  i: integer;
  n : byte;
 
Begin
  For i := 0 to 10 do Begin
    Button1Click;write(b2:4);  
    end;
  writeln;
  n := 1;
  For i := 0 to 10 do Begin    
    n := Roln(n);write(n:4); 
    end;  
  writeln;     
  n := 1;
  For i := 0 to 10 do Begin    
    n := RolPascal(n);write(n:4); 
    end;  
  writeln;     
end.
ergibt wie gewüscht ein umlaufendes 1-Bit

Code: Alles auswählen

   2   4   8  16  32  64 128   1   2   4   8
   2   4   8  16  32  64 128   1   2   4   8
   2   4   8  16  32  64 128   1   2   4   8
Die Meldung
unit1.pas(44,24) Error: Generating PIC, but reference is not PIC-safe
Heisst nur , dass Du PIC = Positions unabhängigen Code wolltest, was aber als normales Programm nicht relevant ist, bei .dll oder .so hingegen schon.
SIehe http://www.freepascal.org/docs-html/prog/progsu112.html



Gruß Horst

Warf
Beiträge: 2334
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: rol und ror

Beitrag von Warf »

Mathias hat geschrieben:
Bei deiner Formel hast du einen * zuviel.
Das ** ist der Potenzoperator aus der Math unit
[user]Warf[/user] programm erzielt ja nicht das gewünschte Ergebnis.
Nach 8-mal ROL oder ROR sollte bei einem Byte das ursprüngliche Muster wieder auftauchen, wie eine 8-Bit Laufschrift
mal als Konsolenprogramm für Freepascal:
Ich habe das aus dem Kopf geschrieben und nicht getestet, da die Multiplikation allerdings in Integer stattfindet und danach modulo angewendet wird müsste die Rotation zustande kommen (Also 1 rol 8 = 1*2^8 mod 255 = 1*256 mod 255 = 1)

marcov
Beiträge: 1104
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: rol und ror

Beitrag von marcov »

Mathias hat geschrieben:Wen ich ein Bit rotieren will, gibt es in Assembler rol und ror.
In fpc gibt es nur shl und shr.
Wirklich?

Horst_h
Beiträge: 74
Registriert: Mi 20. Mär 2013, 08:57

Re: rol und ror

Beitrag von Horst_h »

Hallo,
1 rol 8 = 2^8 mod 255 = 256 mod 255 = 1
Du hast recht :oops: , ich habe die mod 255 als AND 255 gedacht das ist aber mod 256.

Ab und an muss man wohl doch die neuen Befehle von FPC anschauen...

Mathias
Beiträge: 7367
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: rol und ror

Beitrag von Mathias »

Wirklich?
Sieht brandneu aus. :shock:

Code: Alles auswählen

Documentation generated on: Nov 14 2015
Mit Lazarus sehe ich grün
Mit Java, Python und C++ sehe ich rot

marcov
Beiträge: 1104
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: rol und ror

Beitrag von marcov »

Mathias hat geschrieben:
Wirklich?
Sieht brandneu aus. :shock:

Code: Alles auswählen

Documentation generated on: Nov 14 2015
Das ist weil es heute 3.0 Release tag ist. Aber diese Befehle waren schon in 2.6 glaube ich.

Mathias
Beiträge: 7367
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: rol und ror

Beitrag von Mathias »

Das ist weil es heute 3.0 Release tag ist.
Habe ich etwas verpasst ? :shock:
Mit Lazarus sehe ich grün
Mit Java, Python und C++ sehe ich rot

marcov
Beiträge: 1104
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: rol und ror

Beitrag von marcov »

Mathias hat geschrieben:
Das ist weil es heute 3.0 Release tag ist.
Habe ich etwas verpasst ? :shock:
Schon mal nach http://Freepascal.org gewesen heute?

Heise: http://www.heise.de/developer/meldung/P ... 22879.html

Slashdot: http://slashdot.org/submission/5285369/ ... 64-bit-ios

Antworten