program mulmod;
{$IF Defined(FPC)}{$MODE Delphi}{$ASMMODE Intel}{$ENDIF}

function MulModASM(a, b, m: UInt64): UInt64;
{$ifdef FPC}nostackframe; assembler; asm {$else} asm .noframe {$endif FPC}
  MOV RAX, a
  MOV RCX, m
  MUL b    // Unsigned multiply (RDX:RAX ← RAX ∗ b)
  DIV RCX  // Unsigned divide RDX:RAX by RCX, with result stored in RAX ← Quotient, RDX ← Remainder
  MOV RAX, RDX
end;

var
  a, b, m: UInt64;

begin
  m := $FFFFFFFFFFFFFFFF;
  a := 3;
  b := m - 1;
  WriteLn(a, ' ', b, ' ', m);
  WriteLn('   ASM - ', MulModASM(a, b, m));
  WriteLn('Pascal - ', (a * b) mod m);  
end.