Как я могу использовать внешние определения, такие как LONG_MIN и LONG_MAX, в коде ассемблера ARM?
Допустим, my_arm.h выглядит так:
int my_arm(int foo);
Скажем, у меня есть my_main.c следующим образом:
...
#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));
...
}
И my_arm.s выглядит так:
.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
Предпоследняя строка, я не уверен, как правильно загрузить, я смутно помню, что где-то читал, что мне нужно было определить LONG_MAX в .global, но больше не могу найти ссылку на рабочий пример.
Я компилирую с помощью arm-linux-gnueabi-gcc версии 4.3.2.
==================
ОБНОВЛЕНИЕ: Цените предложения! К сожалению, у меня все еще проблемы с синтаксисом.
Сначала я сделал небольшой заголовочный файл mylimits.h (пока в том же каталоге, что и .S)
#define MY_LONG_MIN 0x80000000
в my_arm.S я добавил следующее:
...
.include "mylimits.h"
...
ldr r7, =MY_LONG_MIN @ when it was working it was ldr r7, =0x80000000
...
Две проблемы с этим подходом.
Первая самая большая проблема: символ MY_LONG_MIN не распознается... так что что-то все равно не так
Во-вторых: синтаксис для .include не позволяет мне включать <limits.h>
, я должен был бы добавить это в mylimits.h, кажется немного неуклюжим, но я полагаю, это нормально :)
Любые указатели?
У меня есть доступ к Руководству разработчика систем ARM Designing and Optimizing System Software[2004] и Справочному руководству по архитектуре ARM[2000], однако моя цель — XScale-IXP42x Family rev 2 (v5l).