Die Verwendung von globalen Variablen in C deklariert, im Arm assembly
Ich habe eine C-Datei die Deklaration einer globalen Variablen. Diese Datei wird kompiliert werden, zusammen mit einigen ARM-assembly-Dateien.
int foo;
void call_asm(void);
int main(void) {
call_asm();
return foo;
}
call_asm:
...
Ich habe versucht mit der link aus dem arm infocenter aber der compiler (arm-linux-gnueabi-gcc
) sagt mir, dass der "import" ist eine Undefinierte Anweisung.
Kann ich einfach so etwas wie:
LDR r0, =GLOBAL_VAR
Wie kann ich die globalen Variablen definiert, die in die C-Datei in der Montage?
- Sie sollten akzeptieren, Ihre Antworten oder Kommentare.
- GAS wird davon ausgegangen, dass alle nicht deklarierten Symbole sind externe standardmäßig. Ja, Sie können einfach verwenden
ldr r0, =foo
um die Adresse inr0
. (Vorausgesetzt, eine Plattform, die nicht voranstellen_
auf C Namen.) - Andy Polyakov hat eine Technik, die in OpenSSL für diesen Anwendungsfall. Kasse der übersetzte code für den
sha1_armv4.S
(und Freunde), und wieOPENSSL_armcap_P
behandelt wird. (Die verlinkten code ist, den Perl-Quellcode; es muss übersetzt werden pro Cryptogams SHA). Allerdings war ich erlebt "unerwartete reloc-Typ 0x03" in einer gemeinsam genutzten Bibliothek. Ich musste gutOPENSSL_armcap_P
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser wird ganz einfach, wenn Sie Fragen, gcc, wie es zu tun. Zum Beispiel, kompilieren Sie die folgende Funktion mit
gcc -S -O3
:Du wirst sehen, wie gcc implementiert.
Auf dieser Grundlage habe ich entwickelt als ein Beispiel für das aufrufen eines assembly-Funktion von C so legen Sie eine Globale C-variable:
Zusammenstellung und Ausführung:
Getestet auf gcc Raspbian 6.3.0-18+rpi1.
Assembly code oben wurde auf der Basis der gcc-Ausgabe für die
useFoo
Beispiel. Eine einfachere Möglichkeit ist die Verwendung=foo
statt manuell platzieren der Adresse auf eine variable:Dadurch wird die Adresse der
foo
gelegt, nach der definition einer Funktion, die durch den assembler.ldr r0, =foo
pseudo-Anweisung könnte zu erweitern, ummovw
/movk
zu konstruieren, die eine 32-bit-Adresse, die aus zwei 16-bit immediates.-mcpu=cortex-a53
oder so etwas, so dass GAS könnte es nie tun. Ertönt built-in assembler könnte wissen über-march
/-mcpu
Optionen, wenn. Oder vielleicht kein Assembler jemals tun, undldr reg, =constant
ist immer eine Last.Ich glaube, Sie brauchen die übersetzung der Richtlinien aus dem ARM-assembler auf GNU-assembler. Wenn ich das richtig verstehe, können Sie den Zugriff auf jede Globale symbol mithilfe der
.global
Richtlinie statt.import
. Aus der Verwendung als Seiten:ist, was Sie brauchen