⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 link.asm

📁 算十万的阶乘,对于计算机和程序员都是一个挑战,本源程序实现了求大数的阶乘,是用汇编写的,相对速度很快,算十万的阶乘在我赛扬2.4,内存256的神舟笔记本上,用了20多分钟.算出得数写在一个TXT文件下
💻 ASM
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 
;Written by 郭肇禄
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; string.asm
; 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

		.386
		.model flat, stdcall
		option casemap :none

LINKNOD STRUCT
	Data	 DWORD		?
	Next     DWORD      ?
LINKNOD ENDS

.data
	hHeap	dd		0
	pL		LINKNOD   <0>
	hFile	dd     0
	dWN     dd     0
	FilName  db  'tt.txt', 0  
	Lstr     db   804800  dup(?)
.code

;************************************************
_CreateHeap proc uses ecx edx 

	invoke HeapCreate, HEAP_NO_SERIALIZE, 01000h, 0
	mov hHeap, eax
	ret
_CreateHeap endp


;**********************************************
_NewNod   proc uses ecx edx NodSize

	invoke HeapAlloc, hHeap, 0 , NodSize
	 
	ret
_NewNod endp
	
;***********************************************
 _AdjustNod proc uses edi esi edx pNod
		local @x:DWORD
		local @c:byte
		
		mov edx, 0
		mov @x, 0Ah
		mov edi, pNod
		
		
_NextList:
		mov esi, edi	
		mov eax, [esi]
		add eax, edx
		mov [esi], eax
		cdq
		idiv @x
		
		cmp eax, 0
		jnz _DAYI10
		mov edx, 0
		jmp _NoChangNOd
 _DAYI10:
		mov [esi], edx
		mov edx, eax
_NoChangNOd:
		mov edi, [esi+4]
		cmp edi, 0
		jnz _NextList
		
		.if edx != 0 
			invoke _NewNod,  sizeof LINKNOD
			mov [esi + 4], eax
			mov [eax], edx
			mov  DWORD ptr [eax + 4], 0
		.endif
		
		cmp edx, 10
		mov edi, eax
		mov edx, 0
		jge _NextList
		
 _EndList:
		
		ret
_AdjustNod endp

_MulNod   proc uses esi edi pNod, data
	
		mov edi, pNod

_NextList:
		mov esi, edi
		mov eax, [esi]
		imul eax, data
		mov [esi], eax
		mov edi, [esi + 4]
		cmp edi,0 
		jnz _NextList
	
		ret
_MulNod   endp


;************************************************
_InitMul proc Num
	local   @st:DWORD
	local   @str2[5]:byte
	
	
	mov byte ptr @str2, 13
	mov byte ptr @str2+1, 10
	mov byte ptr @str2+2, 0
	
	invoke _CreateHeap
	mov pL.Data, 1
	mov pL.Next, 0
	mov ecx, Num
	mov ebx, 1
	invoke GetTickCount
	mov @st, eax
	
_NextNum:
	cmp ecx, 0
	jz _EndMul
	invoke _MulNod, addr pL, ebx
	invoke _AdjustNod, addr pL
	inc ebx
	dec ecx
	jmp _NextNum
	
_EndMul:
	
	lea edi, pL
	lea esi, [Lstr+804800]
	mov ebx, esi
_NextChar:

	mov eax, [edi]
	add eax, '0'
	mov byte ptr [esi], al
	dec esi
	mov edi, [edi + 4]
	cmp edi,0 
	jnz _NextChar
	
	
	sub ebx, esi
	inc esi
	
	invoke CreateFile, addr FilName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS,\
	FILE_ATTRIBUTE_NORMAL or FILE_FLAG_WRITE_THROUGH,  NULL
	
	mov hFile, eax
	invoke  WriteFile, hFile, esi, ebx, addr dWN, NULL
	
	invoke GetTickCount
	sub eax, @st
	mov @st, eax
	
	invoke  WriteFile, hFile, addr @str2, 2, addr dWN, NULL
	invoke  WriteFile, hFile, addr @st, sizeof DWORD , addr dWN, NULL
	
	invoke CloseHandle, hFile
	
	invoke  MessageBox, NULL, addr @str2, addr @str2, 0
	ret
_InitMul endp 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -