QQ2976501934
Joined: 06 Jul 2021
Posts: 3
|
32-bit x86 assembly:
ExtDivision:
; ptDivisible at ebp+8
; cnDivisible at ebp+12
; ptDivisor at ebp+16
; cnDivisor at ebp+20
; ptResult at ebp+24
; cnResult at ebp+28
; ptRemainder at ebp+32
; cnRemainder at ebp+36
push ebp
mov ebp, esp
push edi
push esi
push ebx
sub esp, 8
mov esi, [ebp+16]
mov ebx, [ebp+20]
.L1:
mov eax, [esi+ebx*4-4]
bsr edx, eax
jnz .L2
dec ebx
jnz .L1
jmp .L14
.L2:
mov edi, [ebp+8]
xor eax, eax
mov ecx, [ebp+12]
lea edi, [edi+ecx*4-4]
std
repz scasd
cld
jz .L16
inc ecx
mov [ebp+12], ecx
mov [ebp+20], ebx
mov ecx, 31
xor ecx, edx
mov edx, [ebp+12]
lea edx, [edx*4]
lea eax, [edx+ebx*4+4]
sub esp, eax
lea edx, [esp+edx+4]
mov [ebp-16], edx
mov [ebp-20], ecx
mov edi, [ebp+8]
mov ebx, [ebp+12]
xor eax, eax
.L3:
mov edx, [edi+ebx*4-4]
shld eax, edx, cl
mov [esp+ebx*4], eax
mov eax, edx
dec ebx
jnz .L3
shl eax, cl
mov [esp], eax
mov edi, [ebp-16]
mov ebx, [ebp+20]
mov eax, [esi+ebx*4-4]
dec ebx
jz .L5
.L4:
mov edx, [esi+ebx*4-4]
shld eax, edx, cl
mov [edi+ebx*4], eax
mov eax, edx
dec ebx
jnz .L4
.L5:
shl eax, cl
mov [edi], eax
mov [ebp+8], esp
mov [ebp+16], edi
mov eax, [ebp+12]
mov ebx, [ebp+20]
sub eax, ebx
jc .L15
mov [ebp-16], eax
mov ebx, [edi+ebx*4-4]
inc ebx
jz .L6
xor eax, eax
xor edx, edx
sub edx, ebx
div ebx
mov ebx, eax
.L6:
mov edx, [ebp-16]
mov ecx, [ebp+28]
sub ecx, edx
jbe .L7
xor eax, eax
mov edi, [ebp+24]
lea edi, [edi+edx*4]
rep stosd
.L7:
mov esi, [ebp+16]
mov edi, [ebp+8]
lea edi, [edi+edx*4]
mov ecx, [ebp+20]
call ExtGetQuotient
mov ecx, [ebp-16]
cmp ecx, [ebp+28]
jae .L8
mov edi, [ebp+24]
mov [edi+ecx*4], eax
.L8:
mov edx, [ebp-16]
sub edx, 1
mov [ebp-16], edx
jnc .L7
.L9:
mov eax, [ebp+36]
test eax, eax
jz .L13
mov esi, [ebp+8]
mov edi, [ebp+32]
mov ecx, [ebp-20]
push ebp
mov ebx, 1
mov edx, [esi]
mov ebp, [ebp+20]
cmp eax, ebp
jbe .L10
mov ebp, eax
.L10:
cmp ebx, ebp
je .L12
.L11:
mov eax, [esi+ebx*4]
shrd edx, eax, cl
mov [edi+ebx*4-4], edx
mov edx, eax
inc ebx
cmp ebx, ebp
jne .L11
.L12:
shr edx, cl
mov [edi+ebx*4-4], edx
pop ebp
mov ecx, [ebp+36]
sub ecx, ebx
jbe .L13
xor eax, eax
lea edi, [edi+ebx*4]
rep stosd
.L13:
mov eax, 1
.L14:
lea esp, [ebp-12]
pop ebx
pop esi
pop edi
pop ebp
ret
.L15:
xor eax, eax
mov edi, [ebp+24]
mov ecx, [ebp+28]
rep stosd
jmp .L9
.L16:
xor eax, eax
mov edi, [ebp+24]
mov ecx, [ebp+28]
rep stosd
mov edi, [ebp+32]
mov ecx, [ebp+36]
rep stosd
jmp .L13
ExtGetQuotient:
push ebx
push ebp
push 0
push ecx
.L21:
mov ebp, [edi+ecx*4]
test ebp, ebp
jz .L24
mov eax, [esp+12]
mul ebp
add ebp, edx
.L22:
xor ebx, ebx
xor ecx, ecx
.L23:
mov eax, [esi+ecx*4]
mul ebp
add eax, ebx
adc edx, 0
sub [edi+ecx*4], eax
adc edx, 0
mov ebx, edx
inc ecx
cmp ecx, [esp]
jb .L23
sub [edi+ecx*4], edx
add [esp+4], ebp
jmp .L21
.L24:
mov eax, [esp+4]
mov ebx, ecx
.L25:
sub ecx, 1
jc .L26
mov edx, [edi+ecx*4]
cmp edx, [esi+ecx*4]
je .L25
jb .L28
.L26:
xor ecx, ecx
xor edx, edx
.L27:
add edx, edx
mov edx, [esi+ecx*4]
sbb [edi+ecx*4], edx
sbb edx, edx
inc ecx
cmp ebx, ecx
jnz .L27
inc eax
jmp .L25
.L28:
add esp, 8
pop ebp
pop ebx
ret
64-bit x86 assembly:
ExtDivision:
; ptDivisible at rbp+16
; cnDivisible at rbp+24
; ptDivisor at rbp+32
; cnDivisor at rbp+40
; ptResult at rbp+48
; cnResult at rbp+56
; ptRemainder at rbp+64
; cnRemainder at rbp+72
mov [rsp+8], rcx
mov [rsp+16], rdx
mov [rsp+24], r8
mov [rsp+32], r9
push rbp
mov rbp, rsp
push rdi
push rsi
push rbx
sub rsp, 16
mov rsi, r8
mov rbx, r9
.L1:
mov rax, [rsi+rbx*8-8]
bsr rdx, rax
jnz .L2
dec rbx
jnz .L1
jmp .L14
.L2:
mov rdi, [rbp+16]
xor eax, eax
mov rcx, [rbp+24]
lea rdi, [rdi+rcx*8-8]
std
repz scasq
cld
jz .L16
inc rcx
mov [rbp+24], rcx
mov [rbp+40], rbx
mov ecx, 63
xor ecx, edx
mov rdx, [rbp+24]
lea rdx, [rdx*8]
lea rax, [rdx+rbx*8+8]
sub rsp, rax
lea rdx, [rsp+rdx+8]
mov [rbp-32], rdx
mov [rbp-40], rcx
mov rdi, [rbp+16]
mov rbx, [rbp+24]
xor eax, eax
.L3:
mov rdx, [rdi+rbx*8-8]
shld rax, rdx, cl
mov [rsp+rbx*8], rax
mov rax, rdx
dec rbx
jnz .L3
shl rax, cl
mov [rsp], rax
mov rdi, [rbp-32]
mov rbx, [rbp+40]
mov rax, [rsi+rbx*8-8]
dec rbx
jz .L5
.L4:
mov rdx, [rsi+rbx*8-8]
shld rax, rdx, cl
mov [rdi+rbx*8], rax
mov rax, rdx
dec rbx
jnz .L4
.L5:
shl rax, cl
mov [rdi], rax
mov [rbp+16], rsp
mov [rbp+32], rdi
mov rax, [rbp+24]
mov rbx, [rbp+40]
sub rax, rbx
jc .L15
mov [rbp-32], rax
mov rbx, [rdi+rbx*8-8]
inc rbx
jz .L6
xor eax, eax
xor edx, edx
sub rdx, rbx
div rbx
mov rbx, rax
.L6:
mov rdx, [rbp-32]
mov rcx, [rbp+56]
sub rcx, rdx
jbe .L7
xor eax, eax
mov rdi, [rbp+48]
lea rdi, [rdi+rdx*8]
rep stosq
.L7:
mov rsi, [rbp+32]
mov rdi, [rbp+16]
lea rdi, [rdi+rdx*8]
mov rcx, [rbp+40]
call ExtGetQuotient
mov rcx, [rbp-32]
cmp rcx, [rbp+56]
jae .L8
mov rdi, [rbp+48]
mov [rdi+rcx*8], rax
.L8:
mov rdx, [rbp-32]
sub rdx, 1
mov [rbp-32], rdx
jnc .L7
.L9:
mov rax, [rbp+72]
test rax, rax
jz .L13
mov rsi, [rbp+16]
mov rdi, [rbp+64]
mov rcx, [rbp-40]
mov ebx, 1
mov rdx, [esi]
mov r10, [rbp+40]
cmp rax, r10
jbe .L10
mov r10, rax
.L10:
cmp rbx, r10
je .L12
.L11:
mov rax, [rsi+rbx*8]
shrd rdx, rax, cl
mov [rdi+rbx*8-8], rdx
mov rdx, rax
inc rbx
cmp rbx, r10
jne .L11
.L12:
shr rdx, cl
mov [rdi+rbx*8-8], rdx
mov rcx, [rbp+72]
sub rcx, rbx
jbe .L13
xor eax, eax
lea rdi, [rdi+rbx*8]
rep stosq
.L13:
mov eax, 1
.L14:
lea rsp, [rbp-24]
pop rbx
pop rsi
pop rdi
pop rbp
ret
.L15:
xor eax, eax
mov rdi, [rbp+48]
mov rcx, [rbp+56]
rep stosq
jmp .L9
.L16:
xor eax, eax
mov rdi, [ebp+48]
mov rcx, [ebp+56]
rep stosq
mov rdi, [ebp+64]
mov rcx, [ebp+72]
rep stosq
jmp .L13
ExtGetQuotient:
push rbx
push 0
push rcx
.L21:
mov r10, [rdi+rcx*8]
test r10, r10
jz .L24
mov rax, [rsp+16]
mul r10
add r10, rdx
.L22:
xor ebx, ebx
xor ecx, ecx
.L23:
mov rax, [rsi+rcx*8]
mul r10
add rax, rbx
adc rdx, 0
sub [rdi+rcx*8], rax
adc rdx, 0
mov rbx, rdx
inc rcx
cmp rcx, [rsp]
jb .L23
sub [rdi+rcx*8], rdx
add [rsp+8], r10
jmp .L21
.L24:
mov rax, [rsp+8]
mov rbx, rcx
.L25:
sub rcx, 1
jc .L26
mov rdx, [rdi+rcx*8]
cmp rdx, [rsi+rcx*8]
je .L25
jb .L28
.L26:
xor ecx, ecx
xor edx, edx
.L27:
add rdx, rdx
mov rdx, [rsi+rcx*8]
sbb [rdi+rcx*8], rdx
sbb rdx, rdx
inc rcx
cmp rbx, rcx
jnz .L27
inc rax
jmp .L25
.L28:
add rsp, 16
pop rbx
ret
Last edited by QQ2976501934 on 18 Dec 2021, 11:21; edited 7 times in total
|