相关疑难解决方法(0)

每个程序员应该了解的内存?

我想知道Ulrich Drepper 从2007年开始对每个程序员应该知道的内容有多少仍然有效.另外,我找不到比1.0更新的版本或勘误表.

optimization x86 memory-management cpu-architecture micro-optimization

145
推荐指数
3
解决办法
2万
查看次数

为什么在x86上对自然对齐的变量进行整数赋值?

我一直在读这篇关于原子操作的文章,它提到了32位整数赋值在x86上是原子的,只要该变量是自然对齐的.

为什么自然对齐确保原子性?

c c++ concurrency x86 atomic

28
推荐指数
2
解决办法
5386
查看次数

为什么在64位虚拟地址与物理地址(52位长)相比,4位短(48位长)?

在"低级编程:英特尔®64架构上的C,汇编和程序执行"一书中,我读到:

每个虚拟64位地址(例如,我们在程序中使用的地址)由几个字段组成.地址本身实际上只有48位宽; 它被符号扩展为64位规范地址.它的特点是它的17个左位是相等的.如果不满足条件,则在使用时立即拒绝该地址.然后借助特殊表将48位虚拟地址转换为52位物理地址.

为什么虚拟地址和物理地址之间的差异为4位?

assembly memory-management virtual-memory memory-address mmu

12
推荐指数
1
解决办法
2304
查看次数

QWORD 在 64 位机器上的大小是多少?

我目前正在寻找上述问题的答案。到目前为止,我发现有人说,字长是指处理器寄存器的大小,这表明在 64 位机器上,字长为 64 位,因此 QWORD(4 * 字)的大小为 256 位。

但在另一方面,我发现像源说的大小将是128个比特(64个比特为32位和加倍此对64位),而即使这样其他建议的大小将是64个比特。但最后一个与 Microsoft 有某种关系,它通过将单词的大小定义为 16 位来混淆每个人,从而使情况变得更糟。

也许有人可以解决我的困惑并在这个主题上启发我。

assembly cpu-architecture cpu-word 32bit-64bit

7
推荐指数
1
解决办法
1万
查看次数

在 Intel x86-64 架构上,机器代码指令是否以小端 4 字节字获取?

尽管单词的常见定义(维基百科所述)是:

用于指定存储器中的位置的最大可能地址大小通常是硬件字(这里,“硬件字”是指处理器的全尺寸自然字,而不是使用的任何其他定义)。

根据一些消息来源,x86 系统注意到它被视为 16 位:

在 x86 PC(Intel、AMD 等)中,虽然架构很早就支持 32 位和 64 位寄存器,但其本机字大小可以追溯到 16 位起源,“单个”字为 16 位。“双”字是 32 位。请参阅 32 位计算机和 64 位计算机。

然而英特尔的官方文档(sdm 第 2 卷,第 1.3.1 节)指出:

这意味着字的字节从最低有效字节开始编号。图 1-1 说明了这些约定。

图 1-1 显示了 x86-64 上下文中单词的小端序列中的 4 个字节,而不是 2 个字节或 8 个字节(如上面链接的来源的不同定义所建议的那样):

在此输入图像描述

我对这一切真正感到困惑的是如何获取和解析指令。我正在编写一个模拟器,一旦我解析 PE 格式的可执行文件并进入文本部分,如果我要遵循 4 字节小端格式,这是否意味着将首先解析第 4 个字节?

让我们组成一些字节,例如:

.text segment buffer:
< 0x10, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20 > ....
Run Code Online (Sandbox Code Playgroud)

我会将第一条指令解析为 1C、1B、1A、10、20、1F、1E、1D ...(等等,由于长度可变,显然可能有更多的单词需要读取,具体取决于这里的实际字节是什么)

x86-64 intel cpu-word machine-code endianness

7
推荐指数
1
解决办法
1187
查看次数