文件下载与邀请翻译者
学习英特尔开发手册,最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。
讲解下载英特尔开发手册的文章
翻译英特尔开发手册,会是一件耗时费力的工作。如果有愿意和我一起来做这件事的,那么,欢迎你的加入。
另外,我不仅仅是打算翻译这一种手册,以后,可能还需要去翻译许多的英文技术文档,以支持系统底层的教学,培养系统底层程序员。
我有钱了以后,应该是会出私钱来请人翻译一批英文技术文档。当前,暂时没钱,若是有志愿加入的,欢迎啊。
本节翻译
【原文】1.5. NOTATIONAL CONVENTIONS
This manual uses special notation for data-structure formats, for symbolic representation of instructions, and for hexadecimal numbers. A review of this notation makes the manual easier to read.
【翻译】
1.5. 符号约定
本手册对数据结构格式、指令的符号表示和十六进制数使用特殊的表示法。回顾一下这个符号会使手册更容易阅读。
【讲解】上面的翻译中,对于notation这个单词,有的时候,我将其翻译为符号,有的时候,将其翻译为表示法。这一处,我自己也不知道怎么来处理更好。所以呢,就暂时地这么搁置着了。
【原文】1.5.1. Bit and Byte Order
In illustrations of data structures in memory, smaller addresses appear toward the bottom of the figure; addresses increase toward the top. Bit positions are numbered from right to left. The numerical value of a set bit is equal to two raised to the power of the bit position. IA-32 processors are “little endian” machines; this means the bytes of a word are numbered starting from the least significant byte. Figure 1-1 illustrates these conventions.
【翻译】
1.5.1. 位和字节顺序
在内存数据结构的图示中,较小的地址出现在图的底部;地址向顶部增加。位从右到左编号。一组位的数值等于2的位位置的幂次。IA-32处理器是“小端”机器;这意味着一个字的字节从最低有效字节开始编号。这些约定如图1-1所示。
【讲解】这一段呢,我略微作一下讲解。
这里谈到了不同尺寸的整数在内存中的放置的问题。假定有一个整数,0x1234,我们将其放置在内存单元0x1000起始的位置。为了放置0x1234这个word型的数,我们可以有两种方案。
第一种,将低字节放置在内存的低地址的位置。也就是,将0x34放在内存字节单元0x1000中,将0x12放置在内存字节单元0x1001中。像这种地,低位字节放置在内存的低地址的位置,高位字节放置在内存的高地址位置,这个就是小端字节序,也叫做小端顺序,小尾数。
英特尔手册上,说的是将一个2字节的整数放置在内存中。我们为了更好地理解这个小端字节序,我们也可以举出来一个4字节的整数的例子,也就是双字整数。
假定,我们要将0x12345678放置在内存地址0x3000的位置,那么,按照小端字节序,它放置的方式如下所示。
0x78 ----> 0x3000
0x56 ----> 0x3001
0x34 ----> 0x3002
0x12 ----> 0x3003
到了这里,我相信,小端字节序的问题,你应该就能明白了。
除了小端字节序以外,还有另外一种在内存中放置整数的顺序,叫做大端字节序,也叫做大端顺序,大尾数。在这种方式里面,将某一个尺寸的整数放置在内存里面,高位字节放置在内存的低地址位置,低位字节放置在内存的高地址位置。
如果是将0x1234放置在0x1000中,且采用大端顺序,则放置方式如下。
0x12 ----> 0x1000
0x34 ----> 0x1001
如果是用大端顺序,将0x12345678放置在内存0x3000中,则存储情况如下。
0x12 ----> 0x3000
0x34 ----> 0x3001
0x56 ----> 0x3002
0x78 ----> 0x3003
【原文】1.5.2. Reserved Bits and Software Compatibility
In many register and memory layout descriptions, certain bits are marked as reserved. When bits are marked as reserved, it is essential for compatibility with future processors that Software treat these bits as having a future, though unknown, effect. The behavior of reserved bits should be regarded as not only undefined, but unpredictable. Software should follow these Guidelines in dealing with reserved bits:
• Do not depend on the states of any reserved bits when testing the values of registers which contain such bits. Mask out the reserved bits before testing.
• Do not depend on the states of any reserved bits when storing to memory or to a register.
• Do not depend on the ability to retain information written into any reserved bits.
• When loading a register, always load the reserved bits with the values indicated in the documentation, if any, or reload them with values previously read from the same register.
【翻译】1.5.2. 保留位和软件兼容性
在许多寄存器和内存布局描述中,某些位被标记为保留。当位被标记为保留时,为了与未来的处理器兼容,软件必须将这些位视为具有未来(尽管未知)的效果。保留位的行为不仅是未定义的,而且是不可预测的。软件在处理保留位时应遵循以下准则:
•当测试包含这些位的寄存器的值时,不要依赖于任何保留位的状态。在测试前屏蔽掉保留的位。
•当存储到内存或寄存器时,不依赖于任何保留位的状态。
•不要依赖于保留写入任何保留位的信息的能力。
•当加载寄存器时,总是用文档中指示的值加载保留位,如果有的话,或者用先前从同一寄存器读取的值重新加载它们。
【讲评】【Do not depend on the ability to retain information written into any reserved bits.】这一句话,它的翻译,我还有点不理解。不知道你是怎么来理解的。我觉得,它的意思大概是说,某些个保留位呢,假定原来的保留值是0,然后呢,你将1写入这个保留位,执行的结果是,这个保留位的值依然会是0,而不是你刚刚写入的1。大概,某些个保留位,在早期的型号的处理器里面,用什么值去写入,它都会是保留值。而新出的型号里面,可能就是说,你用什么值来写入,它里面就会是什么值。英特尔建议,你呢,不要依赖于某一型号与某一时期里面,保留位的值始终保持不变的能力。因为,早期里面这些个保留位可能具备保持保留值的能力,而将来的型号里面,可能就没有这种保持保留值的能力了。
不知道,你的理解是怎么样的。
【原文】NOTE
Avoid any software dependence upon the state of reserved bits in IA-32 registers. Depending upon the values of reserved register bits will make software dependent upon the unspecified manner in which the processor handles these bits. Programs that depend upon reserved values risk incompatibility with future processors.
【翻译】请注意
避免任何软件依赖于IA-32寄存器中保留位的状态。根据保留的寄存器位的值将使软件依赖于处理器处理这些位的未指定方式。依赖于保留值的程序有与未来处理器不兼容的风险。