【问题标题】:Error calling standard C library functions from NASM?从 NASM 调用标准 C 库函数时出错?
【发布时间】:2017-10-08 06:43:18
【问题描述】:

我对汇编编程很陌生。我在 Windows 7(64 位)平台上使用 NASM 2.11.05 来运行一些示例代码。当我尝试从我的汇编代码中调用标准 C 函数时,就会出现问题。这是我的汇编源代码:

global  main
        extern  puts

        section .text
main:                                   
        push    message            
        call    puts                    
        ret                             
message:
        db      "Hola, mundo", 0 

当我用 NASM 编译时,我使用这个命令行:nasm -fwin32 file.asm 产生file.obj。现在,当我尝试将它与 ld 或 gcc 链接时,我不断收到错误消息。我尝试了一些事情:

  1. gcc -m32 -nostartfiles file.obj(给出输入文件的i386:x86-64架构与i386输出不兼容的错误)。

  2. ld file.obj(错误未定义对 puts 的引用)。

谁能指导我如何解决这个问题?

【问题讨论】:

  • 在基于 Linux 的操作系统上,这适用于我,使用您的原始代码没有位 32 。 nasm -felf32 dedduwage_001.s -o dedduwage_001.o && gcc dedduwage_001.o -o dedduwage_001 -m32.

标签: gcc assembly x86 nasm ld


【解决方案1】:

最后,我的 ASM 文件顶部的一行解决了它。这是那条线。

[BITS 32]

但是,输出文件仍然不断崩溃:欢迎任何可以解释的人!

【讨论】:

  • 它可能崩溃了,因为您不符合要求 调用者 清理函数参数的CDECL 调用约定。由于您推送了 4 个字节的参数数据,因此您需要在调用后使用 add esp, 4 之类的内容进行清理
  • 是的,在返回之前添加了这个:pop ebp 并解决了问题。
【解决方案2】:

你可以用不同的方式编译,比如:

  • 使用以下命令创建.asm 文件的对象:
    1. GCC:nasm -f elf file.asm
    2. LD:ld -m elf_i386 file.o -o file

  • 使用gcc -m32 -o file file.o 创建的链接对象文件
  • 使用./file 运行
  • 【讨论】:

    • 他的目标是本地 Windows 可执行文件。
    猜你喜欢
    • 2015-03-15
    • 1970-01-01
    • 2014-07-23
    • 2012-02-10
    • 2016-02-16
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    相关资源
    最近更新 更多