色々なNOPコード
1バイトの NOP命令(XCHG eax,eax)は有名だけどマルチバイトのNOP命令もあるらしい
バイト数 | 表記 | コード |
1 | XCHG EAX, EAX | 90 |
2 | XCHG AX,AX | 6690 |
3 | DB 66 XCHG AX,AX |
666690 |
4 | NOP DWORD PTR[EAX+00] | 0F1F4000 |
5 | NOP DWORD PTR[EAX+EAX+00] | 0F1F440000 |
6 | NOP WORD PTR[EAX+EAX+00] | 660F1F440000 |
7 | NOP DWORD PTR[EAX+00000000] | 0F1F8000000000 |
8 | NOP DWORD PTR[EAX+EAX+00000000] | 0F1F840000000000 |
9 | NOP WORD PTR[EAX+EAX+00000000] | 660F1F840000000000 |
10 | DB 66 NOP WORD PTR[EAX+EAX+00000000] |
66660F1F840000000000 |
NOP dword ptr [eax] (0F1F00) という3バイトのNOPも定義されているけど、安全なパディング処理ではないらしいので 666690 を使えと海外のサイトにあるようだ
メモリパッチでコードを無効化したい範囲があれば、ジャンプ命令で無効化したい範囲の先頭と終端を結ぶバイパス書き換えで対処するのが「美しいコーディング」といえます。 |
jmp 命令でパディング処理をする方法もあるけど、命令フェッチがクリアされてしまうので、処理速度低下するんじゃなかったかな?
Intel のマニュアルによると1バイトの NOP には特殊なサポートがあるそうな
1 バイトNOP(XCHG EAX,EAX)にはハードウェアの特別なサポートがある。このNOPは1 つのマイクロオペレーション(μOP)とそれに付随するリソースを使用するが、EAXの元の値への依存関係は取り除かれる。このマイクロオペレーション(μOP)は早い時期に実行できるため、未処理の命令の数を減らすことができ、最もコストの小さいNOP である。 |
要するにレジスタ・リード・ストールが起こらないってことだろうか
Comments