Ich habe zwei Makros, eines ist in Assembly und das andere in C geschrieben. Das zweite Makro verwendet das erste Makro. Allerdings möchte ich auch das zweite Makro in Assembly mit volatile schreiben, damit ich seine Platzierung im Code steuern kann. Bitte beachten Sie, dass tid ein Laufzeitwert ist, keine Konstante wie n .
Was ist eine gute Möglichkeit, das in Assembly zu schreiben? Ist es auch möglich, die Platzierung einer C-Code-ähnlichen Baugruppe mit flüchtigen Werten zu steuern?
%Vor% Sie können gcc fragen, wie Sie Ihren Code in Assembly schreiben: gcc -S foo.c
oder gcc -Wa,-alh=foo.s -c foo.c
. Vielleicht möchten Sie die Ergebnisse natürlich verbessern. Sie müssen ein wenig mehr tun: Verwenden Sie %0
für den Parameter, den Sie für den Assembly-Chunk übergeben, und deklarieren Sie die Register, die Sie verfallen haben. Nachschlagen Assembler-Anweisungen mit C-Ausdruck-Operanden im GCC-Handbuch wenn Sie nicht vertraut sind. So könnte das aussehen (Warnung, direkt in den Browser eingegeben und die x86 Assembly-Syntax nicht wirklich kennen).
Bei einer schickeren Methode würde man herausfinden, wie viele Bytes jeder movq
- movq
- jmp
Block benötigt (Anmerkung: Ich habe nicht überprüft, ich benutze 8) und einen berechneten Sprung hinein mache; etwas wie
Angenommen, Sie verwenden GCC, könnten Sie versuchen, eine GNU-Erweiterung zu verwenden, um das Stapelzeigerregister einer C-Variablen zuzuordnen:
%Vor%OK, das tut wahrscheinlich nicht, was Ihr ursprünglicher Code getan hat (es war mir nicht klar, was das Ziel war), aber Sie sollten in der Lage sein, den Rest daraus herauszufinden.
Ich denke, dass ich die Syntax richtig verstanden habe, aber entschuldige mich wenn nicht. Ich weiß, das funktioniert für allgemeine Register, und ich bin ziemlich zuversichtlich, dass GCC weiß, was man für spezielle Register macht, aber man weiß es nie.
Ich hoffe, das hilft.