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

如何将C全局数组的大小放入为用GCC编译的AVR体系结构编写的汇编程序中?

  •  1
  • johannes  · 技术社区  · 16 年前

    我有一个 .c 用以下文件归档。

    uint8_t buffer[32]
    

    我有一个 .S 我要在其中执行以下操作的文件。

    cpi r29, buffer+sizeof(buffer)
    

    第二个论点 cpi 必须是立即值,而不是位置。但不幸的是 sizeof() 是一个 C 接线员。两个文件都被编译成独立的对象文件,然后链接在一起。

    如果我做了 avr-objdump -x file.c ,除此之外,我还得到了缓冲区的大小。因此它已经在对象文件中可用。

    如何在编译时访问程序集文件中缓冲区的大小?

    5 回复  |  直到 14 年前
        1
  •  2
  •   bluebrother    16 年前

    为什么不简单地将数组的长度放入 #define --即使用

    #define BUFFER_SIZE 32
    

    在头文件中 #include ( .include )在两个 c S 文件。

        2
  •  2
  •   Eric Seppanen    16 年前

    在链接器运行之前,另一个文件中符号的大小将不可见;此时汇编程序已经完成。得到你想要的*的唯一方法是使它成为一个常量,包含在两个文件中。

    *假设您需要它是汇编器即时值。

        3
  •  1
  •   SF.    16 年前
    uint8_t buffer[32];
    const uint8_t* buf_end;
    buf_end = buffer+sizeof(buffer);
    

    然后

    cpi r29, buf_end
    
        4
  •  0
  •   ndim    16 年前

    如果你能告诉你的C编译器可靠地放置一些标签(或变量) buffer_end 紧接着 uint32_t buffer[32]; ,您的汇编语言代码可以使用 缓冲区端 引用而不是笨拙地让链接器添加两个值。

    如果将缓冲区定义为 .S 文件,但在 .c 文件。

    FWIW,可能是 .o 文件包含一些大小信息。我生成一个 .o.号 中的文件,其中包含我的某个系统的二进制数据:

    $ avr-objcopy -B avr -I binary -O elf32-avr --readonly-text --rename-section .data=.text,contents,alloc,load,readonly,code foo.bin foo.o
    

    这给了我一个 foo.o 它在 nm foo.o :

    00000c00 T _binary_foo_bin_end
    00000c00 A _binary_foo_bin_size
    00000000 T _binary_foo_bin_start
    

    类型 _binary_foo_bin_size 如果它能适应你的情况,也许是有用的-如果你确实需要的大小超过 缓冲区端 毕竟是标签。

    顺便说一下,如果您正在为一个具有256字节以上SRAM的AVR芯片编写代码,那么您的代码可能需要正确使用 lo8 / hi8 宏来测试所有16个地址位。

        5
  •  -1
  •   Pod    16 年前
    uint32_t sizeofbuffer = sizeof(buffer);
    

    然后

    cpi r29, buffer+sizeofbuffer
    

    这应该管用。