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.
cHJvZ3JhbSBtdWxtb2Q7CnskSUYgRGVmaW5lZChGUEMpfXskTU9ERSBEZWxwaGl9eyRBU01NT0RFIEludGVsfXskRU5ESUZ9CgpmdW5jdGlvbiBNdWxNb2RBU00oYSwgYiwgbTogVUludDY0KTogVUludDY0Owp7JGlmZGVmIEZQQ31ub3N0YWNrZnJhbWU7IGFzc2VtYmxlcjsgYXNtIHskZWxzZX0gYXNtIC5ub2ZyYW1lIHskZW5kaWYgRlBDfQogIE1PViBSQVgsIGEKICBNT1YgUkNYLCBtCiAgTVVMIGIgICAgLy8gVW5zaWduZWQgbXVsdGlwbHkgKFJEWDpSQVgg4oaQIFJBWCDiiJcgYikKICBESVYgUkNYICAvLyBVbnNpZ25lZCBkaXZpZGUgUkRYOlJBWCBieSBSQ1gsIHdpdGggcmVzdWx0IHN0b3JlZCBpbiBSQVgg4oaQIFF1b3RpZW50LCBSRFgg4oaQIFJlbWFpbmRlcgogIE1PViBSQVgsIFJEWAplbmQ7Cgp2YXIKICBhLCBiLCBtOiBVSW50NjQ7CgpiZWdpbgogIG0gOj0gJEZGRkZGRkZGRkZGRkZGRkY7CiAgYSA6PSAzOwogIGIgOj0gbSAtIDE7CiAgV3JpdGVMbihhLCAnICcsIGIsICcgJywgbSk7CiAgV3JpdGVMbignICAgQVNNIC0gJywgTXVsTW9kQVNNKGEsIGIsIG0pKTsKICBXcml0ZUxuKCdQYXNjYWwgLSAnLCAoYSAqIGIpIG1vZCBtKTsgIAplbmQu