x86 Assembly Вопрос о выводе - PullRequest
1 голос
/ 07 июня 2010

Мой код выглядит так

_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 Ответ

3 голосов
/ 07 июня 2010

Эта строка является проблемой:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...