I converted it to intel syntax.
mov esi, y_low
mov eax, x
mov edx, eax
sar edx, 31
mov ecx, y_high
imul ecx, eax ; ecx = y_high *{signed} x
mov ebx, edx
imul ebx, esi ; ebx = sign_extension(x) *{signed} y_low
add ecx, ebx ; ecx = y_high *{signed} x_low + x_high *{signed} y_low
mul esi ; edx:eax = x_low *{unsigned} y_low
lea edx, [ecx + edx] ; edx = high(x_low *{unsigned} y_low + y_high *{signed} x_low + x_high *{signed} y_low)
mov ecx, dest
mov [ecx], eax
mov [ecx + 4], edx
, , - 2 64- , 64 .
64- ? x 32 64. sar x's edx. x's x_high. x_low - x, .
y_low y_high y, x's x_low x_high.
:
product = y * {signed} x=
(y_high * 2 32 + y_low) * {signed} (x_high * 2 32 + x_low) =
y_high * {signed} x_high * 2 64 +
y_high * {signed} x_low * 2 32 +
y_low * {signed} x_high * 2 32 +
y_low * {signed} x_low
y_high * {signed} x_high * 2 64 , 64 . , 128- ( 96- ).
y_low * {signed} x_low . , 2 , . :
-1 * {signed} -1 = 1
0xFFFFFFFFFFFFFFFF * {unsigned} 0xFFFFFFFFFFFFFFFF = 0xFFFFFFFFFFFFFFFE0000000000000001 (64 1)