【问题标题】:MASM32 compile errorMASM32 编译错误
【发布时间】:2015-01-22 13:32:46
【问题描述】:

我正在尝试使用 masm32 来学习汇编。我运行的是Windows 8,可以在masm32目录下编译运行示例代码,没有问题。

我正在使用快速编辑器 4.0g。

但是,我有以下代码,直接来自 Kip Irvine 的“x86 处理器的汇编语言”。他说这是一段“不依赖于包含文件”的代码,尽管我感觉这可能并不完全正确。

TITLE Add and Subtract

; This program add and subtracts 32-bit Integers

.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD
DumpRegs PROTO

.code
main PROC

    mov eax,10000h
    add eax,40000h
    sub eax,20000h
    call    DumpRegs

INVOKE ExitProcess,0
main ENDP
END main

当我尝试构建它时(我转到 Project 并选择“Console Assemble and Link”)我收到以下错误:

AddSubAlt.obj : error LNK2001: unresolved external symbol _ExitProcess@4
AddSubAlt.obj : error LNK2001: unresolved external symbol _DumpRegs@0
AddSubAlt.exe : fatal error LNK1120: 2 unresolved externals

这几天我一直在尝试解决这个问题。我找到了 2002 年的答案,但它引用了不再存在的库。我希望那里的一些组装大师天使可以帮助我解决这个问题。

请,谢谢!

【问题讨论】:

  • 您必须将相应的 .lib 文件添加到链接器命令行,以便您从中获取 ExitProcessDumpRegs 的库。顺便说一句,当您可以将eaxretn 归零时,为什么还要打电话给ExitProcess
  • 或者在汇编代码中,可以添加includelib指令,如| INCLUDELIB MSVCRTD | | INCLUDELIB 旧名 | .
  • @Ruslan 如果你问我为什么 Irvine 先生这样写代码,我无法回答你。我也不太明白你说的怎么做。
  • @rcgldr 你能告诉我我需要在婴儿步骤中做什么吗?我是 Assembly 的初学者。

标签: assembly x86 masm32 irvine32


【解决方案1】:

首先您需要 Irvine 的库文件(Kernel32.Lib、User32.Lib、Irvine32.lib、Irvine32.inc),您可以从 his site 下载,即下载此文件并安装:http://www.kipirvine.com/asm/examples/Irvine_7th_Edition.msi

现在您在程序的开头插入一些行:

includelib C:\full\path\to\Kernel32.Lib
includelib C:\full\path\to\User32.Lib
includelib C:\full\path\to\Irvine32.lib

; include C:\full\path\to\Irvine32.inc

include...-line 供以后使用,暂时注释掉。

【讨论】:

  • 谢谢!我想知道他为什么没有在他的代码中提到这一点。只是出于好奇,.inc 和 .Lib 有什么区别?
  • @Choirbean:.inc-文件是由汇编程序插入到其include 所在位置的文本 - 就好像您亲自输入了它一样。 .lib-files 是链接器的函数库,因此它知道如何调用外部函数(例如 DumpRegs 和 ExitProcess)。
  • 再次感谢您的帮助!
【解决方案2】:

Irvine 书中的示例程序应该在 MS Visual Studio 上运行,您可以在其中配置库并通过 GUI 包含路径。

如果您想通过命令行进行汇编,您必须通过命令参数指定库路径。下面是一个对我有用的示例。

C:\Users\QMPH64>"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\ml.exe" /I C:\Irvine\ C:\Irvine\Examples\ch03\AddSubAlt.asm /link /SUBSYSTEM:CONSOLE /LIBPATH:C:\Irvine\

或者,您可以在命令行上提供各个库,如下所示。

C:\Users\QMPH64>"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\ml.exe" /I C:\Irvine\  AddSub.asm /link C:\Irvine\Irvine32.lib C:\Irvine\kernel32.lib C:\Irvine\User32.Lib /SUBSYSTEM:CONSOLE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多