Ich schreibe ein Kryptographieprogramm, und der Kern (eine breite Multiplikationsroutine) ist in x86-64-Assembler geschrieben, sowohl wegen der Geschwindigkeit als auch weil es Anweisungen wie z adc
die von C aus nicht leicht zugänglich sind. Ich möchte diese Funktion nicht einbetten, weil sie groß ist und mehrmals in der inneren Schleife aufgerufen wird.
Idealerweise möchte ich auch eine benutzerdefinierte Aufrufkonvention für diese Funktion definieren, da sie intern alle Register verwendet (außer rsp
), überschreibt seine Argumente nicht und gibt in Registern zurück. Im Moment ist es an die C-Aufrufkonvention angepasst, aber das macht es natürlich langsamer (um etwa 10%).
Um dies zu vermeiden, kann ich es mit aufrufen asm("call %Pn" : ... : my_function... : "cc", all the registers);
aber gibt es eine Möglichkeit, GCC mitzuteilen, dass die Aufrufanweisung den Stack durcheinander bringt? Andernfalls setzt GCC all diese Register einfach in den roten Bereich, und das oberste wird platt gemacht. Ich kann das gesamte Modul mit -mno-red-zone kompilieren, aber ich würde es vorziehen, GCC mitzuteilen, dass beispielsweise die obersten 8 Bytes der roten Zone überschrieben werden, damit dort nichts abgelegt wird.
Nur eine ungetestete, aber können Sie nicht einfach eine zusätzliche Dummy-Eingabe angeben, sodass GCC sie in den roten Bereich versetzt und (harmlos) verprügelt wird?
– Toni Delroy
17. Juni 2011 um 5:55 Uhr
Hm. Vermutlich nicht zuverlässig. Ich habe festgestellt, dass es ziemlich schwierig ist, zu kontrollieren, was GCC wann und wo auf den Stack überträgt. Bei anderem Krypto-Zeug, das ich geschrieben habe, habe ich mit gemischtem Erfolg versucht, die Tendenz von GCC zu unterdrücken, zB ganze Schlüsseltabellen ohne Grund auf den Stack zu schreiben.
– Michael Hamburg
18. Juni 2011 um 7:49 Uhr
Hinzufügen
sp
als Klamotten? Einen Speicher-Clobber hinzufügen?– tc.
22. März 2013 um 16:55 Uhr
Wie wäre es, wenn Sie die Krypto-Routine als Makro definieren (unter Verwendung von Top-Level-Asm am Anfang der Datei)? Wenn Sie es dann aufrufen (im Gegensatz zu
call
ing) von mehreren Stellen innerhalb Ihres C-Codes über erweitertes asm ist etwas weniger schrecklich (obwohl es die ausführbare Datei aufbläht). Sie können immer noch alle Register überschreiben, aber der Stack ist davon nicht betroffen. Übrigens, woher weiß die Krypto, was sie verschlüsseln soll? Der Zugriff auf Globals über Inline kann schwierig sein. Auch Clobbering SP hat Kein Effekt.– David Wohlferd
27. Juni 2016 um 1:41 Uhr