如何在ARM汇编程序中使用C定义

Sin*_*int 7 c assembly limits arm gnu

如何在ARM汇编程序代码中使用外部定义,如LONG_MIN和LONG_MAX?

假设my_arm.h看起来像这样:

int my_arm(int foo);
Run Code Online (Sandbox Code Playgroud)

假设我有一个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));
...
}
Run Code Online (Sandbox Code Playgroud)

而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
Run Code Online (Sandbox Code Playgroud)

倒数第二行,我不知道如何正确加载,我依旧记得在某处读取,我必须在.global中定义LONG_MAX,但找不到工作示例的链接了.

我正在使用arm-linux-gnueabi-gcc 4.3.2进行编译

==================

更新:感谢建议!不幸的是,我仍然遇到语法问题.

首先,我创建了一个小头文件mylimits.h(现在和.S在同一个目录中)

#define MY_LONG_MIN 0x80000000
Run Code Online (Sandbox Code Playgroud)

在my_arm.S我添加了以下内容:

...
.include "mylimits.h"
...
ldr r7, =MY_LONG_MIN @ when it was working it was ldr r7, =0x80000000
...
Run Code Online (Sandbox Code Playgroud)

这种方法存在两个问题.

首先是最大的问题:符号MY_LONG_MIN无法识别......所以有些东西仍然不对

第二:.include的语法不允许我包括<limits.h>,我将不得不在mylimits.h中添加,似乎有点kludgy,但我想,那没关系:)

有什么指针吗?

我可以访问ARM系统开发人员指南设计和优化系统软件[2004]和ARM体系结构参考手册[2000],但我的目标是XScale-IXP42x系列rev 2(v5l).

Jam*_*mes 11

通常,小写文件扩展名.s意味着汇编程序不应该通过c预处理程序,而大写扩展名.S意味着它应该.这取决于您的编译器遵循此约定(gcc端口通常这样做),因此请检查其文档.

(编辑:请注意,这意味着您可以使用#include指令 - 但请记住,您将包含的大多数文件通常不是有效的汇编程序(除非它们完全由#defineitions 组成),因此您可能必须编写自己的标头,即)


编辑5年后:

请注意,armcc v5编译器在linux下遵循此行为...但不在Windows上.

  • 如果正在使用GCC工具链,则在预处理汇编文件时定义`__ASSEMBLER__`宏.如果需要,可以使用它来帮助.h文件在任何一个世界(asm和C)中工作.但是,如果可能的话,最好将需要在两个世界中工作的项目分隔成单独的标题.虽然对于像标准标题中定义的"LONG_MAX"这样的东西,你没有太多的控制权...... (4认同)