Wie man C definiert, in ARM-assembler
Wie kann ich externe definiert, wie LONG_MIN und LONG_MAX in ARM-assembler-code?
Sagen wir mal my_arm.h sieht wie folgt aus:
int my_arm(int foo);
Sagen wir, ich habe eine my_main.c wie folgt:
...
#include <limits.h>
#include "my_arm.h"
...
int main (int argc, char *argv[])
{
int foo=0;
...
printf("My arm assembler function returns (%d)\n", my_arm(foo));
...
}
Und my_arm.s sieht wie folgt aus:
.text
.align 2
.global my_arm
.type my_arm, %function
my_arm:
...
ADDS r1, r1, r2
BVS overflow
...
overflow:
LDR r0, LONG_MAX @ this is probably wrong, how to do it correctly?
BX lr @ return with max value
Der zweiten bis letzten Zeile bin ich nicht sicher, wie Sie Sie richtig geladen, ich erinnere mich vage, irgendwo gelesen, dass ich hatte, um zu definieren, LONG_MAX in .global, aber nicht finden können, den link zu einem funktionierenden Beispiel mehr.
Ich bin die Kompilierung mit der arm-linux-gnueabi-gcc version 4.3.2
==================
UPDATE: Schätzen die Anregungen! Leider bin ich noch Probleme mit dem syntax.
Erste, ich machte einen kleinen header-Datei mylimits.h (für jetzt im selben dir wie .S)
#define MY_LONG_MIN 0x80000000
in my_arm.S habe ich noch folgende:
...
.include "mylimits.h"
...
ldr r7, =MY_LONG_MIN @ when it was working it was ldr r7, =0x80000000
...
Zwei Probleme mit diesem Ansatz.
Ersten das größte problem: das symbol MY_LONG_MIN wird nicht erkannt...so etwas ist noch nicht richtig
Zweitens: die syntax für .gehören nicht mir gehören <limits.h>
hätte ich noch hinzufügen, dass in mylimits.h scheint ein wenig notdürftigem, aber ich nehme an, dass ist ok 🙂
Irgendwelche Hinweise?
Habe ich Zugriff auf die ARM System Developer ' s Guide-Designing and Optimizing System Software[2004] und ARM-Architektur
Referenz-Handbuch[2000], mein Ziel ist es, XScale-IXP42x Familie rev 2 (v5l) obwohl.
- Weiß nicht, über ARM, aber wenn Sie in mips, durch umbenennen der Erweiterung .S macht C Vorverarbeiten der Datei.
- verwenden Sie #include nicht .gehören, und .S nicht .s, wie gesagt, in der Antwort. Diese Möglichkeit auszuschöpfen, in dem man eine gcc-feature, und alles sollte gehen wie bei meinen tests in x86-assembly abgesehen, die ist natürlich anders
Du musst angemeldet sein, um einen Kommentar abzugeben.
Oft wird die kleingeschriebene Dateiendung
.s
impliziert, dass assembler sollten nicht weitergegeben werden durch den c-Präprozessor, in der Erwägung, dass die Großbuchstaben Erweiterung.S
impliziert, dass es sollte.Es ist bis zu Ihrem compiler, Folgen dieser Konvention, obwohl (gcc-ports normalerweise tun), so überprüfen Sie die Dokumentation.
(EDIT: beachten Sie, dass dies bedeutet, Sie können #include-Direktiven - aber denken Sie daran, dass die meisten der Dateien, die Sie einschließen würde, würde nicht normalerweise gelten assembler (es sei denn, Sie bestehen ausschließlich aus
#define
Bedingungen), so können Sie schreiben Sie Ihre eigenen header, der ist)Bearbeiten 5 Jahre später:
Beachten Sie, dass die armcc v5 compiler folgt dieses Verhalten unter linux... aber nicht auf windows.
__ASSEMBLER__
makro ist definiert, wenn die Vorverarbeitung assembly-Dateien. Kann verwendet werden, um zu helfen .h-Datei, funktioniert die in-Welt (asm und C), wenn nötig. Aber es könnte immer noch am besten trennen Sie die Elemente, die arbeiten müssen, in beiden Welten, in separate Header, wenn möglich. Aber für so etwas wieLONG_MAX
definiert, die in einem standard-header, Sie haben nicht viel Kontrolle über...Wenn Sie gcc verwenden und seine assembler, ist es einfach: der name der Datei mit der definitiven
.S
ist, dann fügen Sie am Anfang#include <limits.h>
und verwenden, wo immer Sie brauchen die ständige, z.B.ldr r0, SOMETHING
; ich habe tests mit x86-seit es das ist, was ich habe, aber die gleichen arbeiten, da es ein gcc-feature.Was ich am Ende tun, ist dies:
in my_main.c
dann in my_arm.S
Sieht es convuluted und es ist(plus die Portabilität Gewinne sind fraglich bei diesem Ansatz).
Muss es eine Möglichkeit zum Zugriff auf LONG_MAX direkt in der Montage. So würde ich gerne annehmen, da die ausführliche Antwort.
Ich gesehen habe einfach die Fütterung gcc den assembler-source vs gas wird erlauben Sie, um C zu tun, wie die Dinge in assembler. Es ist tatsächlich ein bisschen beängstigend, wenn Sie kommen in Situationen, in denen müssen Sie gcc als Frontend auf gas um etwas zu arbeiten, aber das ist eine andere Geschichte.
verwenden --cpreproc für armasm option und fügen Sie
in my_arm.s.
funktioniert es für Keil ARM