.data
.set ZERO , 0b00000000000000000000000000000000
strlen:
.data
.set ZERO , 0b00000000000000000000000000000000
在这里利用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 , c