1

我有一个.c包含以下内容的文件。

uint8_t buffer[32]

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

cpi r29, buffer+sizeof(buffer)

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

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

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

4

5 回答 5

2

在链接器运行之前,另一个文件中符号的大小是不可见的;到这个时候,汇编器已经完成了。获得您想要的*的唯一方法是将其设为常量,并包含在两个文件中。

*假设你需要它是一个汇编立即值。

于 2010-02-01T18:52:33.043 回答
2

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

#define BUFFER_SIZE 32

在头文件中,您#include( .include) 在cS文件中。

于 2010-02-01T16:07:34.217 回答
1
uint8_t buffer[32];
const uint8_t* buf_end;
buf_end = buffer+sizeof(buffer);

然后

cpi r29, buf_end
于 2010-02-01T15:43:25.423 回答
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 个地址位。

于 2010-04-04T23:29:10.910 回答
-1
uint32_t sizeofbuffer = sizeof(buffer);

然后

cpi r29, buffer+sizeofbuffer

这应该有效。

于 2010-02-01T15:43:26.060 回答