我的代码看起来像这样
_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:错误:无法评估表达式
谢谢!
答案 0 :(得分: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