fork download
  1. program mulmod;
  2. {$IF Defined(FPC)}{$MODE Delphi}{$ASMMODE Intel}{$ENDIF}
  3.  
  4. function MulModASM(a, b, m: UInt64): UInt64;
  5. {$ifdef FPC}nostackframe; assembler; asm {$else} asm .noframe {$endif FPC}
  6. MOV RAX, a
  7. MOV RCX, m
  8. MUL b // Unsigned multiply (RDX:RAX ← RAX ∗ b)
  9. DIV RCX // Unsigned divide RDX:RAX by RCX, with result stored in RAX ← Quotient, RDX ← Remainder
  10. MOV RAX, RDX
  11. end;
  12.  
  13. var
  14. a, b, m: UInt64;
  15.  
  16. begin
  17. m := $FFFFFFFFFFFFFFFF;
  18. a := 3;
  19. b := m - 1;
  20. WriteLn(a, ' ', b, ' ', m);
  21. WriteLn(' ASM - ', MulModASM(a, b, m));
  22. WriteLn('Pascal - ', (a * b) mod m);
  23. end.
Success #stdin #stdout 0s 4380KB
stdin
Standard input is empty
stdout
3 18446744073709551614 18446744073709551615
   ASM - 18446744073709551612
Pascal - 18446744073709551610