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>
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: char*、new和delete联合使用的问题
- 下一篇: PHP在字符串中查找指定字符串并删除的代码