2009-05-06 1 views
2

なぜこのコードは "test"を出力しませんか?プロセッサスタックを変更するには?

#include <stdio.h> 
#include <stdlib.h> 

void foo (void) { 
    printf("test\n"); 
} 

__declspec(naked) 
void bar (void) { 
    asm { 
     push 0x000FFFFF 
     call malloc 
     pop ecx 
     push eax 
     add eax, 0x000EFFFF 

     mov ecx, esp 
     mov esp, eax 
     push ecx 

     call foo 

     pop esp 
     call free 
     pop ecx 
     ret 
    } 
} 

int main(int argc, char* argv[]) 
{ 
    bar(); 
    return 0; 
} 
+0

あなたはおそらく 'printf( "test \ n");'バッファリングの問題がある場合に備えて –

+0

私のためのNice challange。私はかなり長い間、asmでコードを作成しておらず、これをコンパイルするために呼び出し規約で自分自身をリフレッシュしなければなりませんでした。 – Suma

答えて

10

新しく割り当てられたスタックがDWORDに整列していないためです。コードを次のように変更してください。

push 0x00100000 
    call malloc 
    pop ecx 
    push eax 
    add eax, 0x000f0000 

...必要に応じて印刷されます。

Paulさんからアドバイスされたように、バッファリングの問題を避けるために必ず\ nを追加してください。

+0

ありがとうございます! 面白いことや悲しいことは、あまりにも興奮してコーディングを始めなければならないときに、Intel x86アーキテクチャのマニュアルを読んでいることです。私が止めたセクションはStack Alignでした。 :) – Mike

関連する問題