首页
社区
课程
招聘
[旧帖] [求助]关于指令预取,请指点一下 0.00雪花
发表于: 2010-3-19 20:31 1660

[旧帖] [求助]关于指令预取,请指点一下 0.00雪花

2010-3-19 20:31
1660
#include "stdafx.h"
#include "windows.h"

int _tmain(int argc, _TCHAR* argv[])
{
	int A=10;
	_asm
	{
		xor ecx,ecx
		mov dword ptr [_L1],0000B966H //mov cx , 0000H

_L1:
		mov cx , 0001H
		mov A,ecx

	}
	printf("%x\n",A);
	return 0;
}


编译器 VS2008 C++,  编译选项里加入  /SECTION:.text,RWE
按照指令预取的说法,这个程序应该输出1, 可是为何我的是输出0(即修改后的指令被执行了)

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (18)
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我猜测应该是cpu发现指令被修改了,所以丢弃了mov cx,0001h的结果,重新取指运行了,就像cpu处理跳转那样。
2010-3-19 22:06
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
能讲一下CPU对跳转指令有什么特殊处理嘛?
2010-3-20 00:51
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
猜呗,例如遇到jne,下一步该执行哪儿的指令?鬼才知道,要是知道就不用jne了,但也不能闲着啊,那就蒙一个,对了那就赚了,不对的话就把结果扔掉,照另一种情况去取指。最坏的情况也就跟闲着是一样的,所以大家就都开始猜了。
计算机组成原理课学的,不知现在有什么更先进的方法了没,反正新加了很多指令用于消除跳转,最常见的应该是SETcc指令了吧。
2010-3-20 02:36
0
雪    币: 8026
活跃值: (2511)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你用od调试没
2010-3-20 08:38
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
_asm
  {
    xor ecx,ecx
    mov dword ptr [_L1],0000B966H //mov cx , 0000H  [COLOR="Red"]**执行完这句 [/COLOR]

_L1:
    mov cx , 0001H                                  [COLOR="Red"]//这地方就变成了mov, cx,0000h了[/COLOR]
    mov A,ecx                                       [COLOR="Red"]//所以这里eax的值就是零[/COLOR]

  }


把红色的连起来读就好了  所以结果是 0  是正确的
2010-3-20 10:08
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
噢,对了,我在上面忘了说了,其实还有一种最常见的方法,就是延迟转移,不过这是由编译器完成的,也就是重排指令序列,例如本来是mov xxx,xxx    mov xxx,xxx    cmp xxx,xxx    jz   xxx,但是编译器会把cmp给提前一些,提到mov的前面,当然前提是mov指令没修改cmp的操作数,这样的话执行jz的时候cmp的结果就已经出来了,就不需要清空指令流水线了,也能提高效率。这种方法在现在的编译器里很常见,经常看到cmp和Jcc之间有两条mov之类的指令。
2010-3-20 10:47
0
雪    币: 75
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
int main(int argc, char* argv[])
{
  int A=10;
  _asm
  {
    xor ecx,ecx
    mov dword ptr [_L1],0000B966H //mov cx , 0000H

_L1:
    mov cx , 0001H
    mov A,ecx

  }
  printf("%x\n",A);
  return 0;
}

在我这:
---------------------------
tst.exe - 应用程序错误
---------------------------
"0x00401031" 指令引用的 "0x0040103b" 内存。该内存不能为 "written"。

要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定   取消   
---------------------------
2010-3-20 11:25
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=iEXE;778722]#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
int main(int argc, char* argv[])
{
int A=10;
_asm
{
xor ecx,ecx
mov...[/QUOTE]
很显然,你在链接的时候没加/SECTION:.text,RWE,肯定报错。试一下这样编译:
cl xxx.c /link /SECTION:.text,RWE
2010-3-20 11:49
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
指令预取是这么测的?
2010-3-20 12:02
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
还有一种很牛X的方法,就是第一次在跳和不跳之间随便蒙一个,从第二次开始就蒙成功率大于50%的那个,如果跳的成功率比较大于50%那就在取指时取跳后的指令送进流水线,如果不跳的成功率大于50%那就取不跳的指令,然后再看这次蒙对了没,然后修改成功率,然后下一次遇到跳转指令……这种方法能保证成功率大于50%。

我就只知道这几种方法了,不知还有别的方法没,欢迎指正或者补充。

顺便膜拜S大大。
2010-3-20 12:15
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
12
LS不要每次都加上那一句.
我头很晕~

LZ找台Intel 80486试试
2010-3-20 12:36
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
对了,又想起来一种,好像是从奔腾才开始用的,好像是叫动态预测技术,记不清了,就是加了一个BTB,其实就是一个小缓存,记住自己上次遇到这个指令的时候是跳了还是没跳,然后按上次情况的取指。希望没记错。

不过我觉得这种方法实在有点……我觉得这种方法不怎么样,不过估计实际效果不错,因为在软件中for、while之类的循环很多,这种方法遇到这种循环效果很好。

哪位有时间的话可以去翻一下Intel的那五本恐怖的pdf,看一下有这方面的介绍没。

再次膜拜S大大,并祝S大大的头晕病早日好转。
2010-3-20 12:56
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
14
其实...我觉得你一直答非所问
哇哈哈
2010-3-20 13:13
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
哈哈,lz只是问一下为啥输出0……不过在3L又加了一句问cpu对跳转指令的处理,我就说了一下cpu和编译器对跳转怎么处理以提高效率的一些简单的处理方法,不过都是以前学计算机组成原理时候从各种书上找来的东西,不知现在又有什么好的处理方法了。
就当回忆复习一下呗,反正闲着也无聊,总比宿舍的同学听着音乐玩游戏好一些……
2010-3-20 13:24
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
16
哈哈 楼猪的程序明明是一个简单的自修改

指令预取?不懂耶。。。我在6L已经说的很清楚咯。。。
2010-3-21 11:48
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
17
指令预取成立的话 :

   lea   di, L1
    mov   ax, cccc
   stosw
L1:
    nop
    nop

在 80486 上 L1 可能将会执行成 nop nop

LZ在现在的电脑上测不出来的.
2010-3-21 11:56
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
cpu发现指令
2010-3-21 14:00
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
修改了程序代码,WINDOWS下不能运行的。
2010-3-21 14:45
0
游客
登录 | 注册 方可回帖
返回
//