C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
деление
развлекал себя по теме деления столбиком, получилась такя порнушка:
Код:
?Div@XInt@Calc@@CAIPEAIPEBI0@Z PROC
PUSH r15
PUSH r14
PUSH r13
PUSH r12
PUSH rsi
PUSH rdi
XOR r15, r15
DEC r15
SHL r15, 27
ROL r15, 5
MOV rsi, rcx
MOV rdi, rdx
MOV r12, [rsi]
MOV r13, [rdi]
MOV r10d, r12d
MOV r11d, r13d
LEA rsi, [rsi+r10*4+16]
LEA rdi, [rdi+r11*4+16]
MOV r9d, r10d
SUB r9d, r11d
ROR r12, 32
ROR r13, 32
MOV r10d, r9d
SHL r10, 5
MOV eax, r12d
ADD r10, rax
MOV eax, r13d
SUB r10, rax
MOV rax, r10
AND r10d, r15d
SHR rax, 5
XOR rdx, rdx
SUB edx, r10d
MOV [r8], eax
ADC DWORD PTR [r8], 0
LEA r8, [r8+rax*4+16]
SHL rax, 32
OR r10, rax
XOR r9, r9
MOV rax, 2
align 16
do_compare:
MOV r11, r13
MOV r14, r12
SHR r11, 32
SHR r14, 32
INC r11d
SUB rsi, rdi
MOV ecx, r12d
SUB ecx, r13d
JS bcmp_l
DEC r11d
SUB rdi, 4
ADD rsi, 4
MOV edx, [rsi+rdi-4]
SHR edx, cl
XOR edx, [rdi]
JNZ cmp_out
bcmp_l:
AND ecx, r15d
align 16
cmp_loop:
SUB rdi, 4
DEC r11d
JZ cmp_eq
MOV rdx, [rsi+rdi-4]
SHR rdx, cl
XOR edx, [rdi]
JZ cmp_loop
cmp_out:
XOR rax, rax
MOV rdx, [rsi+rdi-4]
SHR rdx, cl
SUB edx, [rdi]
ADC rax, 0
align 16
cmp_eq:
CMP rax, 1
JNZ do_sub
DEC ecx
AND ecx, r15d
SUB r10, 1
ADC r10, 0
JC itis_done
DEC r12
TEST r10d, r10d
JNS do_sub
AND r10, r15
MOVNTI [r8], r9d
SUB r8, 4
XOR r9d, r9d
align 16
do_sub:
BTS r9d, r10d
NEG r11
LEA rdi, [rdi+r11*4]
MOV r11, r13
SHR r11, 32
MOV eax, [rsi+rdi]
MOV edx, [rdi+4]
SHL edx, cl
SUB rax, rdx
MOV [rsi+rdi], eax
ADD rdi, 4
XOR ecx, r15d
INC ecx
DEC r11d
JZ after_sub
align 16
sub_loop:
SHR rax, 32
MOV edx, [rsi+rdi]
ADD rax, rdx
MOV rdx, [rdi]
SHR rdx, cl
SUB rax, rdx
MOV [rsi+rdi], eax
ADD rdi, 4
DEC r11d
JNZ sub_loop
align 16
after_sub:
DEC ecx
CMP r13d, ecx
JB sub_complete
INC ecx
SHR rax, 32
ADD eax, [rsi+rdi]
MOV edx, [rdi]
SHR edx, cl
SUB eax, edx
MOV [rsi+rdi], eax
ADD rsi, 4
sub_complete:
ADD rsi, rdi
ADD rdi, 4
XOR rax, rax
INC r14d
align 16
zero_loop:
SUB rsi, 4
DEC r14d
JZ itis_done
CMP eax, [rsi]
JZ zero_loop
BSR eax, [rsi]
ADD rsi, 4
SHL r14, 32
OR r14, rax
MOV rax, r12
MOV r12, r14
SUB rax, r14
JZ do_compare
AND rax, r15
CMP r10, rax
JB itis_done
SUB r10, rax
SHR rax, 32
TEST r10d, r10d
JNS no_left
AND r10, r15
JMP do_ofl
no_left:
SUB eax, 1
ADC eax, 0
JZ do_compare
do_ofl:
MOVNTI [r8], r9d
SUB r8, 4
XOR r9, r9
TEST eax, eax
JZ do_compare
align 16
clear_loop:
MOVNTI [r8], r9d
SUB r8, 4
DEC eax
JNZ clear_loop
JMP do_compare
align 16
itis_done:
MOVNTI [r8], r9d
SUB r8, 4
XOR r9, r9
SHR r10, 32
JZ no_tail
align 16
tail_loop:
MOVNTI [r8], r9d
SUB r8, 4
DEC r10d
JNZ tail_loop
no_tail:
POP rdi
POP rsi
POP r12
POP r13
POP r14
POP r15
RET
?Div@XInt@Calc@@CAIPEAIPEBI0@Z ENDP
объявлено так:
Код:
class XInt {
/*
layout:
DWORD_0: number size in DWORDs
DWORD_1: most significant DWORD most significant on-bit index
DWORD_2: _reserved_
DWORD_3: reserved DWORD count minus 4
DWORD_4:
... number
... ...
*/
private:
....
static unsigned int Div(unsigned int * dividend, const unsigned int * divisor, unsigned int * quotient); // on completion the remainder is in dividend
....
pbublic:
}
теперь сижу и думаю, есть ли в делении что-нибудь кроме деления в столбик?
|