VC のインラインアセンブラによるジャンプ
VC++2005 の インラインアセンブラによるジャンプ命令のコーディングについて調べてみました
記述1
jmp far $+4
0xE9 0xFD 0xFF 0xFF 0xFF
記述2
jmp short $+2
0xEB 0x00
記述3 (far jmpと同じ)
jmp $
0xE9 0x00 0x00 0x00 0x00
jo short $ 0x0F 0x80 0x00 0x00 0x00 0x00
jno short $ 0x0F 0x81 0x00 0x00 0x00 0x00
jc short $ 0x0F 0x82 0x00 0x00 0x00 0x00
jb short $ 0x0F 0x82 0x00 0x00 0x00 0x00
jnc short $ 0x0F 0x83 0x00 0x00 0x00 0x00
jnb short $ 0x0F 0x83 0x00 0x00 0x00 0x00
jz short $ 0x0F 0x84 0x00 0x00 0x00 0x00
je short $ 0x0F 0x84 0x00 0x00 0x00 0x00
jnz short $ 0x0F 0x85 0x00 0x00 0x00 0x00
jne short $ 0x0F 0x85 0x00 0x00 0x00 0x00
jna short $ 0x0F 0x86 0x00 0x00 0x00 0x00
ja short $ 0x0F 0x87 0x00 0x00 0x00 0x00
js short $ 0x0F 0x88 0x00 0x00 0x00 0x00
jns short $ 0x0F 0x89 0x00 0x00 0x00 0x00
※何故か short を記述しているのに far jmp になる
というわけで定義を作ってみた。
#define _je(a) _emit [0x74]}_asm{_emit [a]
#define _jne(a) _emit [0x75]}_asm{_emit [a]
#define _jo(a) _emit [0x70]}_asm{_emit [a]
#define _jno(a) _emit [0x71]}_asm{_emit [a]
#define _jc(a) _emit [0x72]}_asm{_emit [a]
#define _jnc(a) _emit [0x73]}_asm{_emit [a]
#define _ja(a) _emit [0x77]}_asm{_emit [a]
#define _jna(a) _emit [0x76]}_asm{_emit [a]
#define _js(a) _emit [0x78]}_asm{_emit [a]
#define _jns(a) _emit [0x79]}_asm{_emit [a]
#define _jp(a) _emit [0x7a]}_asm{_emit [a]
#define _jnp(a) _emit [0x7b]}_asm{_emit [a]
#define _jl(a) _emit [0x7c]}_asm{_emit [a]
#define _jnl(a) _emit [0x7d]}_asm{_emit [a]
#define _jle(a) _emit [0x7e]}_asm{_emit [a]
#define _jg(a) _emit [0x7f]}_asm{_emit [a]
例
shr byte ptr[eax],1 00407AF5 D0 28 shr byte ptr [eax],1 _jnc(3) 00407AF7 73 03 jae 00407AF9 or dl,64//d 00407AF9 80 CA 40 or dl,40h shr byte ptr[eax],1 |
条件分岐命令で$を使った場合は常に32ビット変位(Jcc NEAR)となります。
http://msdn.microsoft.com/en-us/library/78cxesy1.aspx
ここの最後で明記されています。
それと、FARはセグメントを跨いだジャンプ命令なのでこの場合はNEARが合ってると思います。
もしMASMでコードを書く必要がある場合、このあたりは注意してください。
おお、ありがとうございます|ノ・ω・)ノURL