作者R119 (= =)
看板ASM
标题Re: [问题] 组译错误讯息看不太懂
时间Sun Nov 30 21:51:11 2008
※ 引述《Nessa1103 (紫藤茁壮中)》之铭言:
: 以下是我的程式,使用MASM和Visual C++撰写。组译错误讯息说我没有定义Fbnc
: 这个符号(error A2006: undefined symbol : Fbnc),可是我明明在下面定义了
: 啊?请问我该怎麽修改比较好?
: TITLE Fibonacci (Fbnc.asm)
: INCLUDE Irvine32.inc
: .data
: tip BYTE "How much Fibonacci do you want?",0
: tmp DWORD ?
: .code
: main PROC
: call Clrscr
: mov edx,OFFSET tip
: call WriteString
: call ReadDec
: mov tmp, eax ; tmp = eax
: INVOKE Fbnc, tmp
: main ENDP
: Fbnc PROC USES eax ,N:DWORD ; p.301
: LOCAL fbnc2:DWORD
: push ebp
: .IF N > 2
: INVOKE Fbnc, N-1
^^^^
这样处理的话会变成 是位址会位移一个byte
例如原本值是03h 会变成 300h
: mov fbnc2, eax
: INVOKE Fbnc, N-2
^^^^
这边会变成30000h
在递回回去就爆了
: add eax, fbnc2 ; Fbnc(N) = Fbnc(N-1) + Fbnc(N-2)
: call WriteDec
: .ELSE
: mov fbnc2, 1
: mov eax, fbnc2
: call WriteDec
: .ENDIF
: pop ebp
: ret 4
: Fbnc ENDP
: exit
: END main
再加上你使用了Uses EAX 会使得每次修改的EAX会再改回去
而且PUSH EBP 与POP EBP 似乎没啥效果 @@?
所以我帮你改了副程式
Fbnc PROC stdcall ,N:DWORD ; p.301
LOCAL fbnc2:DWORD
.IF N > 2
mov eax,N
sub eax,01h
INVOKE Fbnc, eax
mov fbnc2, eax
mov eax,N
sub eax,02h
INVOKE Fbnc, eax
add eax, fbnc2 ; Fbnc(N) = Fbnc(N-1) + Fbnc(N-2)
call WriteDec
.ELSE
mov fbnc2, 01
mov eax, fbnc2
call WriteDec
.ENDIF
ret
Fbnc ENDP
因为你在计算过程中 会一值呼叫WriteDec
所以显示的并非简洁的Fibonacci 数列 这部份你自己修改即可
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.137.7.190
1F:推 Nessa1103:谢谢m(_ _)m (膜拜状) 11/30 22:44
2F:→ Nessa1103:不过那个stdcall是什麽? 11/30 22:46
3F:→ R119:忽略它没关系 XDD 我用的是MASM6.11版 所以要加stdcall 11/30 23:06