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
00407AFC D0 28            shr         byte ptr [eax],1
            _jc(3)
00407AFE 72 03            jb        00407B00 
            or dl,8//e
00407B00 80 CA 08         or          dl,8

おすすめ

2件のフィードバック

  1. _alice より:

    条件分岐命令で$を使った場合は常に32ビット変位(Jcc NEAR)となります。
    http://msdn.microsoft.com/en-us/library/78cxesy1.aspx
    ここの最後で明記されています。
    それと、FARはセグメントを跨いだジャンプ命令なのでこの場合はNEARが合ってると思います。
    もしMASMでコードを書く必要がある場合、このあたりは注意してください。

  2. blackwingcat より:

    おお、ありがとうございます|ノ・ω・)ノURL

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です