Es gibt wirklich keine saubere und tragbare Art und Weise. Die meisten Projekte, die ich gesehen habe, haben einen Build-Schritt, der eine Header-Datei mit Struktur-Offsets generiert. Es geht ein wenig so etwas wie dieses:
1) eine C-Datei erstellen, die Ihre Offsets
#include "mystruct.h"
#define DECLARE(SYM,VAL) \
__asm("__AS_DEFINE__ " SYM "\t%0" : : "n" ((unsigned long)(VAL)))
void foo(void)
{
// mystruct.h
DECLARE("MYSTRUCT_B", offsetof(struct mystruct, b));
}
2) mit dem Flag kompilieren, die Datei definiert Assembly zu generieren (-S auf Clang oder GCC).
__AS_DEFINE__ MYSTRUCT_B #4
3) Verwenden Sie einige Shell-Tricks zu drehen, diese in eine Header-Datei für die Assembly-Code: Dies wird eine Baugruppendatei mit einem Bündel von definierten Linien wie zu schaffen.
grep '__AS_DEFINE__' offsets.s | sed 's/#//g' | sed 's/__AS_DEFINE__/#define/g' > build/include/offsets.h
Dies ergibt eine Datei, die so aussieht und in Ihre Baugruppenquellen aufgenommen werden kann.
#define MYSTRUCT_B 4
Sie können dann direkt verwenden.
#include "offsets.h"
ldr r1, [r2, #MYSTRUCT_B]
Gut geschriebene Versammlung ist, ja. –
@Claris Lesbarkeit ist nicht binär. Sicherlich ist ein Assemblercode besser lesbar als andere. – delnan
Viel besser: Schreiben Sie C, verwenden Sie z.B. Inline-Assembly von GCC zum Einbetten von Assembly-Snippets. ARM wird nicht ewig dauern ... – vonbrand