如何将C全局数组的大小转换为为使用GCC编译的AVR架构编写的汇编程序?

时间:2010-02-01 15:40:24

标签: c gcc assembly sizeof avr

我有一个.c文件,内容如下。

uint8_t buffer[32]

我有一个.S文件,我想要执行以下操作。

cpi r29, buffer+sizeof(buffer)

cpi的第二个参数必须是立即值,而不是位置。但遗憾的是sizeof()C运营商。这两个文件都被编译为单独的目标文件,然后链接在一起。

如果我做avr-objdump -x file.c,除其他外,我得到缓冲区的大小。因此它已在目标文件中可用。

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

5 个答案:

答案 0 :(得分:2)

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

#define BUFFER_SIZE 32

#include.include文件中的cS)标题文件中。

答案 1 :(得分:2)

在链接器运行之前,另一个文件中的符号大小将不可见;到这个时候汇编程序已经完成了。获得你想要的东西的唯一方法是将它变成一个常数,包含在两个文件中。

*假设您需要它是汇编程序的直接值。

答案 2 :(得分:1)

uint8_t buffer[32];
const uint8_t* buf_end;
buf_end = buffer+sizeof(buffer);

然后

cpi r29, buf_end

答案 3 :(得分:0)

如果您可以告诉C编译器在buffer_end之后立即可靠地放置一些标签(或变量)uint32_t buffer[32];,那么汇编语言代码可以只使用buffer_end引用而不是笨拙让链接器添加两个值。

如果您在.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的类型如果可以适应您的情况可能会有用 - 如果您确实需要大小超过buffer_end标签。

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

答案 4 :(得分:-1)

uint32_t sizeofbuffer = sizeof(buffer);

然后

cpi r29, buffer+sizeofbuffer

这应该有效。