-
汇编 REPE/REPZ 指令,CMPSB指令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
知识点: REPE/REPZ 指令 CMPSB 指令 一、CMPSB //cmp //sub //SCASB//scasw//scasd cmp byte ptr [edi],al //对标志位的影响相当于sub指令 word,dword //同时还会修改寄存器EDI的值:如果标志DF为0,则 inc EDI;如果DF为1,则 dec EDI。 //CMPSB cmps byte ptr [edi],byte ptr [esi] //对标志位的影响相当于sub指令 cmps word ptr //cmpsw cmps dword ptr //cmpsd //同时还会修改寄存器EDI的值:如果标志DF为0,则 inc EDI;如果DF为1,则 dec EDI。 二、REPE/REPZ 指令 //上一节课我们了解了REPNE/REPNZ REPNE SCAS BYTE PTR ES:[EDI] // 当ECX!=0并且ZF==0时 重复执行后边的指令 每执行一次ECX的值减1 REPE/REPZ cmpsb //// 当ECX!=0并且ZF=1时 重复执行后边的指令 每执行一次ECX的值减1 三、代码测试 1、比较字符串是否相等 MOV EDI,s1 MOV ESI,s2 MOV ECX,0xFFFFFFFF XOR EAX,EAX //查找字串结束标志 '\0' eax=0 REPNE SCASB // edi,al NOT ECX //计算字串长度存ECX MOV EDI,s1 mov ESI,s2 XOR EDX,EDX REPE CMPSB //不相等则退出 int _tmain( int argc, _TCHAR* argv[]) { char *s1= "abcde21" ; char *s2= "abcde1" ; __asm { //mov al,0 xor al,al //eax=0 mov edi,s1 // mov ecx,-1 //0xFFFF FFFF repnz scasb; not ecx // '\0' 计算s1字串长度,指定repz循环次数 mov edi,s1 mov esi,s2 repz cmpsb // edi,esi //ZF=1 && ECX=0 字串相等 } return 0; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
知识点: __declspec ( naked ) 纯汇编 堆栈平衡 参数传递 用纯汇编封装函数strcmpA 一、CMPSB //cmp //sub //SCASB//scasw//scasd cmp byte ptr [edi],al //对标志位的影响相当于sub指令 word,dword //同时还会修改寄存器EDI的值:如果标志DF为0,则 inc EDI;如果DF为1,则 dec EDI。 //CMPSB cmps byte ptr [edi],byte ptr [esi] //对标志位的影响相当于sub指令 cmps word ptr //cmpsw cmps dword ptr //cmpsd //同时还会修改寄存器EDI的值:如果标志DF为0,则 inc EDI;如果DF为1,则 dec EDI。 二、REPE/REPZ 指令 //上一节课我们了解了REPNE/REPNZ REPNE SCAS BYTE PTR ES:[EDI] // 当ECX!=0并且ZF==0时 重复执行后边的指令 每执行一次ECX的值减1 REPE/REPZ cmpsb //// 当ECX!=0并且ZF=1时 重复执行后边的指令 每执行一次ECX的值减1 三、代码测试 1、比较字符串是否相等 int _tmain( int argc, _TCHAR* argv[]) { char *s1= "abcde21" ; char *s2= "abcde1" ; __asm { //mov al,0 xor al,al //eax=0 mov edi,s1 // mov ecx,-1 //0xFFFF FFFF repnz scasb; not ecx // '\0' 计算s1字串长度,指定repz循环次数 mov edi,s1 mov esi,s2 repz cmpsb // edi,esi //ZF=1 && ECX=0 字串相等 } return 0; } __declspec ( naked ) int strcmpA( char * s1, char *s2) // scasw strcmpW { __asm { push ebp // esp+4+4 s1 //esp+4+8 mov ebp,esp //构建栈底 //mov al,0 xor al,al //eax=0 mov edi,[ebp+4+4] // mov ecx,-1 //0xFFFF FFFF repnz scasb; not ecx // '\0' 计算s1字串长度,指定repz循环次数 mov edi,[ebp+4+4] mov esi,[ebp+4+8] repz cmpsb // edi,esi //[edi-1] [esi-1] xor eax,eax xor edx,edx mov al,[edi-1] mov dl,[esi-1] sub eax,edx //相等eax=0,大于返回结果>0 小于<0 pop ebp //栈平衡 retn } } |
原文:https://www.cnblogs.com/whzym111/p/6373068.html
最新更新
Objective-C语法之代码块(block)的使用
VB.NET eBook
Add-in and Automation Development In VB.NET 2003 (F
Add-in and Automation Development In VB.NET 2003 (8
Add-in and Automation Development in VB.NET 2003 (6
Add-in and Automation Development In VB.NET 2003 (5
AddIn Automation Development In VB.NET 2003 (4)
AddIn And Automation Development In VB.NET 2003 (2)
Addin and Automation Development In VB.NET 2003 (3)
AddIn And Automation Development In VB.NET 2003 (1)
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
武装你的WEBAPI-OData入门
武装你的WEBAPI-OData便捷查询
武装你的WEBAPI-OData分页查询
武装你的WEBAPI-OData资源更新Delta
5. 武装你的WEBAPI-OData使用Endpoint 05-09
武装你的WEBAPI-OData之API版本管理
武装你的WEBAPI-OData常见问题
武装你的WEBAPI-OData聚合查询
OData WebAPI实践-OData与EDM
OData WebAPI实践-Non-EDM模式