所有这些假设都有反例。
每条指令的大小
Intel x86 从很久以前就拥有可变长度指令。 ARM 在 Thumb-2 模式下也是如此。
每个寄存器的最大尺寸
你的意思是 -integer寄存器,对吗?例如,Intel 上的浮点寄存器的长度为 10 个字节。这是最接近的。但 Intel x86 是一个值得注意的例外——它对“字”的定义在 16 位 CPU 时代就已经固定了;随着 ISA 的发展,这个定义被保留了下来。
类似地,在 ARM 的 AArch64 指令集上下文中,“字”表示“32 位”,而通用寄存器是 64 位。 “字”的定义在 ARM 的 32 位鼎盛时期就被固定下来,并一直沿用至今。
每个内存地址的最大大小
显然是错误的。 16 位 Intel 286 有 24 位地址空间。这是通过内存管理单元 (MMU) 执行的 - 寄存器中的用户级地址与进入内存子系统的物理地址不同。与最新 Intel CPU 上的 PAE 相同。过去,Intel x86 的线性 20 位地址由 16 位段和偏移量组成。
CPU在单条指令中可以处理的最大整数
这个已经很接近了——但同样,也有例外。到处都有两个寄存器命令。 MIPS 有 hi:lo - 一对专用的 32 位寄存器,可以充当单个 64 位寄存器。 Intel 具有可在 xDX:xAX 对上运行的命令。别让我开始谈论 SIMD。
在单次操作中可以与工作内存之间传输的最大数据块
ARM有“加载多个”和“存储多个”命令,最多可以一次性存储16个寄存器。 Intel有PUSHA/POPA。在物理层面上,内存总线也有所不同。
肮脏的小事实是,除了单词出现的书籍和使用它的汇编程序的上下文之外,没有任何单词的真正定义。在 Intel 上,“word”自古以来就用来表示 16 位块;随着 CPU 变为 32 位和 64 位,它们保留了定义,现在我们讨论的是 DWORD 和 QWORD。现代 64 位 Intel CPU 上的寄存器是 QWORD 大小的。 Windows API 不再是严格意义上的 Intel,它诞生于 16 位 Intel,并且仍然保留了数据类型。WORD
在 windows.h 中定义为无符号短整型(2 个字节),并且他们永远无法更改它 - 这会破坏结构布局,因此会破坏二进制格式,对于任何地方的每个人来说。
另一方面,在 ARM 上,“字”表示 32 位,即使在 AArch64 指令集的上下文中也是如此。因此,有诸如“加载半字”之类的汇编命令可与 16 位操作数一起使用。因此,当在 ARM 上的 Windows(即 Windows Phone、Windows RT、Windows CE/Mobile)中使用 C 语言进行编码以及对其进行汇编时,您必须记住两个不同的定义。幸运的是,考虑到这种模糊性,没有人会用文字来思考——至少在没有将实际大小牢记在心的情况下。此外,ARM 的汇编语言强烈鼓励尽可能多地使用 32 位值,并在必要时提倡使用 16 位变量。因此,即使函数的 16 位参数也会在内部作为 32 位寄存器传递。