gpt4 book ai didi

macos - 操作系统如何影响汇编代码的运行方式?

转载 作者:行者123 更新时间:2023-12-03 12:38:37 24 4
gpt4 key购买 nike

我希望学习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风格的系统调用包括(但肯定不限于!)opencreatreadwrite和最重要的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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com