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)?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage