Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2014, 18:24   #1
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 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:

}
теперь сижу и думаю, есть ли в делении что-нибудь кроме деления в столбик?
f.hump вне форума Ответить с цитированием
Старый 11.01.2014, 03:54   #2
litrovith
Пользователь
 
Регистрация: 15.07.2008
Сообщений: 28
По умолчанию

( обнадёжил, я ожидал что дальше будет фото, видео, думал передёрнуть затвор, а тут одни буквы и цифры, обманщик!
litrovith вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Деление atenon Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 18.10.2012 19:43
Деление в C++ Юнона Общие вопросы C/C++ 10 29.05.2011 17:53
Деление в С++ Tanilita Общие вопросы C/C++ 5 26.02.2010 17:28
Деление |{ot Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 24.03.2009 01:50
деление natasha Общие вопросы Delphi 6 22.01.2007 12:39