我有一个.c
文件,内容如下。
uint8_t buffer[32]
我有一个.S
文件,我想要执行以下操作。
cpi r29, buffer+sizeof(buffer)
cpi
的第二个参数必须是立即值,而不是位置。但遗憾的是sizeof()
是C
运营商。这两个文件都被编译为单独的目标文件,然后链接在一起。
如果我做avr-objdump -x file.c
,除其他外,我得到缓冲区的大小。因此它已在目标文件中可用。
如何在编译时访问程序集文件中的缓冲区大小?
答案 0 :(得分:2)
为什么不简单地将数组的长度放入#define
- 即只使用
#define BUFFER_SIZE 32
在#include
和.include
文件中的c
(S
)标题文件中。
答案 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
标签。
lo8
/ hi8
宏来测试所有16个地址位。
答案 4 :(得分:-1)
uint32_t sizeofbuffer = sizeof(buffer);
然后
cpi r29, buffer+sizeofbuffer
这应该有效。