汇编实现c语言标准库函数

extern "C" void _cdecl MyStrcpy(char * src,char *dest);
extern "C" int _cdecl MyStrlen(char * src);
extern "C" int _cdecl MyStrcmp(char * src,char * dest);
extern "C" int _cdecl MyStrchr(char * src,char ch);
extern "C" void _cdecl MyStrncpy(char * src,char * dest,int n);
extern "C" char * _cdecl MyStrstr(char * src,char * dest);  
extern "C" char * _cdecl MyStrcat(char * dest,char * src);
extern "C" int MyStrcspn(const char *s1, const char **2);
extern "C" char * _cdecl MyStrdup(char * str);
extern "C" char * _cdecl MyStrlwr(char * str);
extern "C" char * _cdecl MyStrnset(char * str,int ch,int n);  
extern "C" char * _cdecl MyStrrchr(char * str,int ch);
extern "C" char * _cdecl MyStrrev(char * str);
extern "C" char * _cdecl MyStrupr(char * str);
extern "C" void _cdecl MySwab(char * src, char * dest,int nByte);

 

 

.386
.model flat

public _MyStrstr

strstr_code segment byte public 'strstr_code'
assume cs:strstr_code

_MyStrstr proc near
push ebp
mov ebp , esp

push esi
push edi
push ecx
push edx

mov esi , [esp + 24] ;原串
mov edi , [esp + 28] ;模式串

push edi

;求出模式字符串的长度存放在edx寄存器中
mov edx , 0
strlen_again:
mov cl , [edi]
cmp cl , 00h
jz strlen_label
add edi , 1
add edx , 1
jmp strlen_again

strlen_label:
pop edi

mov eax , 0
;进行模式匹配,匹配结果存放在eax中
again:
cmp edx , 0
jz notfind_label

mov cl , [esi]
cmp cl , 00h
jz notfind_label

mov cl , [edi]
cmp cl , 00h
jz find_label
cmp cl , [esi]
jnz next_label

add edi , 1
add esi , 1
jmp again

next_label:
add esi , 1
mov edi , [esp + 28]
jmp again

find_label:
sub esi , edx
mov eax , esi
jmp exit_loop

notfind_label:
mov eax , 0
jmp exit_loop

exit_loop:
pop edx
pop ecx
pop edi
pop esi

mov esp , ebp
pop ebp

ret

_MyStrstr endp

strstr_code ends
end

 

 

.386
.model flat

public _MyStrncpy

strncpy_code segment byte public 'strncpy_code'
assume cs:strncpy_code

_MyStrncpy proc near
push ebp
mov ebp , esp

push esi
push edi
push ecx
push edx

mov esi , [esp + 24]
mov edi , [esp + 28]
mov ecx , [esp + 32]

mov eax , 0

sub ecx , 0
js exit_loop
jz exit_loop

again:
mov dl , [esi]
cmp dl , 00h
jz exit_loop
mov [edi] , dl
add esi , 1
add edi , 1
add eax , 1
cmp eax , ecx
jz exit_loop
jmp again

exit_loop:
pop edx
pop ecx
pop edi
pop esi

mov esp , ebp
pop ebp

ret

_MyStrncpy endp

strncpy_code ends
end

 

 

.386
.model flat

public _MyStrlen

strlen_code segment byte public 'strlen_code'
assume cs:strlen_code

_MyStrlen proc near
push ebp
mov ebp , esp

push ecx
push esi

mov eax , 0
mov esi , [esp + 16]

again:
mov cl , [esi]
cmp cl , 00h
jz exit_loop
add eax , 1
add esi , 1
jmp again

exit_loop:
pop esi
pop ecx

mov esp , ebp
pop ebp

ret

_MyStrlen endp

strlen_code ends
end

 

 

.386
.model flat

public _MyStrcpy

strcpy_code segment byte public 'strcpy_code'
assume cs:strcpy_code

_MyStrcpy proc near
push ebp
mov ebp , esp

push esi
push edi

mov esi , [esp + 16]
mov edi , [esp + 20]

again:
mov al , [esi]
mov [edi] , al
add edi , 1
add esi , 1
cmp al , 00h
jnz again

pop edi
pop esi

mov esp , ebp
pop ebp

ret
_MyStrcpy endp

strcpy_code ends
end

 

 

.386
.model flat

public _MyStrcmp

strcmp_code segment byte public 'strcmp_code'
assume cs:strcmp_code

_MyStrcmp proc near

push ebp
mov ebp , esp

push edi
push esi
push ecx

mov esi , [esp + 20]
mov edi , [esp + 24]
mov eax , 0

again:
mov cl , [esi]
cmp cl , 00h
jz equal
cmp cl , [edi]
jnz not_equal
add esi , 1
add edi , 1
jmp again

not_equal:
jnc above
mov eax , -1
jmp exit_loop

above:
mov eax , 1
jmp exit_loop

equal:
mov cl , [edi]
cmp cl , 00h
jnz below
mov eax , 0
jmp exit_loop

below:
mov eax , -1

exit_loop:
pop ecx
pop esi
pop edi

mov esp , ebp
pop ebp

ret
_MyStrcmp endp

strcmp_code ends
end

 

 

 

.386
.model flat

public _MyStrchr

strchr_code segment byte public 'strchr_code'
assume cs:strchr_code

_MyStrchr proc near
push ebp
mov ebp , esp

push edx
push esi

mov esi , [esp + 16]
mov dl , [esp + 20]
mov eax , 0

again:
mov dh , [esi]
cmp dh , dl
jz exit_loop
cmp dh , 00h
jz notfind
add esi , 1
add eax , 1
jmp again

notfind:
mov eax , -1
jmp exit_loop

exit_loop:
pop esi
pop edx

mov esp , ebp
pop ebp

ret

_MyStrchr endp

strchr_code ends
end

 

 

.386
.model flat

public _MyStrcat

strcat_code segment byte public 'strcat_code'
assume cs:strcat_code

_MyStrcat proc near
push ebp
mov ebp , esp

push esi
push edi
push ecx

mov edi , [esp + 20]
mov esi , [esp + 24]

push edi

again:
mov cl , [edi]
cmp cl , 00h
jz strcat_process
add edi , 1
jmp again

strcat_process:
mov cl , [esi]
cmp cl , 00h
jz exit_loop
mov [edi] , cl
add edi , 1
add esi , 1
jmp strcat_process

exit_loop:
pop edi
mov eax , edi

pop ecx
pop edi
pop esi

mov esp , ebp
pop ebp

ret
_MyStrcat endp

strcat_code ends
end

 

.386
.model flat

public _MyStrcspn

strcspn_code segment byte public 'strcspn_code'
assume cs:strcspn_code

_MyStrcspn proc near
push ebp
mov ebp , esp

push ecx

mov esi , [esp + 12]

again:
mov edi , [esp + 16]
mov cl , [esi]
cmp cl , 00h
jz not_find
add esi , 1
jmp exist

exist:
mov ch , [edi]
cmp ch , 00h
jz again
cmp ch , cl
jz find
add edi , 1
jmp exist

find:
mov eax , [esp + 12]
sub eax , esi
neg eax
sub eax , 1
jmp exit_loop

not_find:
mov eax , -1

exit_loop:
pop ecx
mov esp , ebp
pop ebp

ret

_MyStrcspn endp

strcspn_code ends
end

 

 

.386
.model flat

public _MyStrdup

data1 segment public 'data1'
rst db 256 dup(00h)
data1 ends

strdup_code segment byte public 'strdup_code'
assume cs:strdup_code

_MyStrdup proc near
push ebp
mov ebp , esp

push esi
push edi

mov esi , [esp + 16]

mov edi , offset rst

again:
mov al , [esi]
cmp al , 00h
jz exit_loop
mov [edi] , al
add esi , 1
add edi , 1
jmp again

exit_loop:
mov eax , offset rst

pop edi
pop esi

mov esp , ebp
pop ebp

ret

_MyStrdup endp

strdup_code ends
end

 

 

.386
.model flat

public _MyStrlwr

strlwr_code segment byte public 'strlwr_code'

assume cs:strlwr_code

_MyStrlwr proc near
push ebp
mov ebp , esp

push esi

mov esi , [esp + 12]

again:
mov al , [esi]
cmp al , 00h
jz exit_loop
cmp al , 41h
jae preconvert
add esi , 1
jmp again

preconvert:
cmp al , 5ah
jbe convert
add esi , 1
jmp again

convert:
add al , 32
mov [esi] , al
add esi , 1
jmp again

exit_loop:
mov eax , [esp + 12]

pop esi

mov esp , ebp
pop ebp

ret
_MyStrlwr endp

strlwr_code ends
end

 

 

.386
.model flat

public _MyStrnset

strnset_code segment byte public 'strnset_code'
assume cs:strnset_code

_MyStrnset proc near
push ebp
mov ebp , esp

push esi

mov esi , [ebp + 8]
mov edx , [ebp + 12]
mov ecx , [ebp + 16]

again:
sub ecx , 1
jb exit_loop
mov [esi] , dl
add esi , 1
jmp again

exit_loop:
mov eax , [ebp + 8]

pop esi

mov esp , ebp
pop ebp

ret
_MyStrnset endp

strnset_code ends
end

 

.386
.model flat

public _MyStrrchr

strrchr_code segment byte public 'strrchr_code'
assume cs:strrchr_code

_MyStrrchr proc near

push ebp
mov ebp , esp
push esi

mov eax , 0
mov esi , [ebp + 8]
mov eax , [ebp + 12]

mov edx , 0

again:
mov cl , [esi]
cmp cl , 00h
jz exit_loop
cmp cl , al
jz equal
add esi , 1
jmp again

equal:
mov edx , esi
add esi , 1
jmp again

exit_loop:
mov eax , edx
pop esi
mov esp , ebp
pop ebp

ret

_MyStrrchr endp

strrchr_code ends
end

 

.386
.model flat

public _MyStrrev

strrev_code segment byte public 'strrev_code'
assume cs:strrev_code

_MyStrrev proc near
push ebp
mov ebp , esp

push esi

mov esi , [ebp + 8]
mov ecx , 0

again:
mov eax , 0
mov al , [esi]
cmp al , 00h
jz prerev
add ecx , 1
add esi , 1
push eax
jmp again

prerev:
mov esi , [ebp + 8]

start:
sub ecx , 1
jb exit_loop
pop eax
mov [esi] , al
add esi , 1
jmp start

exit_loop:
mov eax , [ebp + 8]
pop esi
mov esp , ebp
pop ebp

ret
_MyStrrev endp

strrev_code ends
end

 

 

.386
.model flat

public _MyStrupr

strupr_code segment byte public 'strupr_code'
assume cs:strupr_code

_MyStrupr proc near
push ebp
mov ebp , esp

push esi

mov esi , [ebp + 8]

again:
mov cl , [esi]
cmp cl , 00h
jz exit_loop
cmp cl , 61h
jae above_than
add esi , 1
jmp again

above_than:
cmp cl , 7ah
ja invalid
sub cl , 32
mov [esi] , cl
add esi , 1
jmp again

invalid:
add esi , 1
jmp again

exit_loop:
mov eax , [ebp + 8]
pop esi

mov esp , ebp
pop ebp

ret
_MyStrupr endp

strupr_code ends
end

 

 

.386
.model flat

public _MySwab

swab_code segment byte public 'swab_code'
assume cs:swab_code

_MySwab proc near
push ebp
mov ebp , esp

push esi
push edi

mov esi , [ebp + 8]
mov edi , [ebp + 12]
mov ecx , [ebp + 16]

again:
cmp ecx , 0
jbe exit_loop
mov al , [esi]
cmp al , 00h
jz exit_loop
mov [edi + 1] , al
mov al , [esi + 1]
mov [edi] , al

add edi , 2
add esi , 2
sub ecx , 2
jmp again

exit_loop:

pop edi
pop esi

mov esp , ebp
pop ebp

ret
_MySwab endp

swab_code ends
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值