rol und ror

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6194
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 und C/C++ sehe ich rot

Warf
Beiträge: 1910
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: 6194
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 und C/C++ sehe ich rot

Horst_h
Beiträge: 72
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: 1910
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: 1100
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: 72
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: 6194
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 und C/C++ sehe ich rot

marcov
Beiträge: 1100
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: 6194
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 und C/C++ sehe ich rot

marcov
Beiträge: 1100
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