interne Verlagerung nicht behoben

8

Ich habe vor kurzem mit der Assemblerprogrammierung für Armkerne begonnen. Meine ersten kleinen Demos, nur mit der .text-Sektion, liefen ohne Probleme.

Als logische Erweiterung wollte ich den Assembler-Code in die üblichen Abschnitte gliedern: .text, .data, .bss.

Also habe ich das folgende einfache Programm geschrieben:

%Vor%

Aber

%Vor%

wird mit dem Fehler

beendet %Vor%

Ich habe keine Ahnung, warum der Assembler sich über eine Verlagerung beschwert, weil ich dachte, das ist die Aufgabe des Linkers. Ich könnte mir vorstellen, dass ich dem Assembler sagen muss, dass mein .data-Abschnitt nicht auf der letzten Speicherposition in der Zusammenstellungsphase liegt, aber ich kann nichts Ähnliches finden.

Obwohl ich einen Weg gefunden habe, den Code korrekt zusammenzusetzen, indem ich

ersetze %Vor%

von

%Vor%

das ist keine befriedigende Lösung. Vor allem angesichts der Tatsache, dass die Gasdokumentation den Sinn dieses Abschnitts unterstreicht.

Vielleicht kann jemand von euch Experten mir helfen, etwas Weisheit zu erlangen

    
user1146332 10.04.2012, 18:22
quelle

1 Antwort

13

Es scheint, als könnten Sie nur die Adresse der Variablen abrufen und einen Wert von dieser Adresse laden.

%Vor%

In gewisser Weise ergibt das auch einen Sinn. Was ist, wenn die Adresse von x (nach der Verknüpfung) für einen relativen PC-Zugriff zu weit entfernt ist? Da der Compiler (der die Verknüpfung nicht durchführt) nicht weiß, wie weit der Datenabschnitt von dem Textabschnitt entfernt sein könnte, würde er sich weigern, diesen Code nur dann zu kompilieren, wenn er nicht erreichbar ist.

Mit dieser indirekten Art des Zugriffs auf eine Variable ist garantiert, dass die Variable erreichbar ist (oder zumindest der Compiler kann sicher sein, ob die Variable erreichbar ist oder nicht).

Code angepasst von Ссылка

    
tangrs 16.04.2012, 09:46
quelle

Tags und Links