如何在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)。
答案 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