Эта строка является проблемой:
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