汇编-条件跳转与重复指令

前端之家收集整理的这篇文章主要介绍了汇编-条件跳转与重复指令前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

条件跳转

速记方法

@H_404_5@
  • j(jmp)
  • z(zero)
  • n(not)
  • e(equal)
  • g(greater)
  • l(less)
  • a(above,无符号)
  • b(below,无符号)

    汇编指令x86下  指令+目的操作数+原操作数 比较是用目的操作数去和原操作数比较
    
    jz loc   当cmp的两个值相等的时候跳转,否则继续履行下1条
    jnz loc  当cmp的两个值不相等的时候跳转,否则继续履行下1条
    
    je loc   当cmp的两个值相等的时候跳转,否则继续履行下1条
    jne loc  当cmp的两个值不相等的时候跳转,否则继续履行下1条
    
    jg loc  (cmp eax,ebx)当eax大于ebx时履行跳转,否则继续履行下1条
    jge loc (cmp eax,ebx)当eax大于或等于(不小于)ebx时履行跳转,否则继续履行下1条
    
    ja loc  ja=jg 不过是无符号数比较
    jae loc jae = jge 不过是无符号数比较
    
    jl loc  (cmp eax,ebx)当eax小于ebx时履行跳转,否则继续履行下1条
    jle loc (cmp eax,ebx)当目的操作数小于或等于原操作数时,跳转,否则履行下1条
    
    jb loc 和 jl 1样,不过是无符号的比较
    jbe loc 和jle1样,不过是无符号数的比较
    
    后面两个不怎样经常使用,但是记录1下吧:
    jo loc 如果上1条指令履行后(of=1),则跳转(溢出跳转)
    js loc 如果符号位被置位(sf=1),则跳转
    
    jecxz loc (jmp if ecx = 0)
    
  • 重复指令

    这里说的重复指令是对字符串数组的操作。字符串数组操作的最小原子步骤1般为:
    movsx,cmpsx,stosx,scasx,x则可以是b(byte),w(word),d(dword),这1部份会在后面细讲。
    使用这些操作时,用esi(source addr)充当源地址,edi(destination addr)充当目的地址。

    由于字符串的比较和移动,需要对长度作以限制,所以需要1个长度参数,1般用ecx来计数。
    重复指令用rep来表示,终止条件为:

    @H_404_5@
  • rep 当ecx不为0的时候重复后面指令
  • repe,repz 当ecx不为0,并且 zf=1的时候重复后面指令
  • repne ,repnz 当ecx不为0,并且 zf=0的时候重复后面指令
  • REP/REPE/REPNE

    The string instructions may be prefixed by REP/REPE/REPNE which will repeat the
    instructions according to the following conditions:

                 rep       decrement cx ; repeat if cx is not zero
                 repe      decrement cx ; repeat if cx not zero AND zf = 1
                 repz      decrement cx ; repeat if cx not zero AND zf = 1
                 repne     decrement cx ; repeat if cx not zero AND zf = 0
                 repnz     decrement cx ; repeat if cx not zero AND zf = 0
    

    Here,‘e’ stands for equal,‘z’ is zero and ‘n’ is not. These repeat instructions
    should NEVER be used with a segment override,since the 8086 will forget the
    override if a hardware interrupt occurs in the middle of the REP loop.

    在x86下,使用重复前缀来做多字节操作,rep增加esi 和edi这两个偏移,并且同时减少ecx的值,rep前缀会不断重复,直到终止条件到来。因此,需要在使用前初始化esi,edi,ecx

    @H_404_5@
  • movsb 从esi指向的地址中获得1个字节,并寄存到edi中(需要用df方向标志来肯定移动方向,esi+1,edi+1或esi⑴,edi⑴)
  • cmpsb 用于esi和edi字符串的比较(单字节比较),更新ZF标志位。(memcmp
  • scasb 用于从字符串中搜索1个值,这个值由al指出,所以需要初始化al。注意,不是用esiedi比较,寻觅到的位置会寄存到esi中。
  • stosb 用于将值寄存到 edi指向的地址。(memset
  • rep指令的经常使用组合

    @H_404_5@
  • repe cmpsb 比较esiedi指向的字符串,当字符串不同或ecx=0的时候停止
  • rep stosb (repeat store string by byte)用于用1个给定的值初始化缓冲区中所有字节。edi包括了缓冲区地址,al包括了初始值。
  • rep movsb 将esi指向的字符串复制到edi中,长度为ecx。(单字节复制,rep加偏移1,ecx表示重复次数)
  • repne scasb 从edi搜索单字节(al),并将结果放在esi中,ecx为缓冲区长度。
  • 比较movsb和stosb

    movsb需要指定两个字符串,esi and edi.

    stosb只需要指定edi,要复制的是单个字节,由al给定。

    参考资料:

    歹意代码分析实战P74⑺6

    指令集查询

    猜你在找的PHP相关文章