Wie kann ich externe Definitionen wie LONG_MIN und LONG_MAX in ARM-Assembler-Code verwenden?Verwendung von C definiert in ARM-Assembler
Sagen wir my_arm.h wie folgt aussieht:
int my_arm(int foo);
Lassen Sie uns sagen, dass ich ein my_main.c haben 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 wie folgt aussieht:
.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
Die vorletzte Zeile, ich bin nicht sicher, wie man richtig lädt, ich erinnere mich vage daran, irgendwo zu lesen, dass ich definieren musste LONG_MAX in .global, aber kann den Link zu einem funktionierenden Beispiel nicht mehr finden.
Ich Kompilieren mit Arm-linux-gnueabi-gcc Version 4.3.2
==================
UPDATE: Schätzen Sie die Vorschläge ! Leider habe ich immer noch Probleme mit der Syntax.
Zuerst machte ich eine kleine Header-Datei mylimits.h (jetzt in demselben Verzeichnis wie .S)
#define MY_LONG_MIN 0x80000000
in my_arm.S i hinzugefügt folgendes:
...
.include "mylimits.h"
...
ldr r7, =MY_LONG_MIN @ when it was working it was ldr r7, =0x80000000
...
Zwei Probleme mit diesem Ansatz.
Zuerst das größte Problem: das Symbol MY_LONG_MIN nicht erkannt wird ... so etwas noch nicht richtig
Zweitens: Syntax für .include mich nicht lassen umfassen <limits.h>
, würde ich in mylimits hinzufügen. h, scheint ein bisschen kludgy, aber ich nehme an, das ist ok :)
Irgendwelche Zeiger?
Ich habe Zugang zu ARM-System-Entwicklerhandbuch Planung und Optimierung von Systemsoftware [2004] und ARM Architektur Referenzhandbuch [2000], mein Ziel ist XScale-IXP42x Familie 2 (V5L) rev though.
Dont über ARM wissen, aber wenn Sie in Mips, durch zu .S auf die Verlängerung Umbenennung macht C Vorprozess die Datei. – Tom
Verwenden Sie #include nicht .include und .S nicht .s, wie in der Antwort angegeben. Auf diese Weise können Sie eine gcc-Funktion ausnutzen, und alles sollte wie bei meinen Tests in x86 laufen. Assembly apart ist natürlich anders. – ShinTakezou