知识点:
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;
}
知识点:
__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
}
}

汇编 REPE/REPZ 指令,CMPSB指令的更多相关文章

  1. 80806汇编(5)——[BX]和Loop指令

    80806汇编(5)--[BX]和Loop指令 已经好久没写点东西了,国庆节就一直想弄个个人网站,这段时间一直在弄那个,虽然有现成的框架(Hexo),但是总想弄出自己的效果来,但是最后还是有些差强人意 ...

  2. 汇编-5.0-[BX]和loop指令

    1.要完整的描述一个内存单元,需要两种信息:1.内存单元的地址:2.内存单元的长度(类型). 2."()"表示一个寄存器或一个内存单元中的内容.如:(ax)表示ax中的内容. &q ...

  3. 汇编中resb这样的指令是什么意思?

    转载下来,方便以后查看 原作网址:http://blog.csdn.net/m1j2t3/article/details/5681657 汇编中resb这样的指令是什么意思? 还有我在汇编程序中看到这 ...

  4. ARM汇编(2)(指令)

    一,ARM汇编语言立即数的表示方法 十六进制:前缀:0x 十进制:无前缀 二制:前缀:0b 二,常用的ARM指令(标准的ARM语法,GNU的ARM语法) 1.@M开头系列 MOV R0, #12 @R ...

  5. 汇编 sub减法指令 比较指令CMP JZ条件跳转指令

    二.SUB指令 减法指令SUB (SUBtract) 格式: SUB A,B //A=A-B; 功能: 两个操作数的相减,即从A中减去B,其结果放在A中. 二.CMP 和JZ 指令 比较指令CMP 格 ...

  6. 汇编:MSR/MRS/BIC指令

    1.MRS指令MRS指令的格式为:MRS{条件}   通用寄存器,程序状态寄存器(CPSR或SPSR)MRS指令用于将程序状态寄存器的内容传送到通用寄存器中.该指令一般用在以下两种情冴: Ⅰ.当需要改 ...

  7. jsp的常用指令有哪些(编译指令/动作指令整理)

    jsp的常用指令有哪些(编译指令/动作指令整理) JSP动作指令 JSP - JSP中的脚本.指令.动作和注释

  8. javaWEB总结(15):jsp指令_page指令

    jsp指令 jsp指令是为jsp引擎设计的.他们并不直接产生任何可见输出,而只是告诉引擎如何处理jsp页面的其余部分. 目前定义了page,include和taglib这三种指令. page指令 (1 ...

  9. JSP指令--include指令(静态包含)

    转自:https://blog.csdn.net/chentiefeng521/article/details/51802319 include指令         include指令是文件加载指令, ...

随机推荐

  1. [我的阿里云服务器] —— FTP配置

    前言: FTP是我们用来向服务器上传或者下载文件很重要的一个工具,特别是云服务器,无法使用外设传送文件. 所以下面我们就来配置一下FTP,但是FTP的21端口,通常也是黑客进攻的一个目标,所以需要小心 ...

  2. Python笔记(九):字符串操作

    (一)    字符串 单引号.双引号.三重引号都可以作为字符串的开始和结束,三重引号可以直接输入多行字符串.三重引号可能一般是用来写多行注释. (二)    r和\ r使字符串成为原始字符串,忽略所有 ...

  3. 【转】C++11的enum class & enum struct和enum

    转自:https://blog.csdn.net/sanoseiichirou/article/details/50180533 C++标准文档——n2347(学习笔记) 链接:http://www. ...

  4. python容错

    #try: except: else: #为什么叫容错呢,先说说错误,这里说的错误并不是因为马虎或者什么原因在脚本中留下的bug,这个不能容掉,所谓容掉就是略过这个错误,要在测试时候发现并修正,需要容 ...

  5. MySQL索引原理以及类型

    1.什么是索引 索引是在MySQL的存储引擎上,对其表中的某个列或多列通过一些算法实现可快速查询出结果的一种方法. 2.为什么要有索引 就像一本书要有目录一样,我们可快速通过目录来查找对应的章节得出结 ...

  6. MySQL日常运维操作---持续更新

    1.查看当前连接数: 这些参数都是什么意思呢? Threads_cached ##mysql管理的线程池中还有多少可以被复用的资源 Threads_connected ##打开的连接数 Threads ...

  7. python + pyqt5 QlineEdit QMessageBox实现信息录入和消息弹框提醒

    本人现在在做自动化工具开发的工作,因此,记录下自己平时遇到的问题和解决之道,还有一些简单的小工具 以下为主代码 # --*-- coding:utf-8 --*-- from first import ...

  8. Oracle 截取字符串(截取固定分隔符中间的字符

    #### Oracle 截取字符串(截取固定分隔符中间的字符) #### ####  oracle 取固定分隔符之间的字符--方法一 substr+ instrSELECT  substr('12JP ...

  9. 复合梯形公式、复合辛普森公式 matlab

    1. 用1阶至4阶Newton-Cotes公式计算积分 程序: function I = NewtonCotes(f,a,b,type) % syms t; t=findsym(sym(f)); I= ...

  10. PyQt5--QCalendar

    # -*- coding:utf-8 -*- ''' Created on Sep 20, 2018 @author: SaShuangYiBing Comment: ''' import sys f ...