2011-10-22 7 views
0

これをC++関数でインライン展開するにはどうすればよいでしょうか。C++の自己修正アセンブリコードのインライン展開方法

0041F84E . 7B 02   JPO SHORT Unmodifi.0041F852 
0041F850  B8    DB B8 
0041F851  00    DB 00 
0041F852 . 8B46 38  MOV EAX,DWORD PTR DS:[ESI+38] 
0041F855 . 8B56 24  MOV EDX,DWORD PTR DS:[ESI+24] 
0041F858 . 8B4E 10  MOV ECX,DWORD PTR DS:[ESI+10] 
0041F85B . 81EA 8B4B8636 SUB EDX,36864B8B 

にはどうすれば DB B8 DB 00

void test() { 
    __asm { 
     ... 
     JPO label_0041F852 
     __emit 0xB8 
     __emit 00 
label_0041F852: 
     MOV EAX,DWORD PTR DS:[ESI+0x38] 
     MOV EDX,DWORD PTR DS:[ESI+0x24] 
     MOV ECX,DWORD PTR DS:[ESI+0x10] 
     SUB EDX,0x36864B8B 
     ... 
    } 
} 

エラーC2400置く: 'オペコード' のインラインアセンブラ構文エラー。 'constant'が見つかりました cl.exeの実行中にエラーが発生しました。

私はこれを.dataセクションに入れることはできないと思いますが、このようなバイトを含めることができます。

+5

最近のシステムでは、一般に、書き込み可能で実行可能なプログラムセグメントは禁止されています(http://en.wikipedia.org/wiki/NX_bit#Microsoft_Windows)。 – sarnold

+0

外部から実行時に 'DB 00'バイトを変更しようとしていますか?このスニペットで何かを変更するコードはありません。 – TonyK

+0

um 'JPO'命令は、ジャンプが行われない場合のコード修飾子です。 – SSpoke

答えて

2

これは、SSpokeのリクエストに対する返信の回答長のコメントです。昔、チューリングマシンをエミュレートするのはすばらしいことでしたが、DEC Vaxミニコンピュータでbusy beaversを検索するチューリングマシンエミュレータプログラムを作成しました。どのチューリングマシンが次に試行するかをプログラムが決定すると、チューリングマシンのマシンコードが配列にコンパイルされ、配列が関数であるかのように呼び出されました。 (これはすべてCに書かれています)

これは自己修正コードです。これを実行するには、同時に書き込み可能で実行可能なメモリ領域が必要です。

あなたのコードは自己修正ではありません。あなたはコードに書き換えません。つまり、読み取り専用のプログラムセグメントで実行できます。

+0

よく 'rofl'を入れてください!再度、感謝します – SSpoke

関連する問題