Inline-Assembler, Zugriff auf Pchar

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

Inline-Assembler, Zugriff auf Pchar

Beitrag von Mathias »

Ich wollte ein kleines Hello World mit Inline-assembler probieren.

Code: Alles auswählen

  procedure print2;
  const
    hello: PChar = 'Hello World ! '#10;
  begin
    asm
             Mov     Rax, 1
             Mov     Rdi,1
             Mov     Rsi, hello ; PIC-safe
             Mov     Rdx,14
             Syscall
    end;
  end;    
Nur bekomme ich da einen Fehler:

Code: Alles auswählen

project1.lpr(62,27) Error: Generating PIC, but reference is not PIC-safe
Mache ich aber einen Umweg über einen Pointer, dann läuft es Fehlerfrei.

Code: Alles auswählen

  procedure print1;
  const
    hello: PChar = 'Hello World ! '#10;
  var
    p: Pointer;
  begin
    p := hello;
    asm
             Mov     Rax, 1
             Mov     Rdi,1
             Mov     Rsi, p  ; io.
             Mov     Rdx,14
             Syscall
    end;
  end;
Gibt es da eine Möglichkeit, das man direkt auf den PChar zugreifen kann, ohne Umweg über den Pointer ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: Inline-Assembler, Zugriff auf Pchar

Beitrag von theo »

Das liegt wohl eher an "const" als am PChar.

Code: Alles auswählen

{$asmMode intel}

procedure print2;
var hello: PChar;
begin
  hello:= 'Hello World ! '+LineEnding;
  asm
           Mov     Rax, 1
           Mov     Rdi,1
           Mov     Rsi, hello ;
           Mov     Rdx,14
           Syscall
  end;
end;  

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

Re: Inline-Assembler, Zugriff auf Pchar

Beitrag von Mathias »

Das liegt wohl eher an "const" als am PChar.
Danke, es lag an const, mit var geht es.
Aber auch nur, wen es lokal deklariert ist.

Aber global deklariert, kommt auch ein PIC Fehler.

Code: Alles auswählen

var
  hello2: PChar = 'Hello World ! '#10;

  procedure print2;
  begin
    asm
             Mov     Rax, 1
             Mov     Rdi,1
             Mov     Rsi, hello2; // PIC Fehler
             Mov     Rdx,15
             Syscall
    end;
  end;
Hängt dies indirekt mit folgendem Problem zusammen ?
viewtopic.php?f=10&t=15007
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Inline-Assembler, Zugriff auf Pchar

Beitrag von PascalDragon »

Mathias hat geschrieben:
Mi 2. Aug 2023, 15:34
Nur bekomme ich da einen Fehler:

Code: Alles auswählen

project1.lpr(62,27) Error: Generating PIC, but reference is not PIC-safe
Weil eine lokal deklarierte, typisierte Konstante letztlich eine statische Variable ist, welche nur innerhalb der Funktion zugreifbar ist. Daher gelten für diese die gleichen Regeln wie für globale Variablen und unter Linux musst du eben PIC-kompatiblen Assemblercode schreiben, weil das für diese Plattform notwendig ist.

In der Intel Syntax schaut dies dann wie folgt aus:

Code: Alles auswählen

program tasm;

{$asmmode intel}

procedure print2;
const
  hello: PChar = 'Hello World ! '#10;
begin
  asm
           // load PIC relative address into RAX
           MOV    RAX, [hello WRT ..GOTPCREL]
           // load value at RAX into RSI
           MOV     RSI, QWORD PTR [RAX]
           Mov     Rax, 1
           Mov     Rdi,1
           Mov     Rdx,14
           Syscall
  end;
end;

begin
  print2;
end.
FPC Compiler Entwickler

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Inline-Assembler, Zugriff auf Pchar

Beitrag von PascalDragon »

PascalDragon hat geschrieben:
Mi 2. Aug 2023, 23:20
Mathias hat geschrieben:
Mi 2. Aug 2023, 15:34
Nur bekomme ich da einen Fehler:

Code: Alles auswählen

project1.lpr(62,27) Error: Generating PIC, but reference is not PIC-safe
Weil eine lokal deklarierte, typisierte Konstante letztlich eine statische Variable ist, welche nur innerhalb der Funktion zugreifbar ist. Daher gelten für diese die gleichen Regeln wie für globale Variablen und unter Linux musst du für solche eben PIC-kompatiblen Assemblercode schreiben, weil das für diese Plattform notwendig ist.

In der Intel Syntax schaut dies dann wie folgt aus:

Code: Alles auswählen

program tasm;

{$asmmode intel}

procedure print2;
const
  hello: PChar = 'Hello World ! '#10;
begin
  asm
           // load PIC relative address into RAX
           MOV    RAX, [hello WRT ..GOTPCREL]
           // load value at RAX into RSI
           MOV     RSI, QWORD PTR [RAX]
           Mov     Rax, 1
           Mov     Rdi,1
           Mov     Rdx,14
           Syscall
  end;
end;

begin
  print2;
end.
FPC Compiler Entwickler

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

Re: Inline-Assembler, Zugriff auf Pchar

Beitrag von Mathias »

Danke scheint, scheint bis auf einen Hinweis zu funktionieren.

Code: Alles auswählen

MOV    RAX, [hello WRT ..GOTPCREL]

Code: Alles auswählen

project1.lpr(56,40) Warning: @GOTPCREL is useless and potentially dangerous for local symbols
Auf deutsch:

Code: Alles auswählen

Warnung: @GOTPCREL ist nutzlos und potenziell gefährlich für lokale Symbole
Wieso nutzlos, wen es ohne nicht geht ?

Wo findet man solche Hilfen ?
Wen ich nach "..gotpcrel" google, kommt kein einziger genauer Treffer.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Inline-Assembler, Zugriff auf Pchar

Beitrag von sstvmaster »

LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Inline-Assembler, Zugriff auf Pchar

Beitrag von PascalDragon »

Mathias hat geschrieben:
Do 3. Aug 2023, 14:02
Danke scheint, scheint bis auf einen Hinweis zu funktionieren.

Code: Alles auswählen

MOV    RAX, [hello WRT ..GOTPCREL]

Code: Alles auswählen

project1.lpr(56,40) Warning: @GOTPCREL is useless and potentially dangerous for local symbols
Auf deutsch:

Code: Alles auswählen

Warnung: @GOTPCREL ist nutzlos und potenziell gefährlich für lokale Symbole
Wieso nutzlos, wen es ohne nicht geht ?
Ich bekomme da keine Warnung, nur einen Fehler, wenn ich es mit einer lokalen Variable (statt Konstante) nutze.

Bitte zeige ein vollständiges Beispiel, für den Fall, um zu überprüfen, ob du kleine, unerwartete Unterschiede hast. Und bitte gib auch an, mit welchen Parametern das Beispiel kompiliert wird.
FPC Compiler Entwickler

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

Re: Inline-Assembler, Zugriff auf Pchar

Beitrag von Mathias »

Ich bekomme da keine Warnung, nur einen Fehler, wenn ich es mit einer lokalen Variable (statt Konstante) nutze.

Bitte zeige ein vollständiges Beispiel, für den Fall, um zu überprüfen, ob du kleine, unerwartete Unterschiede hast. Und bitte gib auch an, mit welchen Parametern das Beispiel kompiliert wird.
Ich habe das im Anhang, als neues "einfaches Programm" in Lazarus erzeugt und habe es mit der truc und stable von Lazarus/FPC probiert. In beiden Fällen kommt die Warnung.

Somit sind spezielle Parameter ausgeschlossen.

Auf der Kommandozeile, kommt die Warnung nicht.

Code: Alles auswählen

$ fpc project1.lpr
Free Pascal Compiler version 3.2.2 [2021/07/09] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling project1.lpr
Linking project1
23 lines compiled, 0.1 sec
Dateianhänge
dragon_test.zip
(1.84 KiB) 47-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Inline-Assembler, Zugriff auf Pchar

Beitrag von PascalDragon »

Mathias hat geschrieben:
Sa 5. Aug 2023, 08:35
Ich habe das im Anhang, als neues "einfaches Programm" in Lazarus erzeugt und habe es mit der truc und stable von Lazarus/FPC probiert. In beiden Fällen kommt die Warnung.

Somit sind spezielle Parameter ausgeschlossen.
Zeige mal bitte die Parameter, die Lazarus an FPC übergibt (Projekteinstellungen -> Einstellungen anzeigen), ich kann das weder mit 3.0.4, 3.2.0, 3.2.2 noch 3.3.1 nachvollziehen.
FPC Compiler Entwickler

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

Re: Inline-Assembler, Zugriff auf Pchar

Beitrag von Mathias »

Zeige mal bitte die Parameter, die Lazarus an FPC übergibt (Projekteinstellungen -> Einstellungen anzeigen), ich kann das weder mit 3.0.4, 3.2.0, 3.2.2 noch 3.3.1 nachvollziehen.

Code: Alles auswählen

/home/tux/fpcupdeluxe_trunk/fpc/bin/x86_64-linux/fpc.sh
-MObjFPC
-Scghi
-Cg
-O1
-gw3
-gl
-l
-vewnhibq
-Filib/x86_64-linux
-Fu.
-FUlib/x86_64-linux
-FE.
-oproject1
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten