最近看了点汇编的东西,书上书长度可以使用
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>