2016-08-22 5 views
1

Ich mache ein kleines Projekt mit dem Android NDK, und ich muss einige Asm-Code für ARM-Architektur einfügen.Verwenden von Inline-ARM-Asm in Android NDK-Projekt

Alles außer der asm funktioniert gut, aber der Code asm sagt mir, dass

Operand 1 sollte eine ganze Zahl

wenn conpiling einfachen Code wie

asm("mov r0, r0");

registrieren sein

Also, Was ist das Problem? Versucht mein Computer, für x86_64 anstelle von ARM zu kompilieren? Wenn ja, wie sollte ich das ändern?

Auch ich habe versucht, die x86_64 gleichwertig arm("mov rax, rax"); aber der Fehler ist der gleiche.

+0

Für welche ABIs bauen Sie? – Michael

+1

Versuchen Sie 'mov x0, x0'. Wenn es keinen Fehler gibt, ist das Problem, dass Sie 32-Bit-ARM-Assemblersprache mit der 64-Bit-ARM-Toolchain verwenden. Sie müssen entweder zu 32-Bit-Tools oder einer 64-Bit-Assemblersprache wechseln. Übrigens sollten Sie untersuchen, ob Sie wirklich Inline-Assembly verwenden müssen. Es ist schwer, richtig zu werden. Sehen Sie, wenn Sie nicht intrinsics verwenden können, um zu tun, was Sie stattdessen wünschen. –

+1

Bei der Ausrichtung auf x86 ist die Standard-ASM-Syntax AT & T-Stil, also sollte 'asm (" mov% rax,% rax ");' als No-Op funktionieren. Verwenden Sie 'gcc -S', um eine asm-Ausgabedatei zu erzeugen. Suchen Sie nach '# APP' /' # NO_APP' um Ihren Code und sehen Sie, ob er wie der umgebende, vom Compiler generierte ASM aussieht. z.B. https://godbolt.org/g/h8JIEy –

Antwort

1

Alle Ihre C-Quellen sind für jede Architektur kompiliert, die in Ihrer APP_ABI erwähnt wird. Es gibt also keinen Grund, sich zu fragen, warum die ARM-Assemblierung nicht vom x64-Compiler oder umgekehrt verstanden wurde.

Verwenden Sie keine Inline-Montage. Es ist viel besser, alle Assembly stuff in dedicates *.S Quellen, die von as verarbeitet werden (NDK toolchains haben es). Diese Baugruppenquellen sollten in entsprechende Ordner wie arch-arm/, arch-x86/ platziert werden. Dann sollten Sie sie Android.mk richtig hinzufügen:

LOCAL_SRC_FILES := arch-$(TARGET_ARCH)/my_awesome_code.S 

$(TARGET_ARCH) Weg, um geeignete Quelle in der richtigen und schmerzlos zu lösen helfen.

P.S. Auch Standalone Assembly bietet mehr Möglichkeiten als Inline. Dies ist ein weiterer Grund, die Inline-Montage zu vermeiden. Darüber hinaus unterscheidet sich die Inline-Assembly-Syntax für den Compiler vom Compiler, da sie nicht Teil des Standards ist.

+0

Auch das zu tun, mit '.text .global MyAsmFunction .type MyAsmFunction Funktion MyAsmFunction: mov x0 , # 2' als meine '.s 'file, was du gesagt hast und' extern "C" void MyAsmFunction(); 'Es gibt den Fehler _expecting operand nach ','; habe nothing_, was einer der Fehler ist, den ich in Inline-Asm bekommen habe. – Garmekain

Verwandte Themen