ich vor kurzem begann Assembler Programmierung für Arm Kerne. Meine ersten kleinen Demos, nur mit der .text-Sektion, liefen ohne Probleme.interner Umzug nicht behoben
Als logische Erweiterung wollte ich den Assembler-Code in die üblichen Abschnitte strukturieren: .text, .data, .bss.
Also schrieb ich die folgende einfache Programm:
.globl _start
.section .text
_start:
b main
b .
b .
b .
b .
b .
b .
b .
main:
ldr r0, x
nop
.section .data
x: .word 0xf0f0f0f0
.end
Aber
/opt/arm/bin/arm-as -ggdb -mcpu=arm7tdmi demo.s -o demo.o
Ausfahrten mit dem Fehler
prog.s: Assembler messages:
prog.s:17: Error: internal_relocation (type: OFFSET_IMM) not fixed up
make: *** [prog.o] Error 1
ich keine Ahnung, warum der Monteur über Umzug 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 fand einen Weg, den Code richtig zusammengebaut zu bekommen, von
.section .data
von
.org .
ersetzt, die keine befriedigende Lösung. Vor allem angesichts der Tatsache, dass die Gasdokumentation den Sinn dieses Abschnitts unterstreicht.
Vielleicht hat jemand von euch Experten kann mir helfen, einige Weisheit
Vielen Dank für Ihre Erklärung und das Beispiel. Dies oder etwas Ähnliches sollte in den Armbereich der binutils-Dokumentation gehen. Ich merke mir, dass der Linker den großen Maßstab macht und der Coder die kleine Verlagerung. Wenn ich etwas mehr Zeit habe, werde ich einige demontierte C-Programme studieren und hoffe, mehr Einblick zu bekommen ... – user1146332
ist das die akzeptierte Antwort? – aditya