2010-06-06 48 views
1

我的代碼看起來像這樣x86彙編關於產品輸出

_declspec(naked) void 
f(unsigned int input,unsigned int *output) 
{ 
__asm{ 

    push dword ptr[esp+4] 
    call factorial 

    pop ecx 

    mov [output], eax //copy result 
    ret 
} 
} 

__declspec(naked) unsigned int 
factorial(unsigned int n) 
{ 
__asm{ 

    push esi 
    mov esi, dword ptr [esp+8] 
    cmp esi, 1 
    jg RECURSE 
    mov eax, 1  
    jmp END 

    RECURSE: 
    dec esi 
    push esi 
    call factorial 
    pop esi 
    inc esi 
    mul esi 

    END: 
    pop esi 
    ret 
} 
} 

它的階乘功能,我想輸出的答案是遞歸計算但那是在

通過數字我後返回作爲輸出是相同的大數我一直得到 不知道我的輸出有什麼問題,我也看到這個錯誤 CXX0030:錯誤:表達式無法評估

謝謝!

回答

3

這條線是一個問題:

所有的
mov [output], eax //copy result 

首先,output是一個指針,所以這隻會改變指針的值,而不是它的內容。其次,由於__declspec(naked)聲明,除非您正確設置堆棧幀,否則它不知道在哪裏找到該值。所以,你可以寫這樣的:

mov ecx, [esp+8] //read pointer value 
mov [ecx], eax  //write result into pointer 

或者,你可以設置堆棧幀自己,然後你就可以通過名稱來訪問變量(你仍然需要間接的水平增加,由於它是一個指針):

//at function start: 
push ebp 
mov ebp, esp 

.... 

mov ecx, [output] 
mov [ecx], eax 

pop ebp 
ret