学习高手的代码风格之(一)---strlen反汇编分析

本文探讨了C标准库函数strlen的工作原理,通过对反汇编的分析揭示了加速strlen的关键——利用特定的魔数进行四位字节同时判断。详细解释了0x7EFEFEFF和0x81010100这两个魔数如何协助快速检测字符串结束,实现了比逐字节检查快四倍的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开个新坑,分析一些高端代码的反汇编程序,先从常见的下手,分析一下strlen。

函数介绍

size_t strlen( const char *string );
非常常用的一个函数,看起来应该很简单,所以从它下刀子了。
Return Value

Each of these functions returns the number of characters in string, excluding the terminal NULL. No return value is reserved to indicate an error.

Parameter

string

Null-terminated string

反汇编

4B2F5D60 strlen          proc near               ; DATA XREF: 4B28338E↑o
4B2F5D60                                         ; off_4B3792F8↓o
4B2F5D60
4B2F5D60 arg_0           = dword ptr  4
4B2F5D60
4B2F5D60                 mov     ecx, [esp+arg_0];//将字符串地址放到ecx中
4B2F5D64                 test    ecx, 3;//看字符串的地址是不是以00结尾,即判断字符串地址有没有以DWORD对齐
4B2F5D6A                 jz      short loc_4B2F5D90;//若对齐,则跳转,选用4个字节为单位的方式进行长度计算,否则按字节计算
4B2F5D6C
4B2F5D6C loc_4B2F5D6C:                           ; CODE XREF: strlen+1B↓j
4B2F5D6C                 mov     al, [ecx];//将ecx当前指向的字符放入al寄存器中
4B2F5D6E                 add     ecx, 1
4B2F5D71                 test    al, al;<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值