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

📄 mem.asm

📁 这是一个符合posix.13 pse51的实时内核
💻 ASM
字号:
; Project: 	HARTIK 3.0      				
; Description:  Hard Real TIme Kernel for 386 & higher machines 
; Author:	Gerardo Lamastra			
; Date:		9/5/96 						
; Revision:	Beta 1.0

;
; Assembler portion of the library!
; I shall use Watcom register calling convention along this module
;

.386
.387
.model flat

INCLUDE sel.inc

.code
PUBLIC memcpy_
PUBLIC memcmp_
PUBLIC memset_
PUBLIC memchr_
PUBLIC lmemcpy_
PUBLIC lmemcmp_
PUBLIC lmemset_
PUBLIC lmemchr_
PUBLIC _fmemcpy

;
; Standard C management functions
; These functions work into the PM address space
;

; void memcpy(void *dest,void *src,unsigned n)
; Input: EAX = dest EDX = src ECX = n 
memcpy_		PROC
		push	edi
		push	esi
		push	ecx
		cld
		mov	ecx,ebx
		mov 	edi,eax
		mov	esi,edx
		rep 	movsb
		pop	ecx
		pop	esi
		pop	edi
		ret
memcpy_		ENDP

; int  memcmp(void *dest,void *src,unsigned n)
; Input: EAX = dest EDX = src ECX = n
memcmp_		PROC
		push	edi
		push	esi
		push	ecx
		cld
		mov	ecx,ebx
		mov 	edi,eax
		mov	esi,edx
		repe	cmpsb
		jz	__equal
		mov	eax,0
		jmp	__differnt
__equal:	mov	eax,1
__differnt:	pop	ecx
		pop	esi
		pop	edi
		ret
memcmp_		ENDP

; void memset(void *dest,char value,unsigned n)
; Input: EAX = dest DL = value ECX = n

memset_		PROC
		push	edi
		push	ecx
		cld
		mov	ecx,ebx
		mov 	edi,eax
		mov	al,dl
		rep 	stosb
		pop	ecx
		pop	edi
		ret
memset_		ENDP

; int  memchr(void *dest,char value,unsigned n)
; Input: EAX = dest EDX = value ECX = n
memchr_		PROC
		push	esi
		push	ecx
		cld
		mov	ecx,ebx
		mov 	edi,eax
		mov	al,dl
		mov	edx,ebx
		repne	scasb
		je	__found
		mov	edx,0
		jmp	__notfound
__found:	sub	edx,ecx
__notfound:	pop	ecx	
 		pop	esi
		mov	eax,edx
		ret	
memchr_		ENDP

;
; These functions work into the flat address space
; They refer only liner phisical address
;

; void lmemcpy(unsigned long dest,unsigned long src,unsigned n)
; Input: EAX = dest EDX = src ECX = n 
lmemcpy_	PROC
		push	edi
		push	esi
		push	ecx
		push	es
		push	ds
		push	eax
		mov	ax,X_FLATDATA_SEL
		mov	ds,ax
		mov	es,ax
		pop	eax
		cld
		mov	ecx,ebx
		mov 	edi,eax
		mov	esi,edx
		rep 	movsb
		pop	ds
		pop	es
		pop	ecx
		pop	esi
		pop	edi
		ret
lmemcpy_	ENDP

; void lmemcmp(unsigned long dest,unsigned long src,unsigned n)
; Input: EAX = dest EDX = src ECX = n
lmemcmp_	PROC
		push	edi
		push	esi
		push	ecx
		push	es
		push	ds
		push	eax
		mov	ax,X_FLATDATA_SEL
		mov	ds,ax
		mov	es,ax
		pop	eax
		cld
		mov	ecx,ebx
		mov 	edi,eax
		mov	esi,edx
		repe	cmpsb
		jz	__lequal
		mov	eax,0
		jmp	__ldiffernt
__lequal:	mov	eax,1
__ldiffernt:	pop	ds
		pop	es
		pop	ecx
		pop	esi
		pop	edi
		ret
lmemcmp_	ENDP

; void lmemset(unsigned long dest,char value,unsigned n)
; Input: EAX = dest DL = value ECX = n

lmemset_	PROC
		push	edi
		push	ecx
		push	es
		push	ds
		push	eax
		mov	ax,X_FLATDATA_SEL
		mov	ds,ax
		mov	es,ax
		pop	eax
		cld
		mov	ecx,ebx
		mov 	edi,eax
		mov	al,dl
		rep 	stosb
		pop	ds
		pop	es
		pop	ecx
		pop	edi
		ret
lmemset_	ENDP

; int  lmemchr(unsigned long,char value,unsigned n)
; Input: EAX = dest EDX = value ECX = n
lmemchr_	PROC
		push	esi
		push	ecx
		push	es
		push	ds
		push	eax
		mov	ax,X_FLATDATA_SEL
		mov	ds,ax
		mov	es,ax
		pop	eax
		cld
		mov	ecx,ebx
		mov 	edi,eax
		mov	al,dl
		mov	edx,ebx
		repne	scasb
		je	__lfound
		mov	edx,0
		jmp	__lnotfound
__lfound:	sub	edx,ecx
__lnotfound:	pop	ds
		pop	es
		pop	ecx	
 		pop	esi
		mov	eax,edx
		ret	
lmemchr_	ENDP

; void __cdecl fmemcpy(unsigned short ds,unsigned long do
;		unsigned short ss,unsigned long so,unsigned n)
; Cannot push more than 4 args... So let's use standarc C calling conv!

_fmemcpy	PROC
		push	ebp
		mov	ebp,esp
		push	edi
		push	esi
		push	ecx
		push	es
		push	ds
				
		mov	eax,dword ptr 8[ebp]
		mov	es,ax
		mov	eax,dword ptr 16[ebp]
		mov	ds,ax
		mov	esi,dword ptr 20[ebp]
		mov	edi,dword ptr 12[ebp]
		mov	ecx,dword ptr 24[ebp]

		cld
		rep 	movsb
		pop	ds
		pop	es
		pop	ecx
		pop	esi
		pop	edi
		pop	ebp
		ret
_fmemcpy	ENDP

END

⌨️ 快捷键说明

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