1

以下の.cファイルがあります。

uint8_t buffer[32]

次のこと.Sをしたいファイルがあります。

cpi r29, buffer+sizeof(buffer)

の 2 番目の引数cpiは、位置ではなく即値でなければなりません。しかし、残念ながらsizeof()オペレーターCです。両方のファイルは別々のオブジェクト ファイルにコンパイルされ、後で一緒にリンクされます。

私がそうするavr-objdump -x file.cと、とりわけ、バッファのサイズを取得します。したがって、オブジェクトファイルで既に使用可能です。

コンパイル時にアセンブリ ファイル内のバッファのサイズにアクセスするにはどうすればよいですか?

4

5 に答える 5

2

別のファイルのシンボルのサイズは、リンカーが実行されるまで表示されません。この時点で、アセンブラはすでに終了しています。必要なものを取得する唯一の方法*は、両方のファイルに含まれる定数にすることです。

* アセンブラの即値である必要があると仮定します。

于 2010-02-01T18:52:33.043 に答える
2

単純に配列の長さを a に入れてみませんか#define

#define BUFFER_SIZE 32

ヘッダー ファイルでは、ファイルとファイルの両方で#include( ) を使用します。.includecS

于 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

buffer_endの直後に何らかのラベル (または変数) を確実に配置するように C コンパイラに指示できればuint32_t buffer[32];、アセンブリ言語コードはbuffer_end、リンカーに 2 つの値を不自然に追加させる代わりに、その参照を使用することができます。

ファイルでバッファを定義する場合、そのようなことを行うのは簡単ですが、.Sファイルではそれほど簡単ではありません.c

.oFWIW、ファイルにサイズ情報が含まれている可能性があります。.oシステムの 1 つのバイナリ データを使用して からファイルを生成します。

$ 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、 after を生成する が得られ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ところで、256 バイト以上の SRAM を持つ AVR チップの 1 つを書いている場合、コードはおそらく/マクロを適切に使用してhi816 アドレス ビットすべてをテストする必要があります。

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

それから

cpi r29, buffer+sizeofbuffer

これはうまくいくはずです。

于 2010-02-01T15:43:26.060 に答える