C -Register "Variable" in Purebasic ?

Anfängerfragen zum Programmieren mit PureBasic.
Franky_FR
Beiträge: 53
Registriert: 08.05.2019 10:06

C -Register "Variable" in Purebasic ?

Beitrag von Franky_FR »

In C kann ich eine Variable mit Register definieren, der Compiler versucht dann, diese nicht auf dem Stack, sondern im Prozessorregister abzulegen.
Geht sowas auch mit PB ? Oder über einen Umweg Assembler ?
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: C -Register "Variable" in Purebasic ?

Beitrag von GPI »

Gibts nicht. Aber "Register" ist eher veraltet in C. Die Compiler sollten mittlerweile intelligent genug sein, selbstständig dahingehend zu optimieren.

Grund ist vermutlich dass das Register aus Zeiten stammt, als die CPUs noch keine Cache-Speicher hatten. Würde mich nicht wundern, wenn die modernen Compiler das Steuerwort einfach ignorieren (was komplett erlaubt ist, Register ist nur ein Vorschlag für den Compiler).

edit:
in c++ 17 macht es exakt überhaupt nichts:
https://en.cppreference.com/w/cpp/keyword/register
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Franky_FR
Beiträge: 53
Registriert: 08.05.2019 10:06

Re: C -Register "Variable" in Purebasic ?

Beitrag von Franky_FR »

GPI hat geschrieben: 17.06.2021 19:28 Gibts nicht. Aber "Register" ist eher veraltet in C. Die Compiler sollten mittlerweile intelligent genug sein, selbstständig dahingehend zu optimieren.

Grund ist vermutlich dass das Register aus Zeiten stammt, als die CPUs noch keine Cache-Speicher hatten. Würde mich nicht wundern, wenn die modernen Compiler das Steuerwort einfach ignorieren (was komplett erlaubt ist, Register ist nur ein Vorschlag für den Compiler).

edit:
in c++ 17 macht es exakt überhaupt nichts:
https://en.cppreference.com/w/cpp/keyword/register
ah,ok.
Ich muß zugeben, meine C-Literatur ist auch aus der Millenium-Zeit :lol:
Leicht veraltet, aber für die Grundlagen reicht es.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: C -Register "Variable" in Purebasic ?

Beitrag von GPI »

Hab ein bischen noch rumgelesen. In C ist es wohl noch "aktuell" - aber eher wenn es um einfachere Microcontroller geht.
Man merkt halt, das C uralt ist. Aus einer Zeit stammt, in dem der Quellcode nicht komplett in Speicher war, weil man nur ein paar Kilobyte hatte.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Franky_FR
Beiträge: 53
Registriert: 08.05.2019 10:06

Re: C -Register "Variable" in Purebasic ?

Beitrag von Franky_FR »

Ja. das ist schon verrückt.Ich bin aus der C64-Zeit und dann der geliebte Amiga <)
Mann kann sich jetzt gar nicht mehr vorstellen, das der Arbeitsspeicher wirklich nur 64 kb groß war, und beim Amiga dann 512 MB.
Ich weiß noch, wie ich sehnsüchtig auf einer der ersten Festplatten mit 20 MB gestarrt habe.Beim Amiga konnte ich mir dann eine leisten, ich glaube 200 MB. Und heute hat man 128 GB - im HANDY :D
Ich bin im Moment hier im Forum dabei, mir von PB die Grundlagen bzg. Speicher,Pointer und dem ganzen "unter der Haube" anzueignen.
Insbesondere interessiert mich da die Geschwindigkeit, ich will meinen Code aus Prinzip möglichst effizient schreiben.
Bei der Geschwindigkeit heutiger Rechner und dem, was ich hobbymäßig machen werde, könnte ich mir das eigentlich sparen.
Ist ja eigentlich nur interessant, wenn man irgendwelche 3D-Engines schreibt oder riesige Datenbanken bewegt ect.
Gestern z.B habe ich mit ElapsedMilliSeconds eine For-Schleife gemessen, die einige Strings ausliest, und ca. ne halbe Stunde geärgert und den Fehler gesucht, weils nicht "funktioniert" und immer 0 angezeigt wird. Dann habe ich mal Delay 1000 eingegeben - und siehe da - als Ergebnis 1000.
Da ist mir dann mal aufgegangen, das ich meine Schleife vielleicht nicht For i=1 to 3 und nur 3 Strings auslesen sollte. :lol:
Warum kam da wohl 0 bei raus ? :shock:
Oh man
Aber nochmal zu Register: das hätte ja schon Sinn, Variablen im Register sind ja viel schneller ansprechbar. Könnte man nicht in PB eine Variable definieren, diese per ASM ins Register verschieben ? Wenn ich dann weiter in PB programmiere, benutzt er die Variablen dann nicht per Register ?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: C -Register "Variable" in Purebasic ?

Beitrag von NicTheQuick »

Purebasic bekommt gerade ein C-Backend. Damit werden auch Optimierungs-Flags dazu kommen, sodass du dich wirklich um nichts mehr händisch kümmern musst. Es wird automatisch in die Register gepackt, was dort am ehesten Sinn macht. Und tatsächlich ist es bei den Unmengen an Registern heute schwierig selbst zu entscheiden, welche man nutzen sollte und wann man dies tun sollte.
Bild
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: C -Register "Variable" in Purebasic ?

Beitrag von juergenkulow »

Code: Alles auswählen

; Register mit C Backend benutzen. 
! long long register reg=0x4711471247134714LL;
! long long v_q=reg; 
! asm volatile ("nop"); 
MessageRequester("","Inhalt des Register: $"+Hex(q.q))

CompilerIf Defined(PB_Processor_C,#PB_Constant) 
  CompilerIf #PB_Compiler_Processor<>#PB_Processor_C
    CompilerError "Use C Backend Compiler in Compiler-Option"
  CompilerEndIf   
CompilerElseIf Defined(PB_Compiler_Backend,#PB_Constant) 
  CompilerIf #PB_Compiler_Backend<>#PB_Backend_C
    CompilerError "Use C Backend Compiler in Compiler-Option"
  CompilerEndIf 
CompilerElse
    CompilerError "Please install PureBasic version >=6.00 Alpha."
CompilerEndIf 
; x64dbg gibt aus:  
; 00000001400010D5 | 48:BB 1447134712471147   | mov rbx,4711471247134714                                    |
; 00000001400010DF | 48:895D B8               | mov qword ptr ss:[rbp-48],rbx                               |
; 00000001400010E3 | 90                       | nop                                                         |
Edit: CompilerIf #PB_Compiler_Backend<>#PB_Backend_C
Zuletzt geändert von juergenkulow am 19.06.2021 17:30, insgesamt 1-mal geändert.
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Franky_FR
Beiträge: 53
Registriert: 08.05.2019 10:06

Re: C -Register "Variable" in Purebasic ?

Beitrag von Franky_FR »

NicTheQuick hat geschrieben: 18.06.2021 13:43 Purebasic bekommt gerade ein C-Backend. Damit werden auch Optimierungs-Flags dazu kommen, sodass du dich wirklich um nichts mehr händisch kümmern musst. Es wird automatisch in die Register gepackt, was dort am ehesten Sinn macht. Und tatsächlich ist es bei den Unmengen an Registern heute schwierig selbst zu entscheiden, welche man nutzen sollte und wann man dies tun sollte.
Ja, mit dem C-Backend und Optimierungsflags braucht man sich wohl wirklich nicht mehr um solche Sachen Sorgen zu machen.
Ist nur noch interessant, um die Systeminterna zu kennen.
Franky_FR
Beiträge: 53
Registriert: 08.05.2019 10:06

Re: C -Register "Variable" in Purebasic ?

Beitrag von Franky_FR »

juergenkulow hat geschrieben: 18.06.2021 16:30

Code: Alles auswählen

; Register mit C Backend benutzen. 
! long long register reg=0x4711471247134714LL;
! long long v_q=reg; 
! asm volatile ("nop"); 
MessageRequester("","Inhalt des Register: $"+Hex(q.q))

CompilerIf Defined(PB_Processor_C,#PB_Constant)
  CompilerIf #PB_Compiler_Processor<>#PB_Processor_C
    CompilerError "Use C Backend Compiler in Compiler-Option"
    CompilerEndIf
  CompilerElse
    CompilerError "Please install PureBasic version >=6.00 Alpha."
  CompilerEndIf 
; x64dbg gibt aus:  
; 00000001400010D5 | 48:BB 1447134712471147   | mov rbx,4711471247134714                                    |
; 00000001400010DF | 48:895D B8               | mov qword ptr ss:[rbp-48],rbx                               |
; 00000001400010E3 | 90                       | nop                                                         |
Vielen Dank !
Antworten