能力值:
( LV2,RANK:10 )
|
-
-
2 楼
我猜测应该是cpu发现指令被修改了,所以丢弃了mov cx,0001h的结果,重新取指运行了,就像cpu处理跳转那样。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
能讲一下CPU对跳转指令有什么特殊处理嘛?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
猜呗,例如遇到jne,下一步该执行哪儿的指令?鬼才知道,要是知道就不用jne了,但也不能闲着啊,那就蒙一个,对了那就赚了,不对的话就把结果扔掉,照另一种情况去取指。最坏的情况也就跟闲着是一样的,所以大家就都开始猜了。
计算机组成原理课学的,不知现在有什么更先进的方法了没,反正新加了很多指令用于消除跳转,最常见的应该是SETcc指令了吧。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
你用od调试没
|
能力值:
( 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 是正确的
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
噢,对了,我在上面忘了说了,其实还有一种最常见的方法,就是延迟转移,不过这是由编译器完成的,也就是重排指令序列,例如本来是mov xxx,xxx mov xxx,xxx cmp xxx,xxx jz xxx,但是编译器会把cmp给提前一些,提到mov的前面,当然前提是mov指令没修改cmp的操作数,这样的话执行jz的时候cmp的结果就已经出来了,就不需要清空指令流水线了,也能提高效率。这种方法在现在的编译器里很常见,经常看到cmp和Jcc之间有两条mov之类的指令。
|
能力值:
( 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"。
要终止程序,请单击“确定”。
要调试程序,请单击“取消”。
---------------------------
确定 取消
---------------------------
|
能力值:
( 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
|
能力值:
( LV9,RANK:180 )
|
-
-
10 楼
指令预取是这么测的?
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
还有一种很牛X的方法,就是第一次在跳和不跳之间随便蒙一个,从第二次开始就蒙成功率大于50%的那个,如果跳的成功率比较大于50%那就在取指时取跳后的指令送进流水线,如果不跳的成功率大于50%那就取不跳的指令,然后再看这次蒙对了没,然后修改成功率,然后下一次遇到跳转指令……这种方法能保证成功率大于50%。
我就只知道这几种方法了,不知还有别的方法没,欢迎指正或者补充。
顺便膜拜S大大。
|
能力值:
( LV9,RANK:180 )
|
-
-
12 楼
LS不要每次都加上那一句.
我头很晕~
LZ找台Intel 80486试试
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
对了,又想起来一种,好像是从奔腾才开始用的,好像是叫动态预测技术,记不清了,就是加了一个BTB,其实就是一个小缓存,记住自己上次遇到这个指令的时候是跳了还是没跳,然后按上次情况的取指。希望没记错。
不过我觉得这种方法实在有点……我觉得这种方法不怎么样,不过估计实际效果不错,因为在软件中for、while之类的循环很多,这种方法遇到这种循环效果很好。
哪位有时间的话可以去翻一下Intel的那五本恐怖的pdf,看一下有这方面的介绍没。
再次膜拜S大大,并祝S大大的头晕病早日好转。
|
能力值:
( LV9,RANK:180 )
|
-
-
14 楼
其实...我觉得你一直答非所问
哇哈哈
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
哈哈,lz只是问一下为啥输出0……不过在3L又加了一句问cpu对跳转指令的处理,我就说了一下cpu和编译器对跳转怎么处理以提高效率的一些简单的处理方法,不过都是以前学计算机组成原理时候从各种书上找来的东西,不知现在又有什么好的处理方法了。
就当回忆复习一下呗,反正闲着也无聊,总比宿舍的同学听着音乐玩游戏好一些……
|
能力值:
( LV9,RANK:610 )
|
-
-
16 楼
哈哈 楼猪的程序明明是一个简单的自修改
指令预取?不懂耶。。。我在6L已经说的很清楚咯。。。
|
能力值:
( LV9,RANK:180 )
|
-
-
17 楼
指令预取成立的话 :
lea di, L1
mov ax, cccc
stosw
L1:
nop
nop
在 80486 上 L1 可能将会执行成 nop nop
LZ在现在的电脑上测不出来的.
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
cpu发现指令
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
修改了程序代码,WINDOWS下不能运行的。
|
|
|