; Да се напише подпрограма, която да връща в регистри RDX:RAX частното, а на ; адрес, подаден в [RSP+8], да записва 128-битовия остатък от деленето на ; числото в регистри RCX:RDX:RSI:RDI на числото в регистри R9:R8. option prologue:none, epilogue:none .code ; http://codereview.stackexchange.com/questions/67962 udiv256 proc _udiv256 proc XCHG RAX,RDI XCHG RDX,RSI ;// q = RDX:RAX, r = RCX:RSI SHL RAX,1 ; q = a_lo << 1; RCL RDX,1 ; carry = a_lo >> 127; MOV RDI,RCX ; r = a_hi; // RDI:RSI MOV ECX,128 ;// LOOP изисква броячът да бъде в регистър ECX .repeat RCL RSI,1 ; temp = r >> 127; r = RCL RDI,1 ; r << 1 | carry; carry = temp; .if (carry? || R9 < RDI || equal? && R8 <= RSI);if (!carry) SUB RSI,R8; { if (r < b) goto shift; SBB RDI,R9; carry++; } r -= b; STC ;// Възстанови CF .endif RCL RAX,1 ; shift: temp = q >> 127; q = RCL RDX,1 ; q << 1 | carry; carry = temp; .untilcxz ;// Повтори 128 пъти MOV RCX,[RSP+8] MOV [RCX],RSI ; *rem = r; MOV [RCX+8],RDI RET ; return q; _udiv256 endp udiv256 endp end