Я пытаюсь написать программу, которая выводит последовательность Фибоначчи до определенной степени n, но с использованием рекурсии и нескольких связанных файлов. До сих пор мой подход заключался в том, чтобы написать программу в одном файле и заставить ее работать, а затем перевести ее в несколько файлов. Это работало до тех пор, пока я не попытался использовать инструкции invoke
и proto
для связывания файлов. Я очень запутался, с чего вообще начать.
Вот то, что я пробовал и знаю, работает в одном файле:
INCLUDE Irvine32.inc
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
deg DWORD ?
prompt BYTE "Enter the degree of Fibonacci sequence: ",0
.code
main PROC
mov edx,OFFSET prompt
call WriteString
call ReadInt
mov deg,eax
mov ecx,0
push deg
call Fibonacci
add esp,4
call WriteDec
call Crlf
INVOKE ExitProcess,0
main ENDP
Fibonacci PROC
add ecx,1
push ebp
mov ebp,esp
sub esp,4
mov eax,[ebp+8]
cmp eax,2
je L1
cmp eax,1
je L1
dec eax
push eax
call Fibonacci
mov [ebp-4],eax
dec DWORD PTR [esp]
call Fibonacci
add esp,4
add eax,[ebp-4]
jmp EndFib
L1:
mov eax,1
EndFib:
mov esp,ebp
pop ebp
ret
Fibonacci ENDP
END main
Я точно знаю, что приведенный выше код компилируется, но попытка разбить его на несколько файлов всегда приводит к ошибке сборки. Вот 3 файла из того, что я пытался заставить работать:
main.asm
INCLUDE Irvine32.inc
INCLUDE external.inc
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
.code
main PROC
mov ecx,0
push 3
invoke Fibonacci
add esp,4
call WriteDec
call Crlf
INVOKE ExitProcess,0
main ENDP
END main
fib.asm
INCLUDE Irvine32.inc
INCLUDE external.inc
.code
Fibonacci PROC
add ecx,1
push ebp
mov ebp,esp
sub esp,4
mov eax,[ebp+8]
cmp eax,2
je L1
cmp eax,1
je L1
dec eax
push eax
call Fibonacci
mov [ebp-4],eax
dec DWORD PTR [esp]
call Fibonacci
add esp,4
add eax,[ebp-4]
jmp EndFib
L1:
mov eax,1
; dec eax
EndFib:
mov esp,ebp
pop ebp
ret
Fibonacci ENDP
END
external.in c
INCLUDE Irvine32.inc
Fibonacci PROTO
Когда это не удается, я получаю окно с сообщением:
Были ошибки сборки. Хотели бы вы продолжить и запустить последнюю успешную сборку?
Мой друг сказал мне, что я должен получать сообщения об ошибках, которые показывают мне, на какой строке сработала программа, но я вижу только это и сборку вывод, который я поставлю ниже. Это нормально?
1>------ Build started: Project: ModSum, Configuration: Debug Win32 ------
1>Assembling main.asm...
1>c:\irvine\SmallWin.inc(11): warning A4011: multiple .MODEL directives found : .MODEL ignored
1>c:\irvine\SmallWin.inc(245): error A2163: non-benign structure redefinition: incorrect initializers : CONSOLE_SCREEN_BUFFER_INFO
1>c:\irvine\SmallWin.inc(246): error A2163: non-benign structure redefinition: incorrect initializers : CONSOLE_SCREEN_BUFFER_INFO
1>c:\irvine\SmallWin.inc(248): error A2163: non-benign structure redefinition: incorrect initializers : CONSOLE_SCREEN_BUFFER_INFO
1>c:\irvine\SmallWin.inc(249): error A2163: non-benign structure redefinition: incorrect initializers : CONSOLE_SCREEN_BUFFER_INFO
1>c:\irvine\SmallWin.inc(258): error A2163: non-benign structure redefinition: incorrect initializers : KEY_EVENT_RECORD
1>c:\irvine\SmallWin.inc(261): error A2163: non-benign structure redefinition: incorrect initializers : KEY_EVENT_RECORD
1>c:\irvine\SmallWin.inc(262): error A2161: non-benign structure redefinition: too few labels : KEY_EVENT_RECORD
1>c:\irvine\SmallWin.inc(262): error A2163: non-benign structure redefinition: incorrect initializers : KEY_EVENT_RECORD
1>c:\irvine\SmallWin.inc(265): error A2163: non-benign structure redefinition: incorrect initializers : MOUSE_EVENT_RECORD
1>c:\irvine\SmallWin.inc(272): error A2163: non-benign structure redefinition: incorrect initializers : WINDOW_BUFFER_SIZE_RECORD
1>c:\irvine\SmallWin.inc(287): error A2163: non-benign structure redefinition: incorrect initializers : INPUT_RECORD
1>c:\irvine\SmallWin.inc(288): error A2163: non-benign structure redefinition: incorrect initializers : INPUT_RECORD
1>c:\irvine\SmallWin.inc(289): error A2163: non-benign structure redefinition: incorrect initializers : INPUT_RECORD
1>c:\irvine\SmallWin.inc(290): error A2163: non-benign structure redefinition: incorrect initializers : INPUT_RECORD
1>c:\irvine\SmallWin.inc(290): error A2164: non-benign structure redefinition: too few initializers : INPUT_RECORD
1>c:\irvine\SmallWin.inc(291): error A2164: non-benign structure redefinition: too few initializers : INPUT_RECORD
1>c:\irvine\SmallWin.inc(293): error A2161: non-benign structure redefinition: too few labels : INPUT_RECORD
1>c:\irvine\SmallWin.inc(293): error A2164: non-benign structure redefinition: too few initializers : INPUT_RECORD
1>main.asm(7): warning A4011: multiple .MODEL directives found : .MODEL ignored
1>MASM : fatal error A1016: Internal error
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations\masm.targets(70,5): error MSB3721: The command "ml.exe /c /nologo /Zi /Fo"Debug\main.obj" /I "c:\irvine" /W3 /errorReport:prompt /Tamain.asm" exited with code -1073741819.
1>Done building project "ModSum.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Огромное спасибо всем, кто может уделить время или помощь, я работаю над этим самостоятельно какое-то время и не могу понять.