一、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