mar*_*aft -1 x86 assembly real-mode firmware
英特尔开发文档第3卷第9节的摘录
在硬件复位后获取并执行的第一条指令位于物理地址FFFFFFF0H.
该地址比处理器的最高物理地址低16个字节.
包含软件初始化代码的EPROM必须位于此地址.
在实地址模式下,地址FFFFFFF0H超出处理器的1 MB可寻址范围.处理器初始化为该起始地址如下.
CS寄存器有两部分:可见段选择器部分和隐藏的基址部分.
在实地址模式中,基址通常是通过将16位段选择器值向左移位4位以产生20位基址来形成的.但是,在硬件复位期间,CS寄存器中的段选择器加载F000H,基址加载FFFF0000H.因此,通过将基址添加到EIP寄存器中的值(即,FFFF0000 + FFF0H = FFFFFFF0H)来形成起始地址.
我的问题是为什么它在这里使用单词字节时,似乎只对位有意义.假设CPU的物理极限是0xFFFFFFFF然后0xFFFFFFF0是16 bits从该限制,而不是字节远.现在如果英特尔闪存必须包含映射到顶部的每个地址的单字节值,那么我想我们可以调用16位,字节?
从英特尔®64和IA-32架构软件开发人员手册第1卷:基本架构,第30页第1.3.4节:
处理器使用字节寻址.这意味着存储器被组织并作为字节序列访问.无论是访问一个还是多个字节,都使用字节地址来定位字节或字节存储器.
基本上,字节是内存中最小的可寻址单元.要确定单个位的值,需要获取包含其值的整个字节.
0xFFFFFFFF和之间的差异0xFFFFFFF0是0x0F十进制或15.当我们0xFFFFFFF0在计算中包含字节时,它是16.存储器是字节可寻址的,因此它"低于处理器最高物理地址的16个字节".
坦率地说,我不知道你是如何得到这16 位的.16位可以用四个十六进制数字表示(一个十六进制数字对应一个半字节,即4位)并且在引用中没有任何地方可以看到任何与此相关的任何关系.