2016-08-06 2 views
0

特定のブロックがどのように機能するかを理解するのは苦労しています。ヒープアセンブリメモリの数学とループ

004B0000 73 6D 67 66 74 smgft 

と、次のアセンブリ上の次のアドレスで:

77A701B8 xor eax, eax 
77A701BA mov ecx, 4 
77A701BF lea edi, DWORD PTR DS:[ecx+4B0000] 
77A701C5 xor DWORD PTR DS:[edi], ecx 
77A701C5 loopd short ntdll.77A701BF 

問題は、命令が実行された後にASCIIでヒープ上に5バイトの価値を提供することです。

のXOR EAX、EAXを次のようにそれがあるから、私は何を理解することができます。 0 out eax

mov ecx、4;セットECX 4

LEAのEDI、DWORD PTRのDS:[ECX + 4b0000]。 ecx + 4b0000に格納されているものはすべてEDIにロードされるので、4b0004になります。私はこれが何を得るのか分からない。私は4b0000が得られるかどうかも分かりません。なぜなら、5バイトだからです。 mgft、またはsmgf?私はsmgfだと思いますか? + 4hはこれにどのように影響しますか?それは736D676678になりますか?

XOR DWORD PTRのDS:[EDI]、ECX。これはediに新しくロードされたdwordを使ってxorまたは4hになりますが、loopdの中ではどうなりますか?

loopd short ntdll.77A701BF;だから、これは "等しい時にループ"ですが、私はその上にxorで何が翻訳されるのか分かりません。それはecxを減少させますか?しかし、それはリーラインにジャンプします。

+0

それはEFLAGS(XORセット)気にしないので、それは、 'loop'、ない' loope'(等しいwhileループ)です。 http://www.felixcloutier.com/x86/LOOP:LOOPcc.htmlを参照してください。 –

答えて

4

lea edi, dword ptr ds:[ecx+4b0000]は、EDIに値ecx+0x004b0000をロードし、全くのメモリにアクセスしません。 loop命令は "ecx = ecx - 1; if(ecx != 0) goto ntdll.77A701BF"のようなものです。それはなるように、このコードは、アンロールすることができ

ない:

ことになるので、より最適化することができ
xor eax, eax 

    lea edi, DWORD PTR DS:[4+0x004B0000] 
    xor DWORD PTR DS:[edi], 0x00000004 

    lea edi, DWORD PTR DS:[3+0x004B0000] 
    xor DWORD PTR DS:[edi], 0x00000003 

    lea edi, DWORD PTR DS:[2+0x004B0000] 
    xor DWORD PTR DS:[edi], 0x00000002 

    lea edi, DWORD PTR DS:[1+0x004B0000] 
    xor DWORD PTR DS:[edi], 0x00000001 

    xor ecx,ecx 

:組み合わせることで、もう少し最適化することができ

xor BYTE PTR DS:[0x004B0004], 0x04 
    xor BYTE PTR DS:[0x004B0003], 0x03 
    xor BYTE PTR DS:[0x004B0002], 0x02 
    xor BYTE PTR DS:[0x004B0001], 0x01 

    xor eax, eax  ;May be unnecessary if value unused by later code 
    mov edi,0x004B0001 ;May be unnecessary if value unused by later code 
    xor ecx, ecx  ;May be unnecessary if value unused by later code 

XOR:

xor DWORD PTR DS:[0x004B0001], 0x04030201 

    xor eax, eax  ;May be unnecessary if value unused by later code 
    mov edi,0x004B0001 ;May be unnecessary if value unused by later code 
    xor ecx, ecx  ;May be unnecessary if value unused by later code 

注:はい、これがずれXORですが、現在のCPU上では、複数の小さなアラインされたXORよりも、キャッシュラインの境界を越えないため、より高速に処理できます。基本的に

。ループ全体を単一の命令に減らすことができます。

+0

キャッシュラインの境界を越えたとしても、ほとんどの種類の周辺コードでは、ほとんどのCPUで4つのメモリデスティネーションバイトXORよりも高速です。 (メモリ宛先ALUは常にインテルCPU上で複数のuopにデコードします)。ページ境界を超えて(Skylakeより前に)、レイアフェンスでは独立したXORが勝ちますが、遅い退職の命令で後でアウトオブオーダーの実行がストールしない限り、スループットにはなりません。 –

+0

これは、メモリの内容が '004B0000 73 6C 65 65 70 sleep' – Ped7g