ARM程序集和x86程序集之间的差异

Nat*_*pos 28 embedded x86 assembly arm

我现在要学习ARM Assembly,为我的Windows Mobile 5 iPAQ开发,但我有一些问题:

  • ARM组件和x86组件之间的主要区别是什么?
    • 中断是否存在差异(新类型)?
      • 他们是谁,他们的意义是什么?
    • 编译的最佳汇编程序以及从何处获得它?
  • 哪里可以找到一些好的资源?

Mic*_*urr 51

主要区别:

  • ARM是RISC风格的体系结构 - 指令具有常规大小(标准ARM为32位,Thumb模式为16位,但Thumb有一些指令可以咀嚼2个指令'插槽')

  • 通过至少ARM v5架构(我不确定v6是做什么),ARM上的中断模型与英特尔有很大不同 - 而不是将寄存器推入堆栈,ARM交换到一组不同的寄存器'正常的一套.处理器的模式确定哪个寄存器文件是可见的(并且不是所有寄存器都必须被遮蔽).这是一个相当复杂的安排.较新的ARM架构(无论如何,v7)都有一个更接近英特尔的中断模型,当中断发生时寄存器被压入堆栈.

Arm指令有一些不在英特尔的有趣功能:

  • 指令内置了条件标志 - 因此,如果指定的条件标志与当前状态寄存器标志状态不匹配,则每条指令都可以作为NOP执行(这可以用于避免所有那些跳转到您经常看到的一条或两条指令周围英特尔组装).
  • ARM具有可以作为指令的一部分嵌入的移位逻辑.因此,当使用寄存器作为源操作数时,可以将其作为指令的固有部分进行移位.这有助于索引数组,有时使用算术.

另一方面,除了从内存加载和存储外,ARM不能直接对内存做很多事情.英特尔组件可以直接在内存上执行更多操作.

请注意,ARM体系结构版本与实际ARM处理器版本不直接对应 - 例如,如果我没记错,ARM7是体系结构v5处理器.就个人而言,我发现这比应该更加混乱.

ARM体系结构参考可从http://www.arm.com免费下载.我还建议将Hitex指南的副本提供给各种ARM微控制器,以获得良好的起点.

有关ARM入门指南的几个Stackoverflow问题.检查它们将为您提供许多好的开始:

  • ARM7是ARMv4.ARM9是ARMv4T或ARMv5E.(E暗示TDMI)"ARM <digit>"是CPU系列."ARMv <digit>"是指令集版本. (8认同)

Cli*_*ord 11

您还应该意识到ARM许可他们的IP而不是生产芯片.被许可方可以通过多种方式配置其ARM核微处理器.最重要的是,您的问题是ARM内核本身只定义了两个中断IRQ和FIRQ,最常见的是,有一个供应商特定的中断控制器,因此如果您需要知道如何使用,您需要准确知道设备中使用的微处理器处理中断.iPAQ型号使用了各种Intel StongARM和XScale处理器.如果要在该级别进行开发,则应下载特定部分的用户参考手册.

总而言之,操作系统提供了中断服务和设备驱动程序,因此您可能不需要担心这种低级别的细节.事实上,我会质疑汇编程序的选择是你的开发语言.在ARM上几乎没有理由选择汇编程序而不是C语言编写C++(编译器几乎肯定会在代码性能方面表现出色).此外,在Windows Mobile上,最高效的应用程序级语言可能是C#.

  • "编译器几乎肯定会在代码性能方面表现出色".IME,你必须真的很喜欢编程才能成为现实. (2认同)
  • @Jon:这一点可能需要一些资格:一个不熟悉指令集和特定于它的习惯用语的临时汇编程序员,不太可能超出具有*知识的从业者*编写的编译器优化器.能够在高效率的情况下超越优化编译器的人的成本和可用性可能也是令人望而却步的.可能你是那个从业者,或者"你经验中"的编译器很糟糕?;) (2认同)