首页
社区
课程
招聘
XP系统程序中开头的MOV EDI,EDI指令的解释
发表于: 2005-11-25 13:55 25175

XP系统程序中开头的MOV EDI,EDI指令的解释

2005-11-25 13:55
25175

XP系统程序中开头的MOV        EDI,EDI指令的解释:

在VS .NET 2003的VC7\INCLUDE目录中的listing.inc文件中定义了1到7个字节的无破坏性NOP操作的宏

MOV        EDI,EDI 就是两个字节的NOP
在程序中与NOP指令的意义相同。

为什么要用MOV        EDI,EDI 而不用两个NOP?
我的理解是:
用两个NOP指令耗费的CPU时钟周期要比用MOV        EDI,EDI指令要长,为了提高效率,就采用了MOV        EDI,EDI

listing.inc文件的内容

;; LISTING.INC
;;
;; This file contains assembler macros and is included by the files created
;; with the -FA compiler switch to be assembled by MASM (Microsoft Macro
;; Assembler).
;;
;; Copyright (c) 1993, Microsoft Corporation. All rights reserved.

;; non destructive nops
npad macro size
if size eq 1
  nop
else
if size eq 2
   mov edi, edi
else
  if size eq 3
    ; lea ecx, [ecx+00]
    DB 8DH, 49H, 00H
  else
   if size eq 4
     ; lea esp, [esp+00]
     DB 8DH, 64H, 24H, 00H
   else
    if size eq 5
      add eax, DWORD PTR 0
    else
     if size eq 6
       ; lea ebx, [ebx+00000000]
       DB 8DH, 9BH, 00H, 00H, 00H, 00H
     else
      if size eq 7
        ; lea esp, [esp+00000000]
        DB 8DH, 0A4H, 24H, 00H, 00H, 00H, 00H
      else
        %out error: unsupported npad size
        .err
      endif
     endif
    endif
   endif
  endif
endif
endif
endm

;; destructive nops
dpad macro size, reg
if size eq 1
  inc reg
else
  %out error: unsupported dpad size
  .err
endif
endm


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (17)
雪    币: 233
活跃值: (130)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
学习了
2005-11-25 14:24
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这也值的研究!!??不过那是你个人的想法,论效率的话就用汇编好了。
2005-11-25 15:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
luye? 这就是汇编呀。
2005-11-26 11:19
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
5
三楼的还没有进入境界,不知道有些指令需要等待一定的时间,这时候又没有到使用Sleep那么严重,就会用这些不干任何事的指令来消磨一点时间,让前面的指令能顺利完成。
2005-11-26 11:47
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
VC7.1的编译器经常在速度优化上加写无意义的指令,主要是为对齐代码,以利于cache的使用.
2005-11-26 15:11
0
雪    币: 671
活跃值: (723)
能力值: ( LV9,RANK:1060 )
在线值:
发帖
回帖
粉丝
7

跟nop效果一样
2005-11-26 19:02
0
雪    币: 255
活跃值: (207)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
8
精明.
同长度情况下,的确执行指令数少了,花的时间少了.
楼主是上海人吧.不然哪能嘎灵呢.
2005-11-26 20:48
0
雪    币: 236
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
同意wenglingok的说法
2005-11-26 22:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
强烈学习汇编
2005-12-16 03:36
0
雪    币: 209
活跃值: (45)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
这个if size eq 5
      add eax, DWORD PTR 0
不太妥当
会改变标志位的
2006-3-8 13:56
0
雪    币: 254
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
据说mov edi,edi是用来patch的,请看funnywei博士以及Ishai的文章:

《xp sp2里的怪事》--funnywei
http://blog.xfocus.net/index.php?blogId=28

《Why does the compiler generate a MOV EDI, EDI instruction
at the beginning of functions?》
http://blogs.msdn.com/ishai/archive/2004/06/24/165143.aspx
2006-3-30 09:05
0
雪    币: 250
活跃值: (103)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
13
谢谢!
为了热补。
2006-4-6 13:09
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
if size eq 5
      add eax, DWORD PTR 0

好象在我的vc6上只产生3个字节长的机器码,是怎么回事儿?
(不好意思,虽然是老贴,实在想问清楚)
还有它会影响标志位吗?
2006-8-5 14:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
楼上的兄弟,这个玩意不应该改标志位。还有,这个mov指令里,DWORD立即数就占了4字节,怎么能只产生3字节呢?

另外,我也觉得那个add eax,DWORD PTR 0不太妥当,至少手动使用的时候要小心。
2007-2-17 00:52
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
这个也被你发现...
2007-3-8 00:38
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
同意,这个想法可以这么说的
2007-4-4 16:57
0
雪    币: 194
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
18
别搞地域偏见
2007-4-28 15:54
0
游客
登录 | 注册 方可回帖
返回
//