【问题标题】:Calling assembly routine in objective C在目标 C 中调用汇编程序
【发布时间】:2023-03-16 08:50:02
【问题描述】:

我在汇编文件 math.nasm 中写了一个函数 nabs 如下

%ifdef USE_x86_ASM
SECTION .text

    cglobal nABS
;*------------------------*
;* int nABS(int a)        * 
;* return value in eax    * 
;*------------------------*
ALIGN 16
    nABS:
        push ebx
        ......
                ......
                 pop ebx        
        ret
%endif

我正在从文件 myfunc.c 中的 c 函数 func1 调用此函数
我正在对汇编文件使用 nasm 汇编器 我正在使用 X-code 3.1 版本和 gcc 4.0 编译器 我已经定义了 USE_x86_ASM

在 Xcode 设置 Project Settings/Build/NASM BUILD OPTIONs/OTHER FLAGS AS -DUSE_X86_ASM
我还在头文件 myfunc.h 中定义了这个预处理器
我在 myfunc.h 中将 nABS 声明为

#define USE_x86_ASM 
int nABS(int a);

并在 myfunc.c 中包含 myfunc.h
myfunc.c 和 math.nasm 都被编译并生成 math.o 和 myfunc.o,但我得到一个链接错误

Undefined symbols:
  "_nABS", referenced from:
      _func1 in myFunc.o

谁能告诉我为什么会出现链接错误?


我做了建议的修改另外我删除了%ifdef条件修改后的代码如下

.text
.align 2
.globl _nABS   
.private_extern _nABS  

_nABS: 推 ebx …… …… 流行 ebx
ret 在编译文件时我仍然遇到相同的链接错误,但我得到相同的链接错误。 我检查了生成的 .o 是否包含 app.LinkFileList。

【问题讨论】:

    标签: objective-c xcode assembly nasm


    【解决方案1】:

    一些 C 编译器会在 C 符号前添加下划线。只需将下划线添加到您在程序集文件中的标签(当然还有 globl 指令)。

    【讨论】:

      【解决方案2】:

      梅赫拉德是对的 这应该工作

      %ifdef USE_x86_ASM
      SECTION .text
      
      ;*------------------------*
      ;* int nABS(int a)        *     
      ;* return value in eax    *     
      ;*------------------------*
      ALIGN 16
      global _nABS
          nABS:
              push ebx
              ......
                      ......
                       pop ebx        
              ret
      %endif
      

      【讨论】:

        猜你喜欢
        • 2021-12-05
        • 2014-04-01
        • 1970-01-01
        • 2011-04-04
        • 1970-01-01
        • 2011-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多