代码之家  ›  专栏  ›  技术社区  ›  Sint

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

  •  7
  • Sint  · 技术社区  · 14 年前

    How can I use external defines such as LONG_MIN and LONG_MAX in ARM assembler code?

    假设我的手臂。h看起来像这样:

    int my_arm(int foo);
    

    假设我有一个我的主.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));
    ...
    }
    

    我的手臂看起来像这样:

      .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进行编译

    ===========

    更新:感谢您的建议!Unfortunately, I am still having trouble with syntax.

    首先,我制作了一个小头文件mylimits.h(目前与.s目录相同)

    #define MY_LONG_MIN 0x80000000
    

    在我的手臂中,我添加了以下内容:

    ...
    .include "mylimits.h"
    ...
    ldr r7, =MY_LONG_MIN @ when it was working it was ldr r7, =0x80000000
    ...
    

    这种方法有两个问题。

    首先,最大的问题是:我的符号“我的龙民”没有被识别出来……所以有些东西还是不对的。

    第二:语法for.include不允许我包含 <limits.h> ,我不得不在我的极限中加上这个。h,看起来有点笨拙,但我想,没关系:)

    有什么指针吗?

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

    5 回复  |  直到 9 年前
        1
  •  11
  •   James    9 年前

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

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


    5年后编辑:

    注意,armcc v5编译器在Linux下遵循这种行为…但不在窗户上。

        2
  •  2
  •   ShinTakezou    14 年前

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

        3
  •  1
  •   Sint    14 年前

    我最后做的是:

    在MyyMeal.C中

    #include <limits.h>
    ...
    int my_LONG_MAX=LONG_MAX;
    

    然后在我的胳膊上。

    ldr r8, =my_LONG_MAX 
    ldr r10, [r8] 
    

    它看起来很有说服力,而且确实如此(加上在这种方法中可移植性的提高是值得怀疑的)。

    必须有一种方法可以直接在程序集中访问long_max。我很乐意接受这样的回答。

        4
  •  0
  •   old_timer    14 年前

    我已经看到简单地向gcc提供汇编源代码vs gas将允许您在汇编程序中执行类似C的操作。事实上,当你遇到一些情况,你必须使用GCC作为天然气的前端,以获得一些工作,这有点可怕,但那是另一个故事。

        5
  •  0
  •   netawater    9 年前

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

    #include "my_arm.h"
    

    进入我的手臂。

    它适用于Keil Arm