#define oder EQU in Assembler verwenden

  • Hallo,

    ich würde gerne bestimmten lesbaren Konstanten in Assemler (GAS) verwenden.

    Als Beispiel habe ich versucht folgenden Code zu Kompilieren:

    Code
    #define BASE 0xFE000000
    ...
    ...
    ldr r0,= BASE
    ...
    ...

    Der Assembler (Gnu GAS) kompiliert dies ohne Probleme, egal welche Version ich nehme. Allerdings meldet der spätere Linker, das er BASE nicht kennt:

    Code
    build/main.o: in function `wait2$': (.init+0x8044): undefined reference to `BASE'

    Übrigens: in der wait2$ Funktion wird "BASE" nicht verwendet. Mit EQU habe ich es auch versucht.

    Wie kann ich das lösen?

    Gruß, Satyria

  • Hallo satyria,

    die beiden Zeilen lauten (korrekt):


    Code
    LDR r0, .BASE
    ...
    .BASE:    .word    0xfe000000

    ABER: Dieses Programm wird nur auf einem RPi 4 funktionieren. Auf anderen Systemen kackt es einfach nur ab, sobald du vorhast, GPIO-Pins zu adressieren.

    Besser wird's wenn Du Dich mal mit den Grundlagen der Assembler-Programmierung auf ARM-Prozessoren beschäftigst, denn Adressierung von Konstanten und der Umgang mit Zeigern und Adressen gehört zu den absoluten Grundlagen. Wenn Du da schon ins Straucheln kommst und zu schwimmen beginnst, dann gehst Du aller Wahrscheinlichkeit nach schnell unter.

    Und wenn ich schon kritisiere: Weißt Du wie viele BASE's es beim ARM und seiner Peripherie gibt? Dann solltest Du jeder BASE einen individuellen Namen geben, hier sicherlich .gpiobase. ;)


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Danke, für deine Antwort. Mir ist schon klar, auf was ich hier achten muss. Ich weiß genau, wie ich die GPIO ansteuern muss. Habe es bereits erfolgreich mit RPI1,2 und 4 gemacht.

    Allerdings finde ich den Sourcecode schlecht lesbar, wenn da nur "Zahlen" stehen und wollte den Code einfacher gestalten

  • Hallo satyria,

    gegen schlecht lesbaren Code helfen nur Kommentare:


    Code
    @ Kommentar

    um Assembler-Code zu erläutern.

    Wenn ich gelegentlich mal in Assembler programmiere, habe ich mir angewöhnt, jede Zeile mit einem Kommentar zu versehen. Denn sonst weiß man schon 2 Wochen später nicht mehr, was das mal sollte.

    Und ansonsten helfen bei Assembler-Code nur noch Strukturierung in Form von Label.

    Assembler selber ist so ziemlich die am schlechtesten lesbare Programmiersprache - führt meistens aber auch zum schnellsten Code.

    Wenn Du mit Deinem Assembler-Code Pins schneller als 200 MHz toggeln kannst, dann kann ich Dir zeigen, wie es noch schneller geht...

    Allerdings finde ich den Sourcecode schlecht lesbar, wenn da nur "Zahlen" stehen und wollte den Code einfacher gestalten

    Du solltest NIE - in KEINER Programmiersprache - mit "Magic Numbers", "Magic strings" etc. arbeiten. Lasse Dein Programm solche Zahlen ermitteln...


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!