Xcode 和 NASM 编码

2024-03-14

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

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


自从您提出这个问题以来,这可能已经发生了变化,但目前,安装Xcode 命令行工具 https://developer.apple.com/download/more/(安装 Xcode 后)安装NASM(网络汇编器)和GASM(GNU 汇编器)。要开始在汇编中进行编码,您有几个选项,具体取决于您正在执行的操作:即在 Xcode 中构建,或使用以下命令在终端中构建NASM or GASM直接地。

Xcode 9.4.1

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

hello.asm(来自参考文献中列出的教程站点):

global    _start

section   .text

_start: mov       rax, 0x02000004         ; system call for write
        mov       rdi, 1                  ; file handle 1 is stdout
        mov       rsi, message            ; address of string to output
        mov       rdx, 13                 ; number of bytes
        syscall                           ; invoke operating system to do the write
        mov       rax, 0x02000001         ; system call for exit
        xor       rdi, rdi                ; exit code 0
        syscall                           ; invoke operating system to exit

        section   .data
message:  db        "Hello, World", 10      ; note the newline at the end

主要.swift:

import Foundation

//  Generate a "name" for the assembler operation that may be used
//  as a Swift function.
@_silgen_name("start") func start() -> String

//  Create a fake struct to use our function.  We return 0 so that we
//  can call `variable()` below without any warnings (because we're
//  we're setting something).
struct Test {
    func variable() -> Int32 {
        print(start())
        return 0
    }
}

//  Declare a test instance and call `variable`.  `x` is merely acting 
//  as a placeholder so we can call variable and not get warnings for
//  this test example.
let x = Test().variable()

如果您希望使用 C 而不是 Swift 进行汇编操作,则需要创建头文件而不是使用@_silgen_name:

#ifndef Bridging_Header_h
#define Bridging_Header_h

const char *start(void);

#endif /* Bridging-Header_h */
Assembly Build Rule

您还必须为目标提供“构建规则”,这一点很重要。为此:

  1. 单击项目导航器中的项目图标
  2. 在目标列表中选择适当的目标
  3. 单击“构建规则”选项卡
  4. 在搜索栏中搜索 NASM
  5. 单击“复制到目标”,并确保“进程”设置为“NASM 程序集文件”,“使用”设置为“自定义脚本”
  6. 在下面的“自定义脚本”部分中,输入以下命令(确保路径指向yourNASM 汇编器):
    /usr/local/bin/nasm -f macho64 ${INPUT_FILE_PATH} -o ${SCRIPT_OUTPUT_FILE_0}这是一个终端命令——要了解更多信息,请输入man nasm在终端中。
  7. 然后单击“输出文件”部分中的加号并添加以下内容:
    $(DERIVED_FILE_DIR)/${INPUT_FILE_BASE}.o

此构建规则对于避免出现“未找到架构 x86_64 的符号”的编译器错误至关重要。

Terminal

如果您不介意,或者可能更喜欢在终端中工作,您可以使用您选择的文本编辑器(vim, nano, and emacs内置于终端中,TextEdit 内置于 macOS 中)来创建程序集文件。然后使用nasm or gasm用于组装文件的命令。类型man nasm or man gasm为您提供各种可用的选项。

参考:
汇编代码示例 -你好.asm http://cs.lmu.edu/~ray/notes/nasmtutorial/
从 Swift 或 C 引用程序集(需要桥接头)-丹尼尔·特兰 https://stackoverflow.com/a/39421006/3928158
构建规则 -公制熊猫 https://metricpanda.com/compiling-nasm-with-xcode-in-a-cpp-project

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xcode 和 NASM 编码 的相关文章

  • UIPageViewController 并删除当前视图控制器

    I setup UIPageViewController通过一些视图控制器前进和后退 我有一个问题 当视图控制器添加到UIPageViewController内存使用量将会增加 直到编译器给我Received memory warning然
  • 在 Xcode 3.2 中使用第三方框架时出现问题

    我正在尝试使用第三方库 MPOAuthConnection 设置自己的项目来连接到 oauth REST API 到目前为止我已经完成的步骤 下载 MPOAuthConnection 的源代码 构建源代码并在 产品 选项卡中生成 MPOAu
  • NSString 到 Double 问题

    可能很简单 但我不明白 我有一个 NSString50 81114我想把它转换成双 目前我正在使用 string doubleValue 但这是作为50 811140000002这是怎么回事 Disco 由于精度有限double无法存储50
  • 学习在 Xcode 中编译 C++

    我已经开始在学校广泛使用 C 现在我的程序已经达到了拥有超过 1 个文件 即头文件 驱动程序 实现文件 的地步 我对软件开发了解不够 无法通过查看苹果的指南来理解或掌握如何设置构建过程 有人可以指导我如何在 xcode 中编译一个带有头文件
  • 归档时 XCode 挂起

    当我尝试归档某个项目时 Xcode 无法响应 如果不管他 他会在很长一段时间后设法打开组织者 档案就在那里 如果从library developer xcode archives中手动删除 Xcode会再次响应 这种情况只发生在这个项目中
  • int 13h 42h 不会在 Bochs 中加载任何内容

    我将引导加载程序从 CHS 更改为 LBA 因此我更换了int 13h 02h with int 13h 42h 它在 QEMU 中工作正常 但是 我在 Bochs 和我的笔记本电脑上运行它时遇到问题 我将引导加载程序写入 USB 闪存驱动
  • Swift Joint:在可观察对象中使用计时器发布者

    在这个问题被标记为重复之前这另一个问题 https stackoverflow com questions 57199922 create a timer publisher using swift combine 我试图了解出版商是如何运
  • Xcode 问题导航器中不显示警告

    我的项目构建时出现警告 但它没有显示在 问题导航器 中 我怎样才能收到此警告并解决它 我尝试单击窗口顶部的警告 但没有任何作用 我正在使用 Xcode 4 3 我遇到了同样的问题 我发现它只是因为下面的过滤器输入有问题 您可以通过在下面的过
  • XCode 4 中硬编码的本地化文件路径 - 当项目移动到新文件夹时消失

    我们最近使用 Xcode 将一个项目本地化为 15 种语言 但我注意到当我将该项目带回家时 一些本地化文件的路径都被硬编码到我工作 Mac 的完整路径 我们只本地化了两个文件 InfoPlist strings Localizable st
  • 由于 Xcodebuild,终端在每个命令上都停止运行

    我刚刚将 Xcode 更新到 11 4 突然间我的终端 iTerm 3 3 9 变得非常慢 键入命令效果很好 但在按下 Enter 后 我经常等待 3 4 秒才能执行一个简单的任务 cd git add etc 当我查看状态栏时 我注意到x
  • ios 7 - 强制视图布局翻转到 RTL,无需更改语言

    我的应用程序中有一些视图需要能够显示 LTR 和 RTL 内容 但不能同时显示 并且它必须与一般应用程序布局方向无关 意思是 我希望能够告诉特定视图将其布局从 LTR 翻转到 RTL 反之亦然 无需更改系统语言 我对此进行了相当多的研究 但
  • 如何了解xcode调试中的CPU和内存消耗

    在 Xcode 5 中 有一个新的调试面板 分别以 和 MB 为单位显示 CPU 和内存消耗 我们如何利用这个 我应该尝试保持在以下 CPU 百分比阈值吗 我有时会看到我的应用程序达到 100 或以上 这是否意味着我在应用程序中进行了太多处
  • 为什么 Obj-C 属性默认所有权“分配”而不是“强”

    我正在向旧项目添加 Swift 类 一切进展顺利 直到我尝试向 Swift 类添加属性 生成的标头无法编译 我认为问题是 在生成的代码中 Swift 省略了strong所有权并仅将其声明为nonatomic 这通常应该足够了 因为 prop
  • iOS App Today 扩展未上传到物理设备

    我正在为我的应用程序创建一个今日小部件http budgt ch http budgt ch因为一些用户要求快速访问关键功能 初步 扩展在 iOS 模拟器上运行良好 安装如下 1 安装最新的容器应用程序 2 安装以 今天 为容器的扩展 但是
  • Swift - 本地通知不会被触发

    我正在 Swift 3 中编码 我只是想发送通知now没有任何延迟或间隔 然而 通知永远不会被触发 这是我的代码 视图控制器代码 import UserNotifications class HomeViewController UIVie
  • 自定义字体显示在 IB 中,但不显示在模拟器中

    我已经设置了一个UITextView and a UILabel使用自定义字体 它是垂直镜像的蒙古文字体 但我还添加了英文文本 以便您可以看到效果 这些文字显示在 Interface Builder 中 但在模拟器中大部分字符都在UITex
  • 如何从项目中删除 CocoaPods?

    从项目中删除 CocoaPods 的正确方法是什么 我想删除整个 CocoaPod 由于我的客户施加的一些限制 我无法使用它 我只需要一个 xcodeproj 而不是 xcworkspace 可以从项目中删除 CocoaPods 但目前 C
  • iPad 照片选择器崩溃

    我正在使用以下函数根据 UIActionSheet 的结果激活设备相机或图像选择器 如果 fromCamera YES 那么它适用于 iPhone 和 iPad 如果 fromCamera NO 那么它可以在 iPhone 上运行并出现图像
  • 检查定位服务是否开启

    我一直在对 CoreLocation 进行一些研究 最近 我遇到了一个在其他地方 但在 Objective C 和 iOS 8 中 已经讨论过的问题 我觉得问这个问题有点傻 但是如何在 iOS 9 上使用 swift 检查是否启用了位置服务
  • 模块未使用库演化支持进行编译;使用它意味着无法保证二进制兼容性

    最近我遇到了 SDK 的编译时警告 这是否意味着它不是使用目标设置 构建用于分发的库 构建的 你需要设置Build Libraries for Distribution在项目中Build Settings to No然后它就会消失

随机推荐