x86汇编关于输出的问题

时间:2010-06-06 22:57:16

标签: assembly 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:错误:无法评估表达式

谢谢!

1 个答案:

答案 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