汇编指令prefix rep:
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:相关推荐
- 32位汇编寄存器及汇编指令
32位CPU所含有的寄存器有: 4个数据寄存器(EAX.EBX.ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES.CS.SS.DS.FS和 ...
- 寄存器和常用的汇编指令
为了学习需要,最近查看了一下汇编,因为是个初学者很多东东基本不动,所以记录一下基本指令和寄存器,那样就会对汇编慢慢的适应,看得懂那些华丽花哨的反汇编代码了.学习这个东东基本是为了破解和逆向工程使用,因 ...
- 8086 汇编指令手册查询(转)
8086 汇编指令手册查询,编语言是一种面向机器的语言.它能够利用计算机所在硬件性并能直接控制硬件,在微型计算机系统的开发应用和过程控制和特别受到重视. 一.数据传输指令 -------------- ...
- Windows内核 基本汇编指令
1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...
- 分析函数调用的汇编指令
同样一段c++代码生成的汇编指令可能会不一样.有多种原因,例如编译器.调用约定或者底层平台. 今天要分析的是cdecl在x86机器上用visual c++ 2005上的编译结果. 首先需要设置一下项目 ...
- C代码+汇编 C的 函数汇编学习分析 rep stos dword ptr [edi]
如分析有误,请在评论区中,指出 谢谢合作 主要是分析C的函数调用在汇编中的执行流程 本章主要是说一下函数调用时堆栈的变化,重点理解部分 C代码 #include"stdafx.h" ...
- 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码...
浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...
- ARM汇编指令调试方法
学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...
- 【整理】X86常用的汇编指令及寄存器
X86常用的汇编指令及寄存器 这几天需要用到反编译的工具,发现好多年不用的汇编快忘光了,赶紧整理一下. 一.寄存器 在X86指令集中寄存器分为四类:通用寄存器.指令指针寄存器.段寄存器.标志寄存器. ...
最新文章
- redis(2)--数据结构与对象
- Java ClassLoader findLibrary()方法与示例
- cxf开发webservice服务端怎么返回固定的报文格式_Spring boot webservice怎么玩? 第277篇...
- Selenium操作页面元素
- python 多态 锁_python 上下文管理器,多态,数据锁定与自省,
- 一个学习爱好者,应该怎么学习golang
- SDRAM之持续中。。。。。。
- vue中安装axios
- step7设置pcpg_安装STEP7编程软件过程及PG/PC接口设置
- Linux网络操作命令
- 06CookieSession-12. HttpSession的钝化和活化
- 2021年美容师(高级)考试及美容师(高级)考试题
- 【C语言】求一个四位整数各位数字之和
- linux串口通讯延时,linux下串口通讯参数设置
- 详细设计说明书的书写格式
- word论文页码的设置(封面无编号、目录罗马数字和正文阿拉伯数字)
- Red Hat Enterprise Linux 7 高薪运维入门 - 孙亚南、李勇
- 华为堡垒机_华为容灾好用,Hypervisor
- Pointcut注解表达式@target、@annotation、@within、this、target、within等
- dp主机_HDMI和DP是什么?一文看懂两种接口的区别