C unsigned long long e imulq

Como alguien nuevo en el ensamblaje, uso gcc para ingeniería inversa. Pero ahora me encontré con un problema divertido: trato de multiplicar dos enteros de 64 bits para x86-64. El código C tiene el siguiente aspecto:

unsigned long long 
val(unsigned long long a, unsigned long long b){
    return a*b;
}

y compilado con gcc:

val:
    movq    %rdi, %rax
    imulq   %rsi, %rax
    ret

uede ser contradictorio usar la multiplicación con signo para enteros sin signo, pero funciona para C.

Sin embargo, me gustaría verificar la multiplicación por desbordamientos. Ahora, el indicador de desbordamiento se establece si el resultado es mayor que2^63-1 (Supongo que, después de todo, es una multiplicación con signo). Pero para 64 bits sin firmar, esto todavía estaría bien siempre que el resultado no sea mayor que2^64-1.

¿Cuál es la forma correcta de hacer la multiplicación (en conjunto) en este caso?

Respuestas a la pregunta(2)

Su respuesta a la pregunta