利用repne scas byte ptr es:[edi]计算字符串长度

edi:存放字符串al:存放字符xrepne scas byte ptr es:[edi] :遍历字符串,每循环一次ecx-1,遇到字符x则停止汇编中一个很经典的计算字符串长度的方法便是利用了这条指令。
00406930  /$  89FA          mov edx,edi
00406932  |.  89C7          mov edi,eax         ;edi里为存放的字符串
00406934  |.  B9 FFFFFFFF   mov ecx,-0x1      ;ecx放入-1
00406939  |.  30C0          xor al,al                 ;al=0,将遍历所有字符串
0040693B  |.  F2:AE         repne scas byte ptr es:[edi]    ;以字节为单位遍历字符串,每循环一次cx-1
0040693D  |.  B8 FEFFFFFF   mov eax,-0x2
00406942  |.  29C8          sub eax,ecx        ;由于cx末尾多减了一次,因此要用-2来减去得到真正的长度
00406944  |.  89D7          mov edi,edx

举例:

#include<stdio.h>

int main()
{
    char str[] = "123456789";
    int strCount=0;
    int c = 0;
    _asm
    {
        lea edi,str
        mov ecx,0xFFFFFFFF
        xor al,al
        repne scas byte ptr es:[esi]
        mov eax,0xFFFFFFFE
        sub eax,ecx
        mov c,ecx

        mov strCount,eax
    }
    printf("ecx=%d  count = %d",c,strCount);
    return 0;
}

结果:

将AL里放入0x34,再试一次,程序将在循环3次后遇到4,此时停止循环,ecx=-5,count=3

时间: 2024-10-05 05:11:58

利用repne scas byte ptr es:[edi]计算字符串长度的相关文章

计算字符串长度,加车头

计算字符串长度,加车头.切换到IE模式下使用 0

计算字符串长度

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //1.定义字符串对象 NSString *str=[NSString stringWithString:@"zi fu chuan"]; //2.计算字符串长度 NSUInteger len = [str length]; //3.输出字符串长度 NSLog(@"zi fu

[转载] python 计算字符串长度

本文转载自: http://www.sharejs.com/codes/python/4843 python 计算字符串长度,一个中文算两个字符,先转换成utf8,然后通过计算utf8的长度和len函数取得的长度,进行对比即可知道字符串内中文字符的数量,自然就可以计算出字符串的长度了. value=u'脚本12' length = len(value) utf8_length = len(value.encode('utf-8')) length = (utf8_length - length)

PHP字符串截取,计算字符串长度

1 /** 2 * 字符串截取,支持中文和其他编码 3 * @param [string] $str [字符串] 4 * @param integer $start [起始位置] 5 * @param integer $length [截取长度] 6 * @param string $charset [字符串编码] 7 * @param boolean $suffix [是否有省略号] 8 * @return [type] [description] 9 */ 10 function msubs

Shell脚本中计算字符串长度的5种方法及从文本获取某一行

有时在Linux操作系统中需要计算某个字符串的长度,通过查询资料整理了下目前Shell中获取字符串的长度的多种方法,在这里分享给大家,方法如下: 方法1: 使用wc -L命令wc -L可以获取到当前行的长度,因此对于单独行的字符串可以用这个简单的方法获取,另外wc -l则是获取当前字符串内容的行数. 代码如下: echo "abc" |wc -L 方法2: expr length string使用expr length可以获取string的长度 方法3: awk获取域的个数,但是如果大

java计算字符串长度

/** * 计算字符串的显示长度,半角算1个长度,全角算两个长度 * @param s * @return */ public static int computeDisplayLen( String s ) { int len = 0; if ( s == null ) { return len; } for(int i = 0; i < s.length(); ++i) { char c = s.charAt(i); if(c >= '\u0000' && c <=

Linux下计算字符串长度的四种方法

在linux运维场景中,经常会碰到计算字符长度的场景,这里罗列四种方法: [[email protected] ~]# char="I love you" 方法一:[[email protected] ~]# echo ${#char} 方法二:[[email protected] ~]# expr length "$char" 方法三:[[email protected] ~]# echo $char|wc -L 方法四:[[email protected] ~]

汇编:计算字符串长度

;统计字符串长度 DATAS SEGMENT string db 'hello world demo0';待计算的字符串以0结尾 DATAS ends CODES SEGMENT ASSUME CS:CODES, DS:DATAS START: mov AX,DATAS mov DS,AX call strlen ;调用strlen子程序 mov ah,4CH int 21h strlen proc lea si,string;记录string的偏移地址 xor cx,cx ;cx记录字符个数

用C语言编写函数,实现strlen计算字符串长度的功能

本文介绍三种方法: 1.循环计数法,(设置一个计数器). 2.递归法,(函数调用自身进行计算) 3.指针-指针法,(库函数使用的是此方法) 现在列入程序: 方法1: /* 计数法 */ int my_strlen(char *p) { int number = 0; while (*p) { number++; p++; } return number; } 方法2: /* 递归法 */ int my_strlen(char *str1) { if (*str1 != '\0') { str1+