1. 程式人生 > 其它 >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