7

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

假设 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

倒数第二行,我不确定如何正确加载,我隐约记得在某处读过,我必须在 .global 中定义 LONG_MAX,但再也找不到工作示例的链接。

我正在使用 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 System Developer's Guide Designing and Optimizing System Software[2004] 和 ARM Architecture Reference Manual[2000],但我的目标是 XScale-IXP42x Family rev 2 (v5l)。

4

5 回答 5

11

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

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


5年后编辑:

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

于 2010-06-19T15:46:18.603 回答
2

如果您使用 gcc 及其汇编程序,这很简单:用 final 命名文件.S,然后在开头添加#include <limits.h>并在需要常量的地方使用,例如ldr r0, SOMETHING; 我使用 x86 进行了测试,因为它是我所拥有的,但由于它是 gcc 功能,所以同样有效。

于 2010-07-02T15:31:17.417 回答
1

我最终做的是:

在 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。我很乐意接受这种方式作为完整的答案。

于 2010-06-28T13:17:38.997 回答
0

我已经看到简单地向 gcc 提供汇编程序源 vs gas 将允许您在汇编程序中执行类似 C 的操作。当你遇到必须使用 gcc 作为 gas 的前端才能让某些东西工作的情况时,这实际上有点可怕,但那是另一回事了。

于 2010-06-20T03:11:22.673 回答
0

使用 --cpreproc 作为 armasm 选项并添加

#include "my_arm.h"

进入 my_arm.s。

它适用于 Keil ARM

于 2015-10-27T03:34:49.760 回答