3

Microsoft Visual Studio Pro 2008 C++ 为编写、汇编和链接纯汇编语言程序提供了出色的 IDE。虽然我可以构建与 Win32 API 链接的 asm 程序(用于控制台输入和输出),但我无法链接到 C 运行时库。好吧,实际上它链接正常,但在运行时出现 r6032 错误 - 库未正确初始化/加载错误。有人可以告诉我如何设置 IDE(和代码)来调用 C 库函数吗?下面是调用 printf 的示例。顺便说一句,我一直在使用 msvcrt.lib。我也试过 libcmt.lib。

提前致谢。

        .586
        .model flat                             

        extern printf:near

        .data

msgTestClib db '来自 C 库的你好。', 0

        .code

主进程

        push    ebp

        mov ebp, esp

        push offset msgTestClib

        call printf

        add esp, 4

        pop ebp

        ret

主要ENDP

        END
4

1 回答 1

4

好的,我找到了答案。实际上存在两种解决方案。但首先,错误的原因是对 VS 2005 及更高版本进行了更改,更改了程序集的组合方式,这导致了处理 VS 基础的技术信息。“如何”在这里更为重要。首先我把示例代码放上来,不管用什么方法,基本上都是一样的代码。

编码:

;sh3.asm - test using c run-time library functions

.586
.model flat

EXTRN   _printf:PROC

        .data

msgHello DB '来自 C 库的你好!', 0ah, 00h

.code

_main 进程

push OFFSET msgHello

call _printf

add esp, 4

ret 0

_main ENDP

END

好的,方法一:

  1. 从一个空项目开始;添加扩展名为 .asm 的源文件并输入代码。确保使用 _main 命名代码的入口点。方法二处理使用不同的名称。

  2. 接下来,通过在解决方案资源管理器中右键单击项目名称并选择自定义构建规则来设置使用 MASM 的项目;选中 Microsoft 宏汇编程序框。

  3. 接下来,转到项目 -> 属性 -> 链接器 -> 附加依赖项并输入 C 运行时库名称。例如,用于发布代码的 msvcrt.lib,或用于调试阶段的 msvcrtd.lib。重要提示:不要为入口点或子系统输入任何条目。

  4. 组装您的代码并运行它。

方法二:

  1. 从一个空项目开始;添加扩展名为 .asm 的源文件并输入代码。使用您选择的标签命名代码的入口点。例如,开始。

  2. 接下来,通过在解决方案资源管理器中右键单击项目名称并选择自定义构建规则来设置使用 MASM 的项目;选中 Microsoft 宏汇编程序框。

  3. 接下来,转到项目 -> 属性 -> 链接器 -> 附加依赖项并输入 C 运行时库名称。例如,用于发布代码的 msvcrt.lib,或用于调试阶段的 msvcrtd.lib。

  4. 接下来,在链接器页面中,选择系统并更改为控制台,然后转到高级并在入口点框中键入您的条目标签,例如开始。

  5. 接下来,在链接器页面中,选择清单文件 -> 附加清单依赖项并输入:type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken=' 1fc8b3b9a1e18e3b' 全部为一行。

  6. 组装并运行您的代码。

您可能想知道人们在哪里可以找到其他依赖项的资料,因为这些信息很可能是 VS 和 Windows 版本相关的。使用方法 1 创建一个简单的项目,然后找到它的清单文件并在文本编辑器中读取它。您将看到包含信息的依赖行。

就个人而言,我发现方法 1 是完成这项工作的最简单方法。被迫将我的入口点命名为 _main 是为了灵活地使用 C 运行时库代码而付出的很小的代价。它还具有不必设置子系统的优点。现在,作为特别说明 - 如果您不使用 C 运行时库,则使用方法 2 并省略添加其他清单依赖项的步骤;不需要!

顺便说一句,我还使用对 Win32 API 和 C 运行时库的调用测试了方法 1,并且代码运行良好。换句话说,您可以在同一代码中同时使用 windows api 调用和 c 运行时库调用。

我希望这些信息有助于您使用 Visual Studio 在 Windows 中编写汇编代码。祝好运并玩得开心点!

~江市

于 2012-04-18T14:38:19.493 回答