📄 mem.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 + -