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

📄 mm.asm

📁 jserv写的orz小内核 有详细的注释
💻 ASM
字号:
;-----------------------------------------------------------------------------------;;;; IN: memMap;;;; OUT: if (FLAG_C) error(); else {modify_memMap; EAX=Address;};;;; MODIFY: EAX, ECX, EDX, ESIAllocPage:	mov esi, memMap	mov ecx, 0x20000 / 4 + 1	; +1 for loopzAllocPage_:	xor edx, edx	dec edxAllocPage0:	lodsd	cmp eax, edx	loopz AllocPage0	jecxz AllocPage3	sub esi, 4	xor edx, edx	mov ecx, $80000000AllocPage1:	rol ecx, 1		; jiao: figure out which bit of eax is 0	shr eax, 1			jnc AllocPage2		; jiao: jmp if carry flag is 0, that is a 0 has been shifted out	inc dl			; jiao: offset	jmp short AllocPage1AllocPage2:	or [esi], ecx	mov eax, esi	sub eax, memMap	; EAX = align(Address, 32) / 4096 / 8	shl eax, 3	; EAX = align(Address, 32) / 4096	add eax, edx	; EAX = Address / 4096	shl eax, 12	; EAX = Address	clc	retAllocPage3:	stc	ret;-----------------------------------------------------------------------------------;;;; IN: EAX = Address, memMap;;;; OUT: memMap modifed;;;; MODIFY: EAX, CL, ESIFreePage:	shr eax, 12	; EAX = Address / 4096 = PageNum	mov cl, al	and cl, 7	; jiao: remainder	shr eax, 3	; jiao: offset to memMap by byte	add eax, memMap	mov esi, eax	mov al, 11111110b	rol al, cl	and [esi], al	ret;-----------------------------------------------------------------------------------;;;; IN: EAX = Address, memMap;;;; OUT: memMap modifed;;;; MODIFY: EAX, CL, ESIReservePage:	shr eax, 12	; EAX = Address / 4096 = PageNum	mov cl, al	and cl, 7	shr eax, 3	add eax, memMap	mov esi, eax	mov al, 00000001b	rol al, cl	or [esi], al	ret;-------------------------------------------------------------------------------;;;; IN: EAX = size;;;; OUT: ECX = pages;;;; MODIFY: EAXSizeToPages:		test eax, 0x0FFF	jz SizeToPages0		; adjust for page alignment	add eax, 0x1000		; shiftSizeToPages0:	shr eax, 12	mov ecx, eax	ret;-------------------------------------------------------------------------------;;;; IN: ECX = pages_to_allocate;;;; OUT: EAX = base_address;;;; MODIFY:AllocPages11:	stc	retAllocPages:	mov [allocPagesNeed], ecx	mov esi, memMap	mov ecx, 0x20000 / 4 + 1	; +1 for loopzAllocPages0:	xor edx, edx		; reset	dec edxAllocPages1:	lodsd	cmp eax, edx	loopz AllocPages1	jecxz AllocPages11	mov edx, esi	sub edx, 4	mov [allocAddress], edx	xor edx, edxAllocPages2:	push ecx	mov ecx, 32AllocPages3:	dec ecx	shr eax, 1	jc AllocPages3AllocPages4:	inc edx	jecxz AllocPages5	dec ecx	shr eax, 1	jnc AllocPages4	jmp short AllocPages6	AllocPages5:	pop ecx	cmp edx, [allocPagesNeed]	jnc AllocPages8	jecxz AllocPages7	lodsd	cmp eax, 0xFFFFFFFF	jz AllocPages0	jmp short AllocPages2AllocPages6:	pop ecxAllocPages7:	cmp edx, [allocPagesNeed]	jnc AllocPages8	jmp AllocPages0AllocPages8:	mov esi, [allocAddress]	mov ecx, 2	call AllocPage_	push eax	mov ecx, [allocPagesNeed]	dec ecx	jz AllocPages10AllocPages9:	add eax, 0x1000	push eax	push ecx	call ReservePage	pop ecx	pop eax	loop AllocPages9AllocPages10:	pop eax	clc	retallocPagesNeed	dd 0x12345678allocAddress	dd 0x12345678;-------------------------------------------------------------------------------;;;; IN: EAX = base_address, ECX = pages_count;;;; OUT:;;;; MODIFY:FreePages:	push ecx	push eax	call FreePage	pop eax	pop ecx	add eax, 0x1000	loop FreePages	ret;-------------------------------------------------------------------------------;;;; IN: Paging must be disabled;;;; OUT: [memSizeBl] - mem size in bloks (4kb);;;; MODIFY: EAX, EBX, ECX, EDX, ESITestMemory:	mov esi, 0x100000	; begin from second meg	xor ebx, ebx	mov ecx, 0x100000 - 0x100	; 4Gb_in_blocks - 1Mb_in_blocks	mov eax, 0x12345678	mov edx, eaxTestMemory0:	xchg eax, [esi]		; reverse of reverse	xchg eax, [esi]	cmp eax,edx	jnz TestMemory1	add esi, 0x1000		; next 4kb	inc ebx	loop TestMemory0TestMemory1:	inc ebx			; add first meg	mov [memSizeBl],ebx	ret

⌨️ 快捷键说明

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