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

时间:2009-11-13 22:50:43

标签: assembly embedded x86 arm

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

  • ARM程序集和x86程序集之间的主要区别是什么?
    • 中断有什么不同(新类型)?
      • 他们是谁以及他们的意义是什么?
    • 编译最好的汇编程序以及从何处获取它?
  • 哪里可以找到一些好的资源?

2 个答案:

答案 0 :(得分:50)

主要差异:

  • 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's guides to various ARM microcontrollers的副本以获得良好的起点。

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

答案 1 :(得分:11)

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

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