【发布时间】:2016-03-13 18:27:40
【问题描述】:
所以我正在组装中的一项任务以生成斐波那契数列。我已经在主程序中成功编写了代码,但是当我尝试将其包装在它自己的程序中并调用该程序时,我遇到了访问冲突错误。这是我的代码:
INCLUDE Irvine32.inc
.data
array DWORD 47 DUP(?)
.code
main proc
mov esi, OFFSET array
call generate_fibonacci
invoke ExitProcess,0
main endp
generate_fibonacci PROC
mov DWORD PTR [esi], 1h
add esi, 4
mov DWORD PTR [esi], 1h
push [esi]
push [esi - 4]
add esi, 4
mov ecx, 45
L1:
pop eax
pop ebx
add eax, ebx
mov DWORD PTR [esi], eax
add esi, 4
push [esi - 4]
push [esi - 8]
loop L1
ret
generate_fibonacci ENDP
end main
错误看起来像这样:“在项目中的某个内存位置引发异常...:访问冲突执行位置相同的内存位置。
我注意到在执行 call generate_fibonacci 指令时,错误消息中列出的内存位置正在加载到 EIP 寄存器中。我不确定如何解决这个问题。
【问题讨论】:
-
为什么在这个非递归解决方案中使用堆栈?为什么不直接写:
mov eax,[esi-4]mov ebx,[esi]? -
顺便说一句,在
esi中传递第一个参数不是 32 位的正常调用约定。 main 不保存调用者的 esi 值是可以的,因为它永远不会返回。 (您改为调用ExitProcess。)请参阅 x86 tag wiki 以获取有关调用约定的信息的链接。 -
部分任务是利用推送和弹出指令以及创建和调用过程。我知道,这很奇怪,我最初能够在没有这些东西的情况下编写代码。
标签: visual-studio assembly masm irvine32