So rufen Sie C-Funktionen von ARM Assembly auf?

9

Ich schreibe Code für ARM Cortex-A auf Android-Geräten (mit GNU-Assembler und -Compiler), und ich versuche, zwischen Assembly und C zu vermitteln. Insbesondere interessiere ich mich dafür, in C geschriebene Funktionen aufzurufen Versammlung. Ich habe viele Dinge ausprobiert, einschließlich der .extern -Direktive, deklariert C-Funktionen mit asm und __asm__ und so weiter, aber keiner von ihnen hat funktioniert, also suche ich nach einem minimalen Beispiel dafür. Ein Hinweis auf ein solches Beispiel wäre genauso willkommen.

    
Phonon 07.12.2011, 20:45
quelle

4 Antworten

5

Sie müssen den ARM ARM lesen und / oder wissen, dass der Befehlssatz alles ist, normalerweise würden Sie so etwas machen wollen

%Vor%

Sie können das selbst ausprobieren. für gnu as und gcc funktioniert das ganz gut, es sollte auch gut funktionieren, wenn Sie clang verwenden, um den c-code für ein Objekt und gnu wie für assembler zu erhalten. Nicht sicher, was Sie verwenden.

Das Problem mit dem obigen ist bl hat eine begrenzte Reichweite,

%Vor%

wissend, dass der bl-Befehl das Verknüpfungsregister nach dem bl-Befehl auf den Befehl setzt, dann wenn Sie über das Programmzählerregister lesen:

%Vor%

also, wenn Sie Ihre ASM so aussehen:

%Vor%

Sie erhalten

%Vor%

Der Assembler reserviert einen Speicherplatz innerhalb der Reichweite des Befehls ldr pc (falls möglich, sonst einen Fehler erzeugen), wo er die volle 32-Bit-Adresse für den Befehl speichert. Der Linker wird später diese Adresse mit der externen Adresse ausfüllen. Auf diese Weise können Sie eine beliebige Adresse im Adressraum erreichen.

Wenn Sie Assemblerspiele nicht so spielen wollen und die Kontrolle behalten wollen, dann erstellen Sie den Ort, an dem Sie die Adresse der Funktion behalten und sie selbst in den PC laden:

%Vor%

kompiliert:

%Vor%

Schließlich, wenn Sie in die moderne ARM-Welt bewegen wollen, wo ARM und Daumen gemischt sind oder sein können (zum Beispiel bx lr anstelle von mov pc, lr), dann wollen Sie bx

verwenden %Vor%

natürlich brauchen Sie ein anderes Register, um das zu tun und denken daran, Ihr Linkregister und das andere Register vor und nach Ihrem Aufruf von C zu drücken und zu öffnen, wenn Sie sie behalten wollen.

    
old_timer 07.12.2011, 22:44
quelle
1

Sie benötigen die Spezifikationen für armeabi-v7a , beschreiben den Call-Stack, registrieren (callee vs. caller) usw. Sehen Sie sich dann die Assembly-Ausgabe des kompilierten C-Codes an, um die Syntax usw. zu ermitteln Funktionen in gemeinsam genutzten Bibliotheken oder verschiebbaren Objekten.

    
Brett Hale 07.12.2011 21:01
quelle
1

Minimales ausführbares armv7-Beispiel

Diese Frage kommt "was ist die ARM-Aufrufkonvention (AAPCS)". Ein Beispiel a.S :

%Vor%

Dann auf Ubuntu 16.04:

%Vor%

Ausgabe:

%Vor%

Der einfachste Fehler bei komplexeren Beispielen besteht darin, zu vergessen, dass der Stapel 8 Byte groß sein muss. Zum Beispiel möchten Sie:

%Vor%

anstelle von:

%Vor%

Beispiel für GitHub mit dem allgemeinen Text: Ссылка

    
quelle
-3

Wie Brett sagt, müssen Sie nur die richtigen Werte in die richtigen Register setzen und mit der Adresse der Funktion verzweigen. Sie müssen sich darüber im Klaren sein, welches Register die kompilierte Funktion überschreiben wird und welches Register es wiederherstellen wird, bevor es zurückkehrt - das ist alles in der ABI-Dokumentation auf infocentre.arm.com geschrieben. Sie müssen auch sicherstellen, dass das Stack-Register auf das gesetzt ist, was der Compiler erwartet, und vielleicht auch andere Register (für den PIC-Modus?)

Aber müssen Sie den Code wirklich in Assembler-Dateien schreiben?

Wenn Sie die GCC "asm" -Funktion verwenden, können Sie Assembler-Fragmente (so lange Sie möchten) in reguläre C-Funktionen einbetten und bei Bedarf wieder in C einfügen.

Es gibt Fälle, in denen C gubbins nicht ausreichen, aber wenn Sie C-Funktionen aufrufen können, rate ich, dass Sie nicht dabei sind.

Kommen Sie dazu, warum müssen Sie überhaupt Assembler verwenden ... C ist eigentlich ein High-Level Assembler?

    
ams 07.12.2011 22:08
quelle

Tags und Links