aktuell gibt es ja so eine Art "C-Backend" Hype, daher möchte ich auch ein paar meiner Prozeduren ASM-frei machen.
In einem Programm benötige ich die Operation: X = (A * B) mod C, wobei X, A, B und C Quads sein müssen.
In Assembler mache ich das über MUL und DIV, die ja mit 128 bit klar kommen, weil sie zwei Register nutzen.
Code: Alles auswählen
Procedure.q MulMod(Factor1.q, Factor2.q, Mod.q)
! MOV rax, [p.v_Factor1]
! MUL qword [p.v_Factor2] ; RDX:RAX = Factor1 * Factor2
! CMP rdx, qword [p.v_Mod]
! JB @F
! MOV rcx, rax ; RCX = RAX
! MOV rax, rdx ; RAX = RDX
! MOV rdx, 0
! DIV qword [p.v_Mod] ; RDX = RAX % Mod
! MOV rax, rcx ; RAX = RCX
! @@:
! DIV qword [p.v_Mod] ; RDX = RDX:RAX % Mod
! MOV rax, rdx
ProcedureReturn
EndProcedure
Debug MulMod(210987654321, 210987654321, 170)