mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 09:34:43 +00:00
*** empty log message ***
svn path=/trunk/; revision=5333
This commit is contained in:
parent
98f9507c1e
commit
007c07efe6
7 changed files with 556 additions and 0 deletions
49
reactos/lib/ntdll/nasm/rtl/i386_RtlCompareMemory.asm
Normal file
49
reactos/lib/ntdll/nasm/rtl/i386_RtlCompareMemory.asm
Normal file
|
@ -0,0 +1,49 @@
|
|||
; * base on ntdll/rtl/mem.c v 1.13 2003/07/11 13:50:23
|
||||
; *
|
||||
; * COPYRIGHT: See COPYING in the top level directory
|
||||
; * PROJECT: ReactOS kernel
|
||||
; * FILE: i386_RtlCompareMemory.asm
|
||||
; * PURPOSE: Memory functions
|
||||
; * PROGRAMMER: Magnus Olsen (magnusolsen@greatlord.com)
|
||||
; * UPDATE HISTORY:
|
||||
; * Created 20/07-2003
|
||||
; *
|
||||
|
||||
|
||||
|
||||
|
||||
BITS 32
|
||||
GLOBAL _RtlCompareMemory@12 ; [4] (no bug)
|
||||
|
||||
SECTION .text
|
||||
|
||||
; *
|
||||
; * [4] ULONG STDCALL RtlCompareMemory(PVOID Source1, PVOID Source2, ULONG Length)
|
||||
; *
|
||||
|
||||
_RtlCompareMemory@12:
|
||||
xor eax,eax ; count = 0
|
||||
mov ecx, dword [esp + 12 ] ; ecx = Length
|
||||
cmp ecx,0 ; if (Length==0) goto .zero
|
||||
je .zero
|
||||
|
||||
push edi ; register that does not to be save eax,ecx,edx to
|
||||
push ebx ; the stack for protetion
|
||||
|
||||
mov edi, dword [esp + (4 + 8)] ; edi = Destination
|
||||
mov edx, dword [esp + (8 + 8)] ; edx = Source
|
||||
|
||||
.loop_1byte:
|
||||
mov bl,byte [edi + eax ] ; if (src[count]!=des[count]) goto .pop_zero
|
||||
cmp byte [edx + eax ],bl
|
||||
jne .pop_zero
|
||||
|
||||
inc eax ; count = count + 1
|
||||
dec ecx ; Length = Length - 1
|
||||
jnz .loop_1byte ; if (Length!=0) goto .loop_1byte
|
||||
|
||||
.pop_zero:
|
||||
pop ebx ; restore regiester
|
||||
pop edi
|
||||
.zero:
|
||||
ret 12 ; return count
|
50
reactos/lib/ntdll/nasm/rtl/i386_RtlCompareMemoryUlong.asm
Normal file
50
reactos/lib/ntdll/nasm/rtl/i386_RtlCompareMemoryUlong.asm
Normal file
|
@ -0,0 +1,50 @@
|
|||
; * base on ntdll/rtl/mem.c v 1.13 2003/07/11 13:50:23
|
||||
; *
|
||||
; * COPYRIGHT: See COPYING in the top level directory
|
||||
; * PROJECT: ReactOS kernel
|
||||
; * FILE: i386_RtlCompareMemoryUlong.asm
|
||||
; * PURPOSE: Memory functions
|
||||
; * PROGRAMMER: Magnus Olsen (magnusolsen@greatlord.com)
|
||||
; * UPDATE HISTORY:
|
||||
; * Created 20/07-2003
|
||||
; *
|
||||
|
||||
|
||||
|
||||
|
||||
BITS 32
|
||||
GLOBAL _RtlCompareMemoryUlong@12 ; [5] (no bug)
|
||||
|
||||
SECTION .text
|
||||
;*
|
||||
;* [5] ULONG STDCALL RtlCompareMemoryUlong (PVOID Source, ULONG Length, ULONG Value)
|
||||
;*
|
||||
|
||||
_RtlCompareMemoryUlong@12:
|
||||
xor eax,eax
|
||||
mov ecx, dword [esp + 8 ] ; ecx = Length
|
||||
shr ecx,2 ; Length / sizeof(ULONG)
|
||||
jz .zero ; if (Length==0) goto .zero
|
||||
|
||||
push edi ; register that does not to be save eax,ecx,edx to
|
||||
push ebx ; the stack for protetion
|
||||
|
||||
mov edi, dword [esp + (4 + 8)] ; edx = Destination
|
||||
mov eax, dword [esp + (12 + 8)] ; ebx = value
|
||||
mov ebx,ecx
|
||||
cld
|
||||
repe scasd
|
||||
|
||||
inc ecx
|
||||
mov eax,ebx
|
||||
|
||||
sub eax,ecx
|
||||
shl eax,2
|
||||
|
||||
pop ebx
|
||||
pop edi
|
||||
|
||||
.zero
|
||||
ret 12
|
||||
|
||||
|
36
reactos/lib/ntdll/nasm/rtl/i386_RtlFillMemory.asm
Normal file
36
reactos/lib/ntdll/nasm/rtl/i386_RtlFillMemory.asm
Normal file
|
@ -0,0 +1,36 @@
|
|||
; * base on ntdll/rtl/mem.c v 1.13 2003/07/11 13:50:23
|
||||
; *
|
||||
; * COPYRIGHT: See COPYING in the top level directory
|
||||
; * PROJECT: ReactOS kernel
|
||||
; * FILE: i386_RtlCompareMemory.asm
|
||||
; * PURPOSE: Memory functions
|
||||
; * PROGRAMMER: Magnus Olsen (magnusolsen@greatlord.com)
|
||||
; * UPDATE HISTORY:
|
||||
; * Created 20/07-2003
|
||||
; *
|
||||
|
||||
|
||||
|
||||
|
||||
BITS 32
|
||||
GLOBAL _RtlFillMemory@12 ; [4] (no bug)
|
||||
|
||||
SECTION .text
|
||||
|
||||
; *
|
||||
; * [6] VOID STDCALL RtlFillMemory (PVOID Destination, ULONG Length, UCHAR Fill)
|
||||
; *
|
||||
|
||||
_RtlFillMemory@12:
|
||||
mov ecx,dword [esp + 8 ] ; ecx = Length
|
||||
cmp ecx,0 ; if (Length==0) goto .zero
|
||||
je .zero
|
||||
|
||||
mov edx, dword [esp + 4] ; edx = Destination
|
||||
mov eax, dword [esp + 12] ; eax = fill
|
||||
.loop:
|
||||
mov byte [edx + ecx -1],al ; src[Length - 1] = fill
|
||||
dec ecx ; Length = Length - 1
|
||||
jnz .loop ; if (Length!=0) goto .loop
|
||||
.zero:
|
||||
ret 12 ; return
|
38
reactos/lib/ntdll/nasm/rtl/i386_RtlFillMemoryUlong.asm
Normal file
38
reactos/lib/ntdll/nasm/rtl/i386_RtlFillMemoryUlong.asm
Normal file
|
@ -0,0 +1,38 @@
|
|||
; * base on ntdll/rtl/mem.c v 1.13 2003/07/11 13:50:23
|
||||
; *
|
||||
; * COPYRIGHT: See COPYING in the top level directory
|
||||
; * PROJECT: ReactOS kernel
|
||||
; * FILE: i386_RtlMemoryUlong.asm
|
||||
; * PURPOSE: Memory functions
|
||||
; * PROGRAMMER: Magnus Olsen (magnusolsen@greatlord.com)
|
||||
; * UPDATE HISTORY:
|
||||
; * Created 20/07-2003
|
||||
; *
|
||||
|
||||
|
||||
|
||||
BITS 32
|
||||
GLOBAL _RtlFillMemoryUlong@12 ; (no bug) (max optimze code)
|
||||
|
||||
SECTION .text
|
||||
|
||||
|
||||
|
||||
|
||||
; *
|
||||
; * VOID STDCALL RtlFillMemoryUlong (PVOID Destination, ULONG Length, ULONG Fill)
|
||||
; *
|
||||
|
||||
_RtlFillMemoryUlong@12:
|
||||
mov ecx, dword [esp + 8 ] ; Length
|
||||
shr ecx,2 ; Length = Length / sizeof(ULONG)
|
||||
jz .zero ; if (Length==0) goto .zero
|
||||
|
||||
push edi
|
||||
mov edi, dword [esp + (4 + 4)] ; Destination
|
||||
mov eax, dword [esp + (12 + 4)] ; Fill
|
||||
cld
|
||||
rep stosd ; while (Length>0) {Destination[Length-1]=Fill; Length = Length - 1}
|
||||
pop edi
|
||||
.zero:
|
||||
ret 12
|
69
reactos/lib/ntdll/nasm/rtl/i386_RtlMoveMemory.asm
Normal file
69
reactos/lib/ntdll/nasm/rtl/i386_RtlMoveMemory.asm
Normal file
|
@ -0,0 +1,69 @@
|
|||
; * base on ntdll/rtl/mem.c v 1.13 2003/07/11 13:50:23
|
||||
; *
|
||||
; * COPYRIGHT: See COPYING in the top level directory
|
||||
; * PROJECT: ReactOS kernel
|
||||
; * FILE: i386_RtlMemory.asm
|
||||
; * PURPOSE: Memory functions
|
||||
; * PROGRAMMER: Magnus Olsen (magnusolsen@greatlord.com)
|
||||
; * UPDATE HISTORY:
|
||||
; * Created 20/07-2003
|
||||
; *
|
||||
|
||||
|
||||
BITS 32
|
||||
GLOBAL _RtlMoveMemory@12 ; (no bug) (max optimze code)
|
||||
|
||||
SECTION .text
|
||||
|
||||
; *
|
||||
; * [1] VOID STDCALL RtlMoveMemory (PVOID Destination, CONST VOID *Source,ULONG Length);
|
||||
; *
|
||||
|
||||
|
||||
|
||||
_RtlMoveMemory@12:
|
||||
mov ecx,dword [esp + 12 ] ; ecx = Length
|
||||
cmp ecx,0 ; if (Length==0) goto .zero
|
||||
je .zero
|
||||
|
||||
pushad
|
||||
mov edi, dword [esp + (4 + 32)] ; eax = Destination
|
||||
mov esi, dword [esp + (8 + 32)] ; edx = Source
|
||||
|
||||
; calc how many bytes it should handle same time
|
||||
mov ebx,ecx ; temp_Length = Length
|
||||
shr ecx,2 ; Length = Length / sizeof(ULONG)
|
||||
jz .1byte ; if (Length==0) goto .1byte
|
||||
|
||||
shl ecx,2 ; Length = Length * sizeof(ULONG)
|
||||
sub ebx,ecx ; temp_Length = temp_Length - Length
|
||||
jz .4bytes ; if (temp_Length==0) goto .4byte
|
||||
|
||||
; move 4byte and 1byte
|
||||
shr ecx,2 ; Length = Length / sizeof(ULONG)
|
||||
cld ; clear d flag
|
||||
rep movsd ; while (Length!=0) { (ULONG *) Destination[Length-1] = (ULONG *) Source[Length-1]; Legnth = Legnth - 1 }
|
||||
mov ecx,ebx ; Length = temp_Length
|
||||
rep movsb ; while (Length!=0) { (UCHAR *) Destination[Length-1] = (UCHAR *) Source[Length-1]; Legnth = Legnth - 1 }
|
||||
popad ; restore regiester
|
||||
ret 12 ; return
|
||||
|
||||
; move 1byte
|
||||
.1byte:
|
||||
mov ecx,dword [esp + (12 +32) ] ; ecx = Length
|
||||
cld ; clear d flag
|
||||
rep movsb ; while (Length!=0) { (UCHAR *) Destination[Length-1] = (UCHAR *) Source[Length-1]; Legnth = Legnth - 1 }
|
||||
|
||||
popad ; restore regiester
|
||||
ret 12 ; return
|
||||
|
||||
; move 4bytes
|
||||
.4bytes:
|
||||
shr ecx,2 ; Length = Length / sizeof(ULONG)
|
||||
cld ; clear d flag
|
||||
rep movsd ; while (Length!=0) { (ULONG *) Destination[Length-1] = (ULONG *) Source[Length-1]; Legnth = Legnth - 1 }
|
||||
popad ; restore regiester
|
||||
.zero:
|
||||
ret 12 ; return
|
||||
|
||||
|
249
reactos/lib/ntdll/nasm/rtl/i386_RtlRandom.asm
Normal file
249
reactos/lib/ntdll/nasm/rtl/i386_RtlRandom.asm
Normal file
|
@ -0,0 +1,249 @@
|
|||
; * base on ntdll/rtl/random.c v 1.1 2003/06/07 11:32:03
|
||||
; *
|
||||
; * COPYRIGHT: See COPYING in the top level directory
|
||||
; * PROJECT: ReactOS kernel
|
||||
; * FILE: i386_RtlRandom.asm
|
||||
; * PURPOSE: Random number generator functions
|
||||
; * PROGRAMMER: Magnus Olsen (magnusolsen@greatlord.com)
|
||||
; * UPDATE HISTORY:
|
||||
; * Created 20/07-2003
|
||||
; *
|
||||
|
||||
|
||||
BITS 32
|
||||
GLOBAL _RtlRandom@4 ; [1] (no bug) (max optimze code)
|
||||
GLOBAL _RtlUniform@4 ; [2] (no bug) (max optimze code)
|
||||
GLOBAL _SavedValue ; [3] (no bug) (max optimze code)
|
||||
SECTION .text
|
||||
|
||||
_RtlRandom@4:
|
||||
; load pointer
|
||||
mov ecx,[esp+4]
|
||||
mov eax,[ecx]
|
||||
|
||||
; Result = *Seed * 0xffffffed + 0x7fffffc3 ; take now 3 cycles
|
||||
lea edx,[eax + eax * 8]
|
||||
|
||||
lea eax,[eax + edx * 2 + 2147483709 ] ; + 2147483709
|
||||
neg eax
|
||||
|
||||
cmp eax,-1
|
||||
je .RtlRandom_Rand1
|
||||
cmp eax, 2147483646
|
||||
je .RtlRandom_Rand1
|
||||
|
||||
cmp eax, 2147483647
|
||||
je .RtlRandom_Rand2
|
||||
|
||||
test eax,eax
|
||||
jns .RtlRandom_Rand3
|
||||
|
||||
; else {
|
||||
mov edx,eax
|
||||
and edx,1
|
||||
add eax,edx
|
||||
and eax,2147483647
|
||||
mov [ecx],eax
|
||||
jmp .RtlRandom_Seed
|
||||
|
||||
|
||||
.RtlRandom_Rand1:
|
||||
; if (Result == 0xffffffff || Result == 0x7ffffffe)
|
||||
add eax, 2
|
||||
and eax, 2147483647
|
||||
mov [ecx],eax
|
||||
jmp .RtlRandom_Seed
|
||||
|
||||
.RtlRandom_Rand2:
|
||||
; else if (Result == 0x7fffffff)
|
||||
xor eax,eax
|
||||
mov [ecx],eax
|
||||
jmp .RtlRandom_Seed
|
||||
|
||||
.RtlRandom_Rand3:
|
||||
; else if ((Result & 0x80000000) == 0)
|
||||
mov edx,eax
|
||||
xor edx,-1 ; not edx lock all clock until it finsish, but xor does not do that
|
||||
and edx,1
|
||||
add eax,edx
|
||||
mov [ecx],eax
|
||||
|
||||
.RtlRandom_Seed:
|
||||
mov eax,[ecx]
|
||||
|
||||
; Result = *Seed * 0xffffffed + 0x7fffffc3 ; take now 3 cycles
|
||||
lea edx,[eax + eax * 8]
|
||||
|
||||
lea eax,[eax + edx * 2 + 2147483709 ] ; + 2147483709 09-18
|
||||
neg eax
|
||||
|
||||
cmp eax,-1
|
||||
je .RtlRandom_Seed1
|
||||
cmp eax, 2147483646
|
||||
je .RtlRandom_Seed1
|
||||
|
||||
cmp eax, 2147483647
|
||||
je .RtlRandom_Seed2
|
||||
|
||||
test eax,eax
|
||||
jns .RtlRandom_Seed3
|
||||
|
||||
; else {
|
||||
mov edx,eax
|
||||
and edx,1
|
||||
add eax,edx
|
||||
and eax,2147483647
|
||||
|
||||
; end
|
||||
mov edx,[ecx]
|
||||
mov [ecx],eax
|
||||
|
||||
mov ecx,eax ; pos
|
||||
and ecx, 0x7f ; pos = seed & 0x7f
|
||||
mov eax,ecx;
|
||||
mov eax, dword [_SavedValue + (ecx*4)]
|
||||
mov dword [_SavedValue + (ecx*4)], edx
|
||||
ret 4
|
||||
|
||||
.RtlRandom_Seed1:
|
||||
; if (Result == 0xffffffff || Result == 0x7ffffffe)
|
||||
add eax, 2
|
||||
and eax, 2147483647
|
||||
|
||||
; end
|
||||
mov edx,[ecx]
|
||||
mov [ecx],eax
|
||||
|
||||
mov ecx,eax ; pos
|
||||
and ecx, 0x7f ; pos = seed & 0x7f
|
||||
mov eax,ecx;
|
||||
mov eax, dword [_SavedValue + (ecx*4)]
|
||||
mov dword [_SavedValue + (ecx*4)], edx
|
||||
ret 4
|
||||
|
||||
.RtlRandom_Seed2:
|
||||
; else if (Result == 0x7fffffff)
|
||||
xor eax,eax
|
||||
|
||||
; end
|
||||
mov edx,[ecx]
|
||||
mov [ecx],eax
|
||||
|
||||
mov ecx,eax ; pos
|
||||
and ecx, 0x7f ; pos = seed & 0x7f
|
||||
mov eax,ecx;
|
||||
mov eax, dword [_SavedValue + (ecx*4)]
|
||||
mov dword [_SavedValue + (ecx*4)], edx
|
||||
ret 4
|
||||
|
||||
.RtlRandom_Seed3:
|
||||
; else if ((Result & 0x80000000) == 0)
|
||||
mov edx,eax
|
||||
xor edx,-1 ; not edx lock all clock until it finsish, but xor does not do that
|
||||
and edx,1
|
||||
add eax,edx
|
||||
|
||||
; end
|
||||
mov edx,[ecx]
|
||||
mov [ecx],eax
|
||||
|
||||
mov ecx,eax ; pos
|
||||
and ecx, 0x7f ; pos = seed & 0x7f
|
||||
mov eax,ecx;
|
||||
mov eax, dword [_SavedValue + (ecx*4)]
|
||||
mov dword [_SavedValue + (ecx*4)], edx
|
||||
ret 4
|
||||
|
||||
|
||||
|
||||
|
||||
; prototype: ULONG STDCALL RtlUniform (PULONG Seed)
|
||||
_RtlUniform@4:
|
||||
; load pointer
|
||||
mov ecx,[esp+4]
|
||||
mov eax,[ecx]
|
||||
|
||||
; Result = *Seed * 0xffffffed + 0x7fffffc3 ; take now 3 cycles
|
||||
lea edx,[eax + eax * 8]
|
||||
|
||||
lea eax,[eax + edx * 2 + 2147483709 ] ; + 2147483709 09-18
|
||||
neg eax
|
||||
|
||||
cmp eax,-1
|
||||
je .RtlUniform_jump1
|
||||
cmp eax, 2147483646
|
||||
je .RtlUniform_jump1
|
||||
|
||||
cmp eax, 2147483647
|
||||
je .RtlUniform_jump2
|
||||
|
||||
test eax,eax
|
||||
jns .RtlUniform_jump3
|
||||
|
||||
; else {
|
||||
mov edx,eax
|
||||
and edx,1
|
||||
add eax,edx
|
||||
and eax,2147483647
|
||||
mov [ecx],eax
|
||||
ret 4
|
||||
|
||||
.RtlUniform_jump1:
|
||||
; if (Result == 0xffffffff || Result == 0x7ffffffe)
|
||||
add eax, 2
|
||||
and eax, 2147483647
|
||||
mov [ecx],eax
|
||||
ret 4
|
||||
|
||||
.RtlUniform_jump2:
|
||||
; else if (Result == 0x7fffffff)
|
||||
xor eax,eax
|
||||
mov [ecx],eax
|
||||
ret 4
|
||||
|
||||
.RtlUniform_jump3:
|
||||
; else if ((Result & 0x80000000) == 0)
|
||||
mov edx,eax
|
||||
xor edx,-1 ; not edx lock all clock until it finsish, but xor does not do that
|
||||
and edx,1
|
||||
add eax,edx
|
||||
mov [ecx],eax
|
||||
ret 4
|
||||
|
||||
|
||||
SECTION .data
|
||||
; SavedValue[128]
|
||||
_SavedValue:
|
||||
dd 0x4c8bc0aa, 0x4c022957, 0x2232827a, 0x2f1e7626
|
||||
dd 0x7f8bdafb, 0x5c37d02a, 0x0ab48f72, 0x2f0c4ffa
|
||||
dd 0x290e1954, 0x6b635f23, 0x5d3885c0, 0x74b49ff8
|
||||
dd 0x5155fa54, 0x6214ad3f, 0x111e9c29, 0x242a3a09
|
||||
dd 0x75932ae1, 0x40ac432e, 0x54f7ba7a, 0x585ccbd5
|
||||
dd 0x6df5c727, 0x0374dad1, 0x7112b3f1, 0x735fc311
|
||||
dd 0x404331a9, 0x74d97781, 0x64495118, 0x323e04be
|
||||
dd 0x5974b425, 0x4862e393, 0x62389c1d, 0x28a68b82
|
||||
dd 0x0f95da37, 0x7a50bbc6, 0x09b0091c, 0x22cdb7b4
|
||||
dd 0x4faaed26, 0x66417ccd, 0x189e4bfa, 0x1ce4e8dd
|
||||
dd 0x5274c742, 0x3bdcf4dc, 0x2d94e907, 0x32eac016
|
||||
dd 0x26d33ca3, 0x60415a8a, 0x31f57880, 0x68c8aa52
|
||||
dd 0x23eb16da, 0x6204f4a1, 0x373927c1, 0x0d24eb7c
|
||||
dd 0x06dd7379, 0x2b3be507, 0x0f9c55b1, 0x2c7925eb
|
||||
dd 0x36d67c9a, 0x42f831d9, 0x5e3961cb, 0x65d637a8
|
||||
dd 0x24bb3820, 0x4d08e33d, 0x2188754f, 0x147e409e
|
||||
dd 0x6a9620a0, 0x62e26657, 0x7bd8ce81, 0x11da0abb
|
||||
dd 0x5f9e7b50, 0x23e444b6, 0x25920c78, 0x5fc894f0
|
||||
dd 0x5e338cbb, 0x404237fd, 0x1d60f80f, 0x320a1743
|
||||
dd 0x76013d2b, 0x070294ee, 0x695e243b, 0x56b177fd
|
||||
dd 0x752492e1, 0x6decd52f, 0x125f5219, 0x139d2e78
|
||||
dd 0x1898d11e, 0x2f7ee785, 0x4db405d8, 0x1a028a35
|
||||
dd 0x63f6f323, 0x1f6d0078, 0x307cfd67, 0x3f32a78a
|
||||
dd 0x6980796c, 0x462b3d83, 0x34b639f2, 0x53fce379
|
||||
dd 0x74ba50f4, 0x1abc2c4b, 0x5eeaeb8d, 0x335a7a0d
|
||||
dd 0x3973dd20, 0x0462d66b, 0x159813ff, 0x1e4643fd
|
||||
dd 0x06bc5c62, 0x3115e3fc, 0x09101613, 0x47af2515
|
||||
dd 0x4f11ec54, 0x78b99911, 0x3db8dd44, 0x1ec10b9b
|
||||
dd 0x5b5506ca, 0x773ce092, 0x567be81a, 0x5475b975
|
||||
dd 0x7a2cde1a, 0x494536f5, 0x34737bb4, 0x76d9750b
|
||||
dd 0x2a1f6232, 0x2e49644d, 0x7dddcbe7, 0x500cebdb
|
||||
dd 0x619dab9e, 0x48c626fe, 0x1cda3193, 0x52dabe9d
|
||||
|
65
reactos/lib/ntdll/nasm/rtl/i386_RtlZeroMemory.asm
Normal file
65
reactos/lib/ntdll/nasm/rtl/i386_RtlZeroMemory.asm
Normal file
|
@ -0,0 +1,65 @@
|
|||
; *
|
||||
; * COPYRIGHT: See COPYING in the top level directory
|
||||
; * PROJECT: ReactOS kernel
|
||||
; * FILE: i386_RtlZeroMemory.asm
|
||||
; * PURPOSE: Memory functions
|
||||
; * PROGRAMMER: Magnus Olsen (magnusolsen@greatlord.com)
|
||||
; * UPDATE HISTORY:
|
||||
; * Created 20/07-2003
|
||||
; *
|
||||
|
||||
|
||||
BITS 32
|
||||
GLOBAL _RtlZeroMemory@8 ; (no bug) (max optimze code)
|
||||
SECTION .text
|
||||
|
||||
; *
|
||||
; * [1] VOID STDCALL RtlZeroMemory (PVOID Destination, ULONG Length);
|
||||
; *
|
||||
|
||||
_RtlZeroMemory@8:
|
||||
|
||||
mov ecx,dword [esp + 8 ] ; Length
|
||||
cmp ecx,0 ; if (Length==0) goto .zero
|
||||
je .zero
|
||||
|
||||
pushad ; Save all register on the stack
|
||||
mov edi, dword [esp + (4 + 32)] ; Destination
|
||||
xor eax,eax ; ZeroFillByte = 0
|
||||
|
||||
|
||||
|
||||
; code for take four byte each time it loop
|
||||
mov ebx,ecx ; temp_Length = Length
|
||||
shr ecx,2 ; Length = Length / sizeof(ULONG)
|
||||
jz .1byte ; if (Length==0) goto .1byte
|
||||
|
||||
shl ecx,2 ; Length = Length * sizeof(ULONG)
|
||||
sub ebx,ecx ; temp_Length = temp_Length - Length;
|
||||
jz .4bytes ; if (temp_Length==0) goto .4byte
|
||||
|
||||
; move 4byte and 1byte
|
||||
shr ecx,2 ; Length = Length / sizeof(ULONG)
|
||||
cld ; clear d flag
|
||||
rep stosd ; while (Length!=0) { (ULONG *) Destination[Length-1]=ZeroFillByte; Legnth = Legnth - 1 }
|
||||
mov ecx,ebx ; Length = temp_Length
|
||||
rep stosb ; while (Length!=0) { (UCHAR *) Destination[Length-1]=ZeroFillByte; Legnth = Legnth - 1 }
|
||||
popad ; restore register
|
||||
ret 8 ; return
|
||||
|
||||
; move 1byte
|
||||
.1byte:
|
||||
mov ecx,dword [esp + (12 +32) ] ; Length
|
||||
cld ; clear d flag
|
||||
rep stosb ; while (Length!=0) { (UCHAR *) Destination[Length-1]=ZeroFillByte; Legnth = Legnth - 1 }
|
||||
popad ; restore register
|
||||
ret 8 ; return
|
||||
|
||||
; move 4bytes
|
||||
.4bytes:
|
||||
shr ecx,2 ; Length = Length / sizeof(ULONG)
|
||||
cld ; clear d flag
|
||||
rep stosd ; while (Length!=0) { (ULONG *) Destination[Length-1]=ZeroFillByte; Legnth = Legnth - 1 }
|
||||
popad ; restore register
|
||||
.zero:
|
||||
ret 8 ; return
|
Loading…
Reference in a new issue