如何在MSVC 2008中使用汇编语言调用C库函数?

时间:2012-04-16 14:32:57

标签: 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库的Hello。',0

        .code

主要PROC

        push    ebp

        mov ebp, esp

        push offset msgTestClib

        call printf

        add esp, 4

        pop ebp

        ret

主要ENDP

        END

1 个答案:

答案 0 :(得分: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 PROC

push OFFSET msgHello

call _printf

add esp, 4

ret 0

_main ENDP

END

好的,方法1:

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

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

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

  4. 汇编代码并运行它。

  5. 方法2:

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

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

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

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

    5. 接下来,在链接器页面中,选择清单文件 - >其他清单依赖项和类型:type ='win32'name ='Microsoft.VC90.CRT'version ='9.0.21022.8'inverlerArchitecture ='x86'publicKeyToken ='1fc8b3b9a1e18e3b'all as one line。

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

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

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

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

      我希望您发现此信息对于使用Visual Studio在Windows中编写汇编代码很有帮助。 祝你好运,玩得开心!

      〜姜氏