2009-05-06 109 views
2

爲什麼不打印「測試」?如何更改處理器堆棧?

#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」);'以防有緩衝問題。 – 2009-05-06 18:55:09

+0

對我來說很好的挑戰。我沒有在asm中編寫很長一段時間,不得不重新調用約定來編譯它。 – Suma 2009-05-06 19:15:54

回答

10

因爲您新分配的堆棧不是DWORD對齊的。更改代碼這樣:

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

...,並根據需要將打印。

請務必添加\ n以避免Paul建議的緩衝問題。