众所周知,许多 CPU 架构(ARM、PPC)不能读取奇数地址,但如果强制读取也会产生异常,还有一些可以,但速度稍慢。 (x86)
但是是否有任何 CPU 只能寻址完整的 32 位(或更大!)字? IE。它不能寻址16位字吗?也许是 amd64?
我正在尝试编写一个类似于分配器的可移植但快速的 C malloc,并希望正确对齐我的内存访问。目前我的目标是 ARM、i386 和 amd64,我可以查找这些特性,但我认为保持警惕会很好。
我想提出问题的具体方式是;
是否有 CPU 从地址 0x2 读取 16 位(假设一般情况下接近 0 的地址范围有效,我知道有些 CPU 不使用第一页)会产生总线错误,其中 CPU = MIPS、ARM、x86、amd64、68k、88000、SH、OpenRISC、Sparc、PPC、Cell/SPE 中的任何一个?
(顺便说一句,我是从 C 程序员的角度来看这整件事的。所以我假设 C 编译器为我提供了所有正常的 C 类型,例如 char、uint32_t 等。)
最佳答案
Cell 的 SPE 只有 16 字节四字加载/存储,并且它们必须在 16 字节边界上对齐。
如果需要更细粒度的寻址,则必须读取-修改-写入,并使用位掩码仅更新数据的相关部分。
显然,在 C/C++ 中,编译器会对此提供协助,并且指令集中支持生成和使用掩码。
对于从地址“2”读取 16 位的示例,您必须从地址“0”读取 128 位并屏蔽掉您需要的位。如果您想将 16 位写入地址“2”,则需要先读取所有 128 位,然后更新相应的 16 位,然后全部写回。
关于assembly - 读取奇数地址,半个字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13869228/