C unsigned long long und imulq
Als jemand, der neu in der Montage ist, verwende ich gcc für das Reverse Engineering. Aber jetzt bin ich auf ein witziges Problem gestoßen: Ich versuche, zwei 64-Bit-Ganzzahlen für x86-64 zu multiplizieren. Der C-Code sieht wie folgt aus:
unsigned long long
val(unsigned long long a, unsigned long long b){
return a*b;
}
und mit gcc kompiliert:
val:
movq %rdi, %rax
imulq %rsi, %rax
ret
Die Verwendung der vorzeichenbehafteten Multiplikation für vorzeichenlose Ganzzahlen ist möglicherweise nicht intuitiv, funktioniert jedoch für C.
Ich möchte jedoch die Multiplikation auf Überläufe überprüfen. Jetzt wird das Überlauf-Flag gesetzt, wenn das Ergebnis größer als @ is2^63-1
(Ich denke, weil es immerhin vorzeichenbehaftete Multiplikation ist). Aber für 64bit ohne Vorzeichen wäre dies immer noch OK, solange das Ergebnis nicht größer als @ is2^64-1
.
Was ist in diesem Fall die richtige Methode zur Multiplikation (in Assembly)?