F3:             prefix rep:  
 C3              retn

OD中看到这,弄不明白第一句是什么意思了,有人能告诉一下吧,谢谢了,我在线等高人帮忙

答案:

rep 是前缀指令,本身没有含义,是不确定的,用来修饰后面的指令用的 
在这个C3前面的REP是没有意义

=======================================================================

  • 深入浅出指令编码之二:指令格式(3)
  • 标 题:深入浅出指令编码之二:指令格式(3)
  • 作 者:mik
  • 时 间:2008-11-30 00:49
  • 链 接:http://bbs.pediy.com/showthread.php?t=77757

二、  增强指令功能
一些Prefix对Opcode 进行补充,增强指令的功能,优化指令执行,看下面这段c代码:

引用:

char *move_char(char *d, char *s, unsigned count)
{
    char *p = d;
    while (count--)
        *d++ = *s++;

    return p;
}

这是典型的、经典的字符串复制c代码,对应以下类似的汇编代码:

引用:

move_char:
        push ebp
        mov ebp, esp
        sub esp, 0xc
        mov eax, [ebp+8]
        mov edi, eax
        mov esi, [ebp+0xc]
        mov ecx, dword ptr [ebp+0x10]

move_loop:
        mov al, byte ptr [esi]
        mov byte ptr [edi], al
        inc esi
        inc edi
        dec ecx
        test ecx,ecx
        jnz move_loop

mov esp, ebp
        pop ebp
        ret

上面的代码性能低下,是很死板的实现,优化的空间巨大。
x86为串提供了相应的串操作指令(ins,outs,lods,stos,scas,cmps),对这些串指令提供prefix来增强和优化这些指令:
● F3: rep prefix 或 repe prefix
● F2: repne prefix

1、rep prefix
重复进行串操作,仅应用于ins,outs,movs,lods,stos 这些不改变标志位的串指令,结束条件是ECX为0。
使用串操作及rep prefix上面的汇编代码可简单如下:
move_char:
… …
mov eax, [ebp+8]
mov edi, eax
mov esi, [ebp+0xc]
mov ecx, [ebp+0x10]
rep movsb… …

rep movsb的操作原理和上面的C代码一致,下面是伪码:

引用:

while (ecx != 0) {
    c = ds:[esi];
    es:[edi] = c;
    esi = esi + 1
    edi = edi + 1
    ecx = ecx  1;
}

2、repe prefix
F3的另个prefix意思是 repe/repz,用于改变标志位的串操作:scas,cmps 意思是当相等并且循环次数(ecx)不为0时进行重复操作。
结束条件是ecx为0或者ZF标志位为0,或者说是循环条件是(ecx不为0,并且ZF标志位为1)
常见运用一些跳过字符的逻辑上,如下面C代码,用于截除串前面空格

引用:

char *trim(char *s)
{
    while (*s && *s == ‘ ‘) s++;
    return s;
}

而用伪码表示为:

引用:

While (ecx != 0 and ZF = 1) {
    Ecx = ecx  1;
    cmps
}

rep 与 repe/repz 是相同的prefix,作用不用体现在对串指操作上:
movsb 的opcode是A4,scasb 的opcode 是AE,对于下面的encode:
F3 A4:这时 F3 prefix是REP
F3 AE:这时 F3 prefix是REPZ

3、  repne/repnz prefix
F2:这个prefix是repne/repnz,意思是循环次数(ecx)不为0并且ZF=0时重复操作。结束条件是:ecx=0或者ZF=1,同样也是用于改变标志位的串操作scas和cmps
常见一些查找字符的逻辑上,如下面C代码:

引用:

char *get_c(char *s, char c)
{
    while (*s && *s != c) s++;
    return s;
}

而用伪码表示为:

引用:

While (ecx !=0 and ZF != 1) {
    Ecx = ecx  1;
    cmps
}

三、  附加功能(LOCK)
对于写内存的一些指令增加了锁地址总线的功能,这些写内存的指令如常见的mov,add等指令,通过Lock prefix来实现这功能,使用Lock prefix将会使processor产生LOCK# 信号锁地址总线
F0:LOCK prefix仅作用于写内存操作的指令上,也就是说:目标操作数为内存的指令。

到此 x86 prefix 讲解完毕

汇编指令prefix rep:相关推荐

  1. 32位汇编寄存器及汇编指令

    32位CPU所含有的寄存器有: 4个数据寄存器(EAX.EBX.ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES.CS.SS.DS.FS和 ...

  2. 寄存器和常用的汇编指令

    为了学习需要,最近查看了一下汇编,因为是个初学者很多东东基本不动,所以记录一下基本指令和寄存器,那样就会对汇编慢慢的适应,看得懂那些华丽花哨的反汇编代码了.学习这个东东基本是为了破解和逆向工程使用,因 ...

  3. 8086 汇编指令手册查询(转)

    8086 汇编指令手册查询,编语言是一种面向机器的语言.它能够利用计算机所在硬件性并能直接控制硬件,在微型计算机系统的开发应用和过程控制和特别受到重视. 一.数据传输指令 -------------- ...

  4. Windows内核 基本汇编指令

    1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...

  5. 分析函数调用的汇编指令

    同样一段c++代码生成的汇编指令可能会不一样.有多种原因,例如编译器.调用约定或者底层平台. 今天要分析的是cdecl在x86机器上用visual c++ 2005上的编译结果. 首先需要设置一下项目 ...

  6. C代码+汇编 C的 函数汇编学习分析 rep stos dword ptr [edi]

    如分析有误,请在评论区中,指出 谢谢合作 主要是分析C的函数调用在汇编中的执行流程 本章主要是说一下函数调用时堆栈的变化,重点理解部分 C代码 #include"stdafx.h" ...

  7. 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码...

    浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...

  8. ARM汇编指令调试方法

    学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...

  9. 【整理】X86常用的汇编指令及寄存器

    X86常用的汇编指令及寄存器 这几天需要用到反编译的工具,发现好多年不用的汇编快忘光了,赶紧整理一下. 一.寄存器 在X86指令集中寄存器分为四类:通用寄存器.指令指针寄存器.段寄存器.标志寄存器. ...

最新文章

  1. redis(2)--数据结构与对象
  2. Java ClassLoader findLibrary()方法与示例
  3. cxf开发webservice服务端怎么返回固定的报文格式_Spring boot webservice怎么玩? 第277篇...
  4. Selenium操作页面元素
  5. python 多态 锁_python 上下文管理器,多态,数据锁定与自省,
  6. 一个学习爱好者,应该怎么学习golang
  7. SDRAM之持续中。。。。。。
  8. vue中安装axios
  9. step7设置pcpg_安装STEP7编程软件过程及PG/PC接口设置
  10. Linux网络操作命令
  11. 06CookieSession-12. HttpSession的钝化和活化
  12. 2021年美容师(高级)考试及美容师(高级)考试题
  13. 【C语言】求一个四位整数各位数字之和
  14. linux串口通讯延时,linux下串口通讯参数设置
  15. 详细设计说明书的书写格式
  16. word论文页码的设置(封面无编号、目录罗马数字和正文阿拉伯数字)
  17. Red Hat Enterprise Linux 7 高薪运维入门 - 孙亚南、李勇
  18. 华为堡垒机_华为容灾好用,Hypervisor
  19. Pointcut注解表达式@target、@annotation、@within、this、target、within等
  20. dp主机_HDMI和DP是什么?一文看懂两种接口的区别

热门文章

  1. 几种类加载器的使用体会
  2. 编写业务层和持久层事务控制代码并配置spring的ioc
  3. Nginx与Zuul之间区别
  4. 集合元素处理(传统方式)
  5. SpringBoot_配置-配置文件的加载位置
  6. 如何判断对象是否存活之引用计数发
  7. Bootstrap全局css样式_代码
  8. SpringBoot 路径处理
  9. 为什么用 php widget,ThinkPHP的Widget扩展实例
  10. 互联网协议套件(TCP/IP)及七层OSI模型