アセンブラ命令 - GENERIC_NOPx
概要
x86CPUで共通で使用可能なNOP命令
詳細
各数値が実行命令のバイト数を表しており、以下の命令が使用できる
- GENERIC_NOP1
- GENERIC_NOP2
- GENERIC_NOP3
- GENERIC_NOP4
- GENERIC_NOP5
- GENERIC_NOP6
- GENERIC_NOP7
- GENERIC_NOP8
- GENERIC_NOP5_ATOMIC
それぞれの命令は以下に示すアセンブラ命令と同等である
1 : nop; 2 : movl %esi,%esi; 3 : leal 0x00(%esi),%esi; 4 : leal 0x00(,%esi,1),%esi; 5 : nop; leal 0x00(,%esi,1),%esi; 6 : leal 0x00000000(%esi),%esi; 7 : leal 0x00000000(,%esi,1),%esi; 8 : nop; leal 0x00000000(,%esi,1),%esi; 5 atomic : dsp leal 0x00(,%esi,1),%esi;
5byteと7byteのNOP命令は2命令(nop + [4 or 7]byte命令)で形成されているためatomicに実行されない、そこで5byteのNOP命令を生成するにあたりDSセグメントへのオーバーライドプリフィックス(0x3e)を付加することで5byteの単一命令のNOPを実現している
これは、jmp命令が5byteの命令になるため自己修正コードでNOP命令を関数呼び出しに書き換える際に頻繁に利用されるため、実効速度をあげるための施策であると思います