首页
论坛
课程
招聘

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

2005-11-25 13:55 22727

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

2005-11-25 13:55
22727
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

[推荐]看雪工具下载站,全新登场!(Android、Web、漏洞分析还未更新)

最新回复 (17)
南蛮妈妈 3 2005-11-25 14:24
2
0
学习了
luye 2005-11-25 15:30
3
0
这也值的研究!!??不过那是你个人的想法,论效率的话就用汇编好了。
醉狐 2005-11-26 11:19
4
0
luye? 这就是汇编呀。
gzgzlxg 11 2005-11-26 11:47
5
0
三楼的还没有进入境界,不知道有些指令需要等待一定的时间,这时候又没有到使用Sleep那么严重,就会用这些不干任何事的指令来消磨一点时间,让前面的指令能顺利完成。
dwing 1 2005-11-26 15:11
6
0
VC7.1的编译器经常在速度优化上加写无意义的指令,主要是为对齐代码,以利于cache的使用.
wenglingok 26 2005-11-26 19:02
7
0

跟nop效果一样
peaceclub 6 2005-11-26 20:48
8
0
精明.
同长度情况下,的确执行指令数少了,花的时间少了.
楼主是上海人吧.不然哪能嘎灵呢.
itking 2005-11-26 22:06
9
0
同意wenglingok的说法
TarZan 2005-12-16 03:36
10
0
强烈学习汇编
csdsjkk 1 2006-3-8 13:56
11
0
这个if size eq 5
      add eax, DWORD PTR 0
不太妥当
会改变标志位的
terren 1 2006-3-30 09:05
12
0
据说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
ah007 2 2006-4-6 13:09
13
0
谢谢!
为了热补。
ahpho 2006-8-5 14:34
14
0
if size eq 5
      add eax, DWORD PTR 0

好象在我的vc6上只产生3个字节长的机器码,是怎么回事儿?
(不好意思,虽然是老贴,实在想问清楚)
还有它会影响标志位吗?
mousesure 2007-2-17 00:52
15
0
楼上的兄弟,这个玩意不应该改标志位。还有,这个mov指令里,DWORD立即数就占了4字节,怎么能只产生3字节呢?

另外,我也觉得那个add eax,DWORD PTR 0不太妥当,至少手动使用的时候要小心。
我是雷锋 2007-3-8 00:38
16
0
这个也被你发现...
nyhyeah 2007-4-4 16:57
17
0
同意,这个想法可以这么说的
baron 2007-4-28 15:54
18
0
别搞地域偏见
游客
登录 | 注册 方可回帖
返回