Xcode与NASM编码

Xcode与NASM编码,xcode,nasm,Xcode,Nasm,如何在Xcode中用汇编语言编写和构建程序 我寻找它,但没有成功。你能帮助我吗?如果无法在xcode中编写NASM代码,请推荐一些好的IDE。这可能是您提出此问题后的一个变化,但目前,安装(在安装xcode之后)将安装NASM(Netwide Assembler)和GASM(GNU Assembler)。要在汇编中开始编码,您有两个选项,具体取决于您正在执行的操作:即,在Xcode中构建,或直接使用NASM或GASM在终端中构建 代码9.4.1 如果您想使用IDE,您可以通过单击“文件>新文件”

如何在Xcode中用汇编语言编写和构建程序


我寻找它,但没有成功。你能帮助我吗?如果无法在xcode中编写NASM代码,请推荐一些好的IDE。

这可能是您提出此问题后的一个变化,但目前,安装(在安装xcode之后)将安装
NASM
(Netwide Assembler)和
GASM
(GNU Assembler)。要在汇编中开始编码,您有两个选项,具体取决于您正在执行的操作:即,在Xcode中构建,或直接使用
NASM
GASM
在终端中构建

代码9.4.1 如果您想使用IDE,您可以通过单击“文件>新文件”,然后搜索“程序集”,将程序集文件添加到Xcode中,您将看到一个程序集文件类型。或者,您可以添加一个空白文件,然后从文件检查器的“类型”下拉列表中手动选择文件类型。除非您的应用程序需要Cocoa框架,否则您应该在项目/目标创建期间创建命令行应用程序,而不是Cocoa应用程序。作为命令行程序的示例:

hello.asm(来自参考资料中列出的教程网站):

main.swift:

如果希望在汇编操作中使用C而不是Swift,则需要创建头文件而不是使用
@\u silgen\u name

#ifndef Bridging_Header_h
#define Bridging_Header_h

const char *start(void);

#endif /* Bridging-Header_h */
程序集生成规则 您还必须为目标提供“构建规则”,这一点很重要。为此:

  • 单击项目导航器中的项目图标
  • 在目标列表中选择适当的目标
  • 单击“构建规则”选项卡
  • 在搜索字段中搜索NASM
  • 单击“复制到目标”,确保“进程”设置为“NASM程序集文件”,“使用”设置为“自定义脚本”
  • 在下面的“自定义脚本”部分,键入以下命令(确保路径指向NASM汇编程序的位置):
    /usr/local/bin/nasm-f macho64${INPUT_FILE_PATH}-o${SCRIPT_OUTPUT_FILE_0}
    这是一个终端命令——要了解更多信息,请在终端中键入
    mannasm
  • 然后单击“输出文件”部分中的加号并添加以下内容:
    $(派生文件\u目录)/${INPUT\u FILE\u BASE}.o
  • 此生成规则对于避免出现“未找到架构x86_64的符号”的编译器错误至关重要

    终点站 如果您不介意,或者可能更喜欢在终端中工作,您可以利用您选择的文本编辑器(
    vim
    nano
    、和
    emacs
    内置在终端中,而TextEdit内置在macOS中)来创建程序集文件。然后使用
    nasm
    gasm
    命令组合文件。键入
    man-nasm
    man-gasm
    ,查看您可用的各种选项

    参考文献:
    汇编代码示例-
    从Swift或C引用程序集(需要桥接标头)-

    构建规则-

    我的2美分用于Xcode 11和内联(主要用于didact使用…)

    无需使用外部工具:

    int main(int argc, const char * argv[]) {
    
         long long test = 0;
    
    asm
    {
    
        mov rax, test
        inc rax
        inc rax
        inc rax
        mov test, rax
    
    }
    
    printf("Hello, World! %lld\n", test);
    
    return 0;
    

    }

    Xcode的内置汇编程序是GNU
    gas
    ,它特别不适合人类使用。很多人还是使用它,但是如果你想要另一个汇编程序,你必须在标准工具链之外安装它。我认为OSX没有任何非GNUIDE。
    #ifndef Bridging_Header_h
    #define Bridging_Header_h
    
    const char *start(void);
    
    #endif /* Bridging-Header_h */
    
    int main(int argc, const char * argv[]) {
    
         long long test = 0;
    
    asm
    {
    
        mov rax, test
        inc rax
        inc rax
        inc rax
        mov test, rax
    
    }
    
    printf("Hello, World! %lld\n", test);
    
    return 0;