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

时间:2010-06-19 15:16:33

标签: c arm gnu assembly limits

如何在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中添加它,看起来有点kludgy,但我想,那没关系:)

任何指针?

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

5 个答案:

答案 0 :(得分:11)

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

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


5年后编辑:

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

答案 1 :(得分:2)

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

答案 2 :(得分: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。我很乐意接受这种方式作为完整答案。

答案 3 :(得分:0)

我已经看到简单地输入gcc汇编源和气体将允许你在汇编程序中做类似C的东西。当你遇到必须使用gcc作为前端来获取某些东西的情况时,实际上有点可怕,但这是另一个故事。

答案 4 :(得分:0)

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

CREATE VIEW cust_inv_serv AS 
    SELECT c.FirstName, c.LastName, i.InvoiceDate, i.InvoiceID
    FROM CUSTOMER c
    JOIN INVOICE i ON c.CustomerID = i.InvoiceID 
    JOIN INVOICE_ITEM ii ON ii.InvoiceID = i.InvoiceID 
    JOIN SERVICE s ON ii.ServiceID = s.ServiceID;

CREATE VIEW OrderSummaryView AS 
    SELECT v.FirstName, v.LastName, v.InvoiceDate, v.InvoiceID, SUM(UnitPrice) * Quantity AS InvoiceTotal
    FROM SERVICE s
    JOIN INVOICE_ITEM i ON i.InvoiceID = s.ServiceID
    JOIN cust_inv_serv v ON v.InvoiceID = i.InvoiceID
    GROUP BY i.InvoiceID;

进入my_arm.s。

适用于Keil ARM