Mir wurde eine Aufgabe zugewiesen, die theoretisch nicht zu schwer ist. Eine C-Variable sollte mit Assembler-Code (asm) geändert werden. Ich habe dies getan und es funktioniert, aber der zweite Teil der Aufgabe ist, das gleiche ohne Platzhalter (%) zu tun.Assembler in C ohne Platzhalter verwenden
Ich bin hier ratlos und nach einigen Recherchen habe ich noch keine Lösung gefunden. Wie kann ich auf C-Variablen im Assembler-Code zugreifen oder diese manipulieren, ohne Platzhalter zu verwenden, um die Variable zu erhalten?
Hier ist der Code mit Platzhalter:
volatile uint8_t number = 1;
volatile uint8_t *number_pointer = &number;
asm volatile(
"ld r20, %a0" "\n\t"
"lsl r20" "\n\t"
"st %a0, r20" "\n\t"
"breq resetten" "\n\t"
"ret" "\n\t"
"resetten:" "\n\t"
"ldi r20, 1" "\n\t"
"st %a0, r20"
: "+e" (number_pointer)
);
Kurz gesagt: Wie kann ich auf und ändern "number_pointer" ohne% mit? (Der Code verdoppelt "Zahl", bis es 128 ist, dann beginnt es wieder mit 1.)
Wenn die zu ändernde Variable lokal (auf dem Stapel) ist, können Sie compilerabhängige Annahmen darüber machen, wo sich die Variable im Speicher befindet, relativ zum Stapelzeiger. –
Sie sollen ein zweites ':' hinzufügen, um Variablen in Register einzutragen (wie 'asm (" blabla "::" a "(number_pointer));), das würde aber number_pointer in eax ... aber verwenden AT & T-Syntax würden Sie immer '%% eax' verwenden, um darauf zuzugreifen. Wenn die Anforderung nicht '%' verwendet (wie Sie am Ende andeuten), dann funktioniert das nicht ... wenn die Anforderung nicht __placeholders__ verwendet, dann würde das passieren (Sie würden ein Register verwenden). – Jcl
Wie wäre es, number_pointer als statisch oder global zu deklarieren? Dann können Sie direkt von der ASM über den Symbolnamen darauf zugreifen. Ich würde es nicht für Produktionscode empfehlen, aber für das Lösen von Rätseln sollte es funktionieren. –