2010-06-06 4 views
1

Mon code ressemble à ceAssemblée x86 Question sur la sortie

_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 
} 
} 

Sa fonction factoriel et je suis en train de sortir la réponse après calcule récursive le nombre qui a été adoptée dans

Mais ce que je obtenir de retour en sortie est le même grand nombre que je continue à recevoir Je ne sais pas sur ce qui ne va pas avec ma sortie, je vois aussi par cette erreur CXX0030: erreur: expression ne peut pas être évaluée

Merci!

Répondre

3

Cette ligne est un problème:

mov [output], eax //copy result 

Tout d'abord, output est un pointeur, donc cela ne changerait la valeur du pointeur, pas son contenu. Deuxièmement, en raison de la déclaration __declspec(naked), il ne sait pas où trouver la valeur, sauf si vous définissez le cadre de pile de manière appropriée. Ainsi, vous pouvez l'écrire comme ceci:

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

Ou vous pouvez configurer la pile vous encadrer et vous serez en mesure d'accéder à la variable par nom (vous auriez encore besoin d'ajouter le niveau d'indirection en raison de étant un pointeur):

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

.... 

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

pop ebp 
ret