visual-studio-2008 - 如何在 MSVC 2008 中从汇编语言调用 C 库函数?

标签 visual-studio-2008

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

最佳答案

好的,我找到了答案。实际上存在两种解决方案。但首先,错误的原因是对 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

_主要过程

push OFFSET msgHello

call _printf

add esp, 4

ret 0

_main 结束

END

好的,方法一:

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

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

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

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

方法二:

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

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

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

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

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

  6. 汇编并运行您的代码。

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

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

顺便说一下,我还通过调用 Win32 API 和 C 运行时库测试了方法 1,代码运行良好。换句话说,您可以在同一代码中同时使用 Windows API 调用和 C 运行时库调用。

希望这些信息对您使用 Visual Studio 在 Windows 中编写汇编代码有所帮助。 祝你好运,玩得开心!

~江市

关于visual-studio-2008 - 如何在 MSVC 2008 中从汇编语言调用 C 库函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10176120/

相关文章:

asp.net - "Place code in separate file"在带有 ASP.NET 的 Visual Studio 2008 中

c# - 如何在 Visual Studio 输出窗口中运行控制台应用程序,而不是打开新的命令提示符?

visual-studio - 编辑 aspx/母版页时 Visual Studio 2008 卡住

visual-studio-2008 - IIS7 : URL Rewrite not working when debugging with Visual Studio

c++ - 我可以在哪里定义 MFC 应用程序中的全局变量?

c++ - C2440 编译错误

c++ - 添加图标时 CMFCStatusBar 更改高度

c++ - 在多个对话框中显示和使用相同的 MFC CList 控件

c - 是否可以仅通过代码以管理员身份运行

windows - 安装 .net 2008 Windows 服务