assembly - 读取奇数地址,半个字?

标签 assembly cross-platform endianness cpu-architecture word-size

众所周知,许多 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/

相关文章:

assembly - 帮助理解 RedCode

macos - 为什么这段汇编代码会抛出段错误?

linux - 如何检查数字是否代表 NASM Assembly 中的大写字符?

c++ - unix管道如何跨平台端口?

javascript - 如何在 javascript 中交换变量的字节顺序(字节顺序)

c - GCC:为什么 const 数据填充在我的函数内部而不是开头?

java - 无法使用 swtjar 制作 ant 脚本

android - iOS 或 Android 中移动麦克风的跨平台库

java - 在java中查找系统的字节顺序

c - 演示长整数的字节顺序