能力值:
( LV2,RANK:10 )
|
-
-
2 楼
当前跳转指令如果占二个字节 就要改两个 nop(占一个字节) 你....你说你对得起你头像下面的月亮么....
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
这也是为什么不能直接删掉原跳转指令的原因吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
有时候用nop指令是用来占位以便以后加入代码。不过感觉更多是用来保证指令总数不变用来填充用的
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
直接删掉跳转指令 会改变文件大小的。。搞起来很不方便的。改成nop多好呢。简单方便
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
确实,nop用好了的话真不错。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
汇编指令是没有“删”这一说的,只能“改”。
想要去掉某个跳转,就直接把它用nop占位。
说个最直接的例子,call指令的跳转地址是一个相对地址,如果你删掉了汇编里的某条语句,那后面的call跳转地址都要重新计算。。。
所以还是改成nop方便,影响小的多,效果相同。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
谁能破解这个 一个随机码 不带网络验证 求授权码 懂得有没
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
原来如此~学习了~谢谢各位~
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
LZ应该补习补习基础知识啦~
NOP的作用通常是在CPU的指令流水线中充当一个无意义指令的作用以维持流水线和时序的正常运转,防止出现流水线灾难。在很多指令集中,NOP的实质是执行一条不更改任意寄存器状态(除程序计数器)和内存数据的指令,例如在x86中NOP=XCHG EAX, EAX(机器码同为0x90)。甚至在ARM指令集中“剔除”掉了NOP,允许编译器使用任意相同含义的指令(比如MOV Rn, Rn)代替。
回到x86汇编,LZ应该明白汇编有很多跳转指令(例如jmp,jne,je),这些跳转指令的目的地址通常是一个相对偏移地址(即位移,比如机器码0xEB 03翻译成自然语言就是“无条件向后跳转三个字节”)。既然是相对地址,也就是最终目的地是与指令当前所在位置有关。如果上面这条指令位于0x40 00处,则执行完毕之后IP寄存器将变成0x40 05。
好,现在考虑“删除”0x40 02到0x40 05这里的指令(注意,并非像7L所言指令不能被删除),于是所有指令都会上移,从而补足被删除的空间。那么,原本0x40 05处的指令必然不是之前希望跳转的目的指令。这样只会导致一个结果:程序预期执行结果出错。当然,你也可以遍历程序中用到的所有指令,将这个“删除”过程带来的位移变动全部纠正(这显然不是一件很轻易的事情)。
加上NOP指令在可变长度指令集中通常会是一个最小指令占用空间,使得任意长度的指令均可以被任意个数的NOP指令正确替换。这样一来,NOP指令充当“删除”动作的替代品最为合适不过。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
太感谢了~刚开始接触,这几天正在看中山大学汇编视频,认真做笔记呢~恶补基础~
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
真心 无语 不让发帖
|
|
|