几种CRT函数的汇编实现
2013-01-18 14:38
218 查看
.data
.set ZERO , 0b00000000000000000000000000000000
strlen:
在这里利用scasb命令,scasb将di指向的数据与al比较,repne表示重复扫描,如果不相等,则di递增指向下一个数据,cx也递减,如此重复,知道遇到结束符‘\0’为止。代码中利用eax存储常值0与数据比较,利用ecx累计长度,由于累计后是负值,所以将其取正返回(拉长32位取反减一)#asm_strlen(const char *data) __asm_strlen: pushl %ebp movl %esp , %ebp movl 8(%ebp) , %edi movl $-1 , %ecx movl $0 , %eax cld repne scasb orl $ZERO , %ecx notl %ecx decl %ecx movl %ebp , %esp popl %ebp movl %ecx , %eax ret
strncpy:
这里利用lodsb和stosb两个指令,前者将数据从si载入al,后者再将数据再从al存到di中,所以,将参数source的地址放入esi中,将参数dest的地址放入edi,然后进入循环,累减ecx(len),直到len复制完了跳出。#asm_strncpy(char *dest , char *source , int len) .global __asm_strncpy __asm_strncpy: pushl %ebp movl %esp , %ebp movl 16(%ebp) , %ecx movl 12(%ebp) , %esi movl 8(%ebp) , %edi movl %ecx , %ebx 1: lodsb stosb decl %ecx jne 1b movl %ebp , %esp popl %ebp orl %ecx , %ecx jne 2 ret 2: subl %ecx , %ebx movl %ebx , %eax ret
strchr:
这里大部分和strlen一样,只是将比较的内容改为参数__c。#asm_strchr( char *__s, int __c ) .global __asm_strchr __asm_strchr: pushl %ebp movl %esp , %ebp movl 12(%ebp) , %eax movl 8(%ebp) , %edi movl %edi , %ebx movl $-1 , %ecx cld repne scasb orl $ZERO , %ecx notl %ecx decl %ecx movl %ebp , %esp popl %ebp addl %ecx , %ebx #movl (%ebx) , %eax #return current char movl %ebx , %eax # return string ret
相关文章推荐
- 汇编:简约不简单的不定参函数实现方法
- memcopy()函数c语言实现和汇编实现比较
- 实现一个函数,算出有几种括号的放法可使该表达式得出result值
- 9.11 给定一个布尔表达式,由0、1、&、|、^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式得出result的值。
- 用汇编实现数字转化为字符串的函数itoa
- strlen函数实现的几种方法
- 用汇编实现跨越类中非static函数的线程回调
- 函数调用的汇编实现浅析
- 一步步点亮LED5_汇编编写延时函数并实现LED闪烁效果
- mips汇编语言之实现swap函数
- 内核空间几种长延时函数实现策略的优劣讨论
- 不使用字符串库函数实现字符串复制的几种方法
- 05 printf函数可变参数的实现原理之汇编分析
- C函数返回结构体在汇编下的实现
- 【汇编】命令行下获取用户输入,实现类似C语言fgets函数功能
- 汇编:简约不简单的不定参函数实现方法
- crt new实现方法,Dll导出函数返回string和动态内存陷阱
- 陆续一些常用函数汇编实现
- 使用IDA反汇编系统NTReadVirtualMemory函数,模拟实现里边的部分函数
- 汇编语言学习系列 函数实现