strlen的汇编实现

最近看了点汇编的东西,书上书长度可以使用

repne scasb指令获取字符串长度,于是我测试了一下代码

<span style="font-size:12px;">__declspec(noinline) int getlen(const char* str)
{
	return strlen(str);
}

int _tmain(int argc, _TCHAR* argv[])
{
	char* name2 = "BI";
	int len2 = getlen(name2);
}</span>


首先汇编代码中并没有call strlen的影子,说明strlen完全被内联,其汇编代码为

<span style="font-size:12px;">__declspec(noinline) int getlen(const char* str)
{
	return strlen(str);
00181010 8D 50 01             lea         edx,[eax+1]  
00181013 8A 08                mov         cl,byte ptr [eax]  
00181015 40                   inc         eax  
00181016 84 C9                test        cl,cl  
00181018 75 F9                jne         getlen+3 (181013h)  
0018101A 2B C2                sub         eax,edx  
}
0018101C C3                   ret  </span>


并没有使用scasb指令,而是直接比对字节内容。

另外程序编译时开启了优化,发现调用getlen函数时参数通过eax传递,看来开启了优化,参数传递并不一定依赖栈空间 (注:x86)

<span style="font-size:12px;">001810BA B8 14 21 18 00       mov         eax,offset string "BI" (182114h)  
001810BF E8 4C FF FF FF       call        getlen (181010h)  </span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值