Java教程

emit指令分析

本文主要是介绍emit指令分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、emit指令的作用

  1.编译器不认识的指令,拆成机器码来写

  2.插入垃圾字节来反跟踪,又称花指令

  用emit就是在当前位置直接插入数据(实际上是指令),一般是用来直接插入汇编里面没有的特殊指令,多数指令可以用asm内嵌汇编来做,没有必要用emit来做,除非你不想让其它人看懂你的代码。

_EMIT伪指令相当于MASM中的DB,但一次只能定义一个字节

  VC里面使用用的,与汇编里的DB一样。

  VC里没有DD及DW之类的内联汇编指令,只有用这个_emit一个字节一个字节的填入。


一个简单的例子
int main() {
__asm{
_emit 0xEA
_emit 0xAA
_emit 0xAA
_emit 0xAA
_emit 0xAA
_emit 0x08
_emit 0x0
}
return 0;
}

相当于
__asm
{
jmp FAR 0x08:0xAAAAAAAA
}

若是x86 的16bit, jmp只有短跳和长跳是以距离表示,比如

jmp short xxxx 机器码是 EB XX ;XX是相对距离,负值是跳前,正值是跳后
jmp xxxx 机器码是 E9 XX XX ;XX XX 是相对距离,负值是跳前,正值是跳后


其他的JMP就不以距离表示,比如

JMP 3000:100 机器码 EA00010030 ; EA后是段:偏移地址
JMP FAR [0200] 机器码 FF2E0002 ; FF 2E 后是内存地址
JMP FAR [EAX] 机器码 FF 28 ;没有地址FF 28本身就表示 JMP FAR [EAX]

https://www.cnblogs.com/sunt/archive/2010/11/25/1887657.html

https://tieba.baidu.com/p/5640387168?red_tag=1052818969

这篇关于emit指令分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!