gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:07:04 27 4
gpt4 key购买 nike

如何在 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 系统开发人员指南设计和优化系统软件 [2004] 和 ARM 架构引用手册[2000],不过我的目标是 XScale-IXP42x Family rev 2 (v5l)。

最佳答案

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

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


5 年后编辑:

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

关于c - 如何在 ARM 汇编程序中使用 C 定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3075983/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com