【问题标题】:Linking multiple files with MASM and Visual Studio 2019使用 MASM 和 Visual Studio 2019 链接多个文件
【发布时间】:2020-05-08 08:08:14
【问题描述】:

我正在尝试编写一个程序,将斐波那契数列吐出到一定程度 n,但使用递归和多个链接文件。到目前为止,我的方法是将程序编写在单个文件中并使其工作,然后将其转换为多个文件。在我尝试使用invokeproto 指令链接文件之前,这一直有效。我很困惑从哪里开始。

这是我尝试过并且知道在单个文件中有效的方法:

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.inc

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 ==========

非常感谢任何可以抽出时间或提供帮助的人,我已经自己研究了一段时间,但无法弄清楚。

【问题讨论】:

    标签: assembly linker visual-studio-2019 masm masm32


    【解决方案1】:

    我认为 external.inc 不应包含 Irvine32.inc,因为 .asm 文件包含两者。最终结果是每个 .asm 文件都包含两次 Irvine32.inc。

    【讨论】:

    • 这,以及我注意到的 fib.asm 中不必要的 external.inc 包含,解决了这个问题。非常感谢!
    • @redwood - 至少在 Microsoft / Visual Studio masm 的情况下,Irvine32.inc 可以使用 ifndefequ 来检查重复包含。
    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 2019-11-02
    • 2010-09-11
    • 2020-03-31
    相关资源
    最近更新 更多