Связывание нескольких файлов с помощью MASM и Visual Studio 2019 - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь написать программу, которая выводит последовательность Фибоначчи до определенной степени 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 ==========

Огромное спасибо всем, кто может уделить время или помощь, я работаю над этим самостоятельно какое-то время и не могу понять.

1 Ответ

0 голосов
/ 08 мая 2020

Я думаю, что external.in c не должен включать Irvine32.in c, поскольку файлы .asm включают оба. Конечным результатом является то, что Irvine32.in c включается дважды для каждого файла .asm.

...