首页
社区
课程
招聘
问个简单的汇编代码问题...
发表于: 2010-7-10 21:26 3504

问个简单的汇编代码问题...

2010-7-10 21:26
3504
;子程序名:strchr
;功能:判断字符是否属于字符串
;入口参数:ds:si
;al=字符代码
;出口:CF=0;出现 ax为字符首次出现的偏移
;CF 表示不存在     
strchr proc
       push bx
       push si
       cld
       mov bl,al
       test si,1;为什么要保证si是偶数位?实在想不明白?这个地方..小菜认为貌似没这句也没关系呀
       jz strchr1
       lodsb
       cmp al,bl
       jz strchr3
       and al,al
       jz strchr2
strchr1:
        lodsw
        cmp al,bl
        jz strchr4
        and al,al
        jz strchr2
        cmp ah,bl
        jz strchr3
        and ah,ah
        jnz strchr1
strchr2:
         stc
         jmp short strchr5
strchr3:
         inc si
strchr4:
         lea ax,[si-2]
strchr5:
         pop si
         pop bx
         ret
strchr  endp

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 1
支持
分享
最新回复 (5)
雪    币: 246
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
偶地址用word操作(lodsw)速度比使用lodsb一次装入比较一字节快,这段代码是先判断如果开始地址为奇,是则先取第1字节来判断,之后每次取两字节来判断,这样做是基于速度优化。

其实,这也不是最优代码,还可以考虑lodsd。
2010-7-10 22:13
0
雪    币: 306
活跃值: (85)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
3
如果地址是奇数的话?不能用lodsw?
2010-7-10 22:21
0
雪    币: 246
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
可以,但处理后一个字节会消耗更多时间。
2010-7-10 22:28
0
雪    币: 306
活跃值: (85)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
5
这样,它是按照速度这方面考虑了?呵呵~~~谢谢..
实现方面没问题,即使不加那个判断也行了?...
2010-7-10 22:33
0
雪    币: 246
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
不加那个判断当然也行,但对于常用函数速度优化至关重要。

再说的详细一点,这里涉及到CPU访问内存的硬件知识,汇编书籍很少讲,奇地址下使用lodsw存在2次访问内存的情况,如:

以64位数据总线奔腾为例子,8个字节宽度的内存连在总线上,
CPU总是一次从偶地址0、8。。。,读写并排的8个字节:
  0,     1,    2,    3,    4,    5,    6,    7,
  8,     9,   10,   11,   12,   13,   14,   15,
  .......

当16位字的地址为 0~6 时没问题,但地址为 7 时就包含了7,8两个字节,这需要2次内存操作才能完成。

对于不同的CPU配不同的内存,这个问题的严重程度是不一样的,对CPU配双通道DDR(128位)这个问题小一点,但对16、32位CPU这个问题更严重。特别是16位CPU,所有奇地址lodsw都是2次内存访问!
2010-7-10 22:39
0
游客
登录 | 注册 方可回帖
返回
//