То, как использовать C, определяет в ассемблере ARM

То, как я могу использовать внешний, определяет, такие как 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 (на данный момент в том же dir как.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, Разрабатывающему и Оптимизирующему Системное программное обеспечение [2004] и Справочник [2000] Архитектуры ARM, моя цель является версией Семейства XScale-IXP42x 2 (v5l) все же.

7
задан Sint 22 June 2010 в 07:45
поделиться

4 ответа

Часто строчное расширение файла .s подразумевает, что ассемблер не должен проходить через препроцессор c, тогда как прописное расширение .S подразумевает, что должен. Впрочем, следовать ли этому соглашению, зависит от вашего компилятора (порты gcc обычно следуют), так что проверьте его документацию.

(EDIT: обратите внимание, что это означает, что вы можете использовать директивы #include - но помните, что большинство файлов, которые вы включите, обычно не являются допустимыми для ассемблера (если только они не состоят полностью из #defineиций), поэтому вам, возможно, придется написать свой собственный заголовок)


редактировать 5 лет спустя:

Обратите внимание, что компилятор armcc v5 следует этому поведению под linux... но не под windows.

11
ответ дан 6 December 2019 в 15:18
поделиться

Я видел, как простая подача gcc источника ассемблера vs gas позволит вам делать C как на ассемблере. На самом деле немного страшно, когда вы сталкиваетесь с ситуациями, когда вы должны использовать gcc в качестве внешнего интерфейса для газа, чтобы что-то работало, но это уже другая история.

0
ответ дан 6 December 2019 в 15:18
поделиться

В итоге я сделал следующее:

в my_main.c

#include <limits.h>
...
int my_LONG_MAX=LONG_MAX;

, затем в my_arm.S

ldr r8, =my_LONG_MAX 
ldr r10, [r8] 

Это выглядит запутанным, и это так (плюс преимущества переносимости сомнительны в этот подход).

Должен быть способ доступа к LONG_MAX прямо в сборке. Такой способ я бы с радостью принял как исчерпывающий ответ.

1
ответ дан 6 December 2019 в 15:18
поделиться

Если вы используете gcc и его ассемблер, это просто: назовите файл final .S , затем добавьте в начале #include и используйте везде, где вам нужно константу, например ldr r0, ЧТО-ТО ; Я проводил тесты с x86, так как это то, что у меня есть, но работает то же самое, поскольку это функция gcc.

2
ответ дан 6 December 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: