- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望学习x86的汇编语言。我在Mac上,并且假设大多数x86教程/书籍都使用适用于Windows的代码。
运行代码的操作系统如何影响代码的工作,或确定代码是否有效?我可以遵循基于Windows的教程,并修改一些命令以使其相对容易地在Mac上运行吗?更一般而言,Mac汇编程序员应该知道哪些技巧?谢谢!
最佳答案
(当然,以下所有内容仅适用于IA-32和AMD64处理器及操作系统的x86和x86-64汇编语言。)
当前可见的其他答案都是正确的,但我认为这很重要。 AT&T与Intel语法完全无关。任何体面的工具都可以同时使用这两种语法,或者可以使用对应的或替代的语法。而且它们仍然以相同的方式组装。 (提示:您确实要使用Intel语法。所有官方处理器文档都使用。AT&T语法只是一件令人头疼的事情。)是的,找到正确的标志传递给汇编器和链接器可能很棘手,但是您会知道何时您已经拥有了它,并且每个操作系统只需要执行一次(如果您记得将它写下来!)。
当然,汇编指令本身完全与操作系统无关。 CPU不在乎它在运行什么操作系统。除非您做的是非常底层的黑客(即OS开发),否则OS与CPU交互的基本内容几乎是无关紧要的。
外界
当您与外界交互时,汇编语言会出现麻烦:操作系统内核和其他用户空间代码。用户空间最棘手:您必须正确设置ABI,否则汇编程序几乎毫无用处。除非您使用蹦床/笨拙的东西,否则这部分通常无法在操作系统之间移植(基本上,对于要支持的每个操作系统,都必须重写另一层抽象)。
ABI最重要的部分是C样式函数的调用约定。它们是最常用的支持,如果您正在编写汇编,则可能要与之交互。 Agner Fog在his site上保留了一些良好的资源; detailed description of calling conventions特别有用。 Norman Ramsey在回答中提到了PIC和动态库。根据我的经验,如果您不想这么做,通常不必打扰那些人。对于汇编语言的典型用法(例如重写内部循环或其他热点的核心功能),静态链接可以正常工作。
调用约定在两个方向上起作用:可以从程序集调用C或从C调用程序集。后者趋于容易一些,但没有太大区别。从程序集调用C可以使用C标准库输出函数之类的东西,而从C调用程序集通常是访问单个性能关键函数的程序集实现的方式。
系统调用
您的程序要做的另一件事是进行系统调用。您可以编写一个完整而有用的汇编程序,该程序从不调用外部C函数,但是,如果您要编写一个纯汇编语言程序,而不将Fun Stuff外包给其他人的代码,则需要系统调用。而且,不幸的是,每个操作系统上的系统调用都完全不同。您需要的Unix风格的系统调用包括(但肯定不限于!)open
,creat
,read
,write
和最重要的exit
,以及mmap
如果您喜欢动态分配内存。
尽管每种操作系统都不同,但是大多数现代操作系统都遵循一种通用模式:将所需的系统调用编号加载到寄存器中(通常为32位代码中的EAX
),然后加载参数(操作方式千差万别) ,最后发出一个中断请求:对于Windows NT内核,它是INT 2E
;对于Linux 2.x和FreeBSD(我相信是OSX),它是INT 80h
。然后内核接管,执行系统调用,并将执行返回给您的程序。根据操作系统的不同,它可能会将寄存器或堆栈作为系统调用的一部分进行垃圾回收;您必须确保已阅读平台的系统调用文档才能确定。SYSENTER
Linux 2.6内核(我相信Windows XP和更高版本,尽管我从未真正在Windows上尝试过)也支持一种更新,更快的方法来进行系统调用:Intel在较新的Pentium芯片中引入的SYSENTER
指令。 AMD芯片具有SYSCALL
,但是很少有32位操作系统使用它(尽管我认为这是64位的标准;我不必从64位程序直接进行系统调用,所以我不确定在此)。 SYSENTER
的设置和使用要复杂得多(例如,参见Linus Torvalds on implementing SYSENTER
support for Linux 2.6:“我是一只令人作呕的猪,并为它的启动感到自豪。”)我可以亲自证明它的特殊性;我曾经写过一个汇编函数,直接将SYSENTER
发行到Linux 2.6内核,但我仍然不了解使它起作用的各种堆栈和注册技巧……但是确实可以!SYSENTER
比发布INT 80h
快一点,因此希望在可用时使用它。为了简化编写快速和可移植代码的过程,Linux将名为linux-gate
的VDSO映射到每个程序的地址空间中。在此VDSO中调用特殊功能将通过最快的可用机制发出系统调用。不幸的是,使用它通常带来的麻烦多于其价值:INT 80h
在小型装配例程中执行起来非常简单,因此值得付出很小的速度损失。除非您需要最终的性能...并且如果需要,您可能始终不想调用VDSO,并且您知道硬件,因此您可以做非常不安全的事情并自己发布SYSENTER
。
其他一切
除了与内核和其他程序进行交互所带来的要求外,操作系统之间几乎没有什么区别。汇编暴露了机器的灵魂:您可以随意工作,并且在您自己的代码中,您不受任何特定调用约定的约束。您可以免费使用FPU和SSE单元;您可以直接PREFETCH
将数据从内存流传输到L1高速缓存中,并确保它在需要时很热;您可以随意堆垛;如果要与(正确配置;祝您好运!)外部调试器进行接口连接,则可以发出INT 3
。这些都不取决于您的操作系统。唯一真正的限制是您正在运行Ring 3,而不是Ring 0,因此某些处理器控制寄存器将对您不可用。 (但是,如果您需要这些,则是在编写OS代码,而不是在编写应用程序代码。)除此之外,这台机器对您很重要:继续进行计算!
关于macos - 操作系统如何影响汇编代码的运行方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1175375/
在跨平台应用程序中,我正在使用一个配置文件,允许用户根据需要覆盖各种默认值。 我的问题是...在哪里放置/查找此配置文件,尤其是关于 MacOS X(我从未使用过且无法访问)?我知道 MacOS X
由于Xcode的代码签名和存档非常耗时,枯燥且有问题,因此我一直通过自己的脚本使用命令行工具xcodebuild,codesign等对我的开发人员ID签名的macOS应用进行代码签名,存档和交付。公证
我正在寻找一种在 MacOs 应用程序中以编程方式逐帧绘制动画的方法(不是关键帧属性动画)。我尝试使用drawLayer:inContext:委托(delegate)方法绘制到CALayers,调用s
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我在83%的安装openCV中遇到问题...我的python是2.7.3。我已经适应了xcode。我使用了这个tuturial。 我的Cmake: cmake -D CMAKE_BUILD_TYPE=
我需要弄清楚 Mac 的日志键的键码(ctrl、shift 等)或者需要知道如何跟踪这个日志按键事件... 基本上我正在将 mac key 代码转换为等效的 Windows key 代码......我
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 2年前关闭。 Improve thi
我想将一个 Rust 程序从我的 x86 Mac 交叉编译成一个可以在 Silicon Mac 上运行的二进制文件,但我无法弄清楚链接。 我有: 运行 macOS 10.15.7 Catalina 的
在 macOS ventura 中,我无法复制我的终端应用程序。 我想这样做,因为我有一个 M1 处理器,我想要一个使用 Rosetta2 打开的处理器和一个本地打开的处理器。 有什么办法解决这个问题
当您可以访问实际硬件时,在 Mac 上以安全模式启动是很容易的。您只需在启动时按住 shift 键即可。 在虚拟机中运行 macOS (OSX) 时如何启动到安全模式? 最佳答案 Schmitty 在
这个问题在这里已经有了答案: How to get Conda and Virtualenv to work on mac OS Catalina? (8 个答案) 关闭 3 年前。 我在 macO
我有一个关于 macOS 应用程序图标的问题。我以前看过很多动画图标,但从来没有真正密切关注正在发生的事情/他们是如何做的。我只是想知道是否有任何方法可以创建在停靠栏中动画的动画应用程序图标。 例如:
每当我在 vim 中输入终端命令(例如,!echo hello)时,我会立即被踢出去查看该终端命令的结果,然后提示我使用 按 ENTER 或键入命令继续。这有点刺耳。我想留在 vim 中,并在底部打印
当使用文本编辑应用程序时,选择一种字体(例如“Menlo”)来呈现字形,当所选字体不包含特殊字形(例如“𠹷”,它是一个简单的中文字形,“Menlo"不包含它), 应用程序会选择一种字体来呈现它, 在
已经有几个关于如何在 Mac 上启用虚拟化的问题(例如 How to enable support of CPU virtualization on Macbook Pro?)。经常报告 sysctl
这只是出于好奇。 Exposé 有两个功能,其中一个是重新排列桌面上的窗口,一个是显示所有打开的窗口,这样用户可以看到隐藏在其他窗口下面的窗口,另一个功能是将所有窗口移到两侧,让用户与桌面交互。 我只
我使用的是 MacOS X,我对应用程序包类型的东西还很陌生。我正在编写一个程序来打开一个窗口并注册鼠标输入——而不是一个命令行工具。当我将我的代码(用 C 编写,如果这很重要)编译成一个可执行文件(
我正在制作一个必须支持 macOS 的 Flutter 插件。但是,当我想创建一个插件并在示例应用程序中运行该插件时(即使我还没有编辑过 Flutter 生成的代码),Xcode 会抛出以下错误。 无
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我想在终端(MacOs)中像屏幕一样显示当前目录面包屑: 我该怎么做? 现在它只是一个文本...... 谢谢 最佳答案 首选项 -> 窗口 -> 检查工作目录或文档下的“路径”。 路径将作为窗口标题的
我是一名优秀的程序员,十分优秀!