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上.
| 归档时间: |
|
| 查看次数: |
12137 次 |
| 最近记录: |