首页 > 试题广场 >

x86 CPU在实模式下解释代码时看到一个地址为2330H:

[单选题]
x86 CPU在实模式下解释代码时看到一个地址为2330H:5041H,请问它最终在内存中要找的地址是多少?
  • 28341H
  • 5374H
  • 52740H
  • 7371H
【01 先说结论】
2330H:5041H
2330 << 4 + 5041 = 23300 + 5041 = 28341

【02 相关知识点】
1) 其实左移n 位,就相当于乘以2 的n 次方。
  2的4次方就是 16, 2330H指的是 0x2330 << 4 = 增加一位,类似 十进制的乘以 10, 所以为 0x23300

2)实模式工作原理

实模式出现于早期8088CPU时期。当时由于CPU的性能有限,一共只有20位地址线(所以地址空间只有1MB),以及8个16位的通用寄存器,以及4个16位的段寄存器。所以为了能够通过这些16位的寄存器去构成20位的主存地址,必须采取一种特殊的方式。当某个指令想要访问某个内存地址时,它通常需要用下面的这种格式来表示:

(段基址:段偏移量)

其中第一个字段是段基址,它的值是由段寄存器提供的(一般来说,段寄存器有6种,分别为cs,ds,ss,es,fs,gs,这几种段寄存器都有自己的特殊意义,这里不做介绍)。

第二字段是段内偏移量,代表你要访问的这个内存地址距离这个段基址的偏移。它的值就是由通用寄存器来提供的,所以也是16位。那么两个16位的值如何组合成一个20位的地址呢?CPU采用的方式是把段寄存器所提供的段基址先向左移4位。这样就变成了一个20位的值,然后再与段偏移量相加。

即:

物理地址 = 段基址<<4 + 段内偏移

所以假设段寄存器中的值是0xff00,段偏移量为0x0110。则这个地址对应的真实物理地址是 0xff00<<4 + 0x0110 = 0xff110。


发表于 2022-01-09 14:31:43 回复(0)

实模式下内存空间的访问
8086处理器(CPU)内的寄存器都是16位的,地址线上的地址由CPU提供。CPU用两个16位的值合成一个20位的值:将一个16位的值乘以16(相当于这个16位的值保存在20位寄存器的低16位中,然后将低16位往高位移动了4位)再加上另一个16位的值。将这个由2个16位合成的值提供给20根地址线作为访问内存的地址值。被乘以16的那个值被称为段基址,没有被乘以16的那个值被称为偏移地址。

CPU在实模式下,段寄存器中的值就是段基址,如果想要通过汇编程序访问某个内存单元,那么就需要指定一个段寄存器和一个偏移地址或以“段基址值:偏移地址值”的格式。CPU会将段寄存器的值乘以16再与偏移地址相加后,才将这个结果提供给地址线;用段基址和偏移地址的形式给出的表达式,CPU也会给段基址乘以16与偏移地址相加后,才将这个结果提供给地址线。

Figure 2. 实模式下访问内存(得出内存地址)的方式

这就是说,在汇编程序中,得用段基址:偏移地址的方式访问内存,因为CPU形成内存地址的方式是“段基址* 16 + 偏移地址”。

按照“段:偏移地址”的方式访问内存是CPU对内存的一种管理方式

发表于 2017-08-22 10:23:57 回复(0)
应该是A吧,我记得实模式下的算法是cs偏移4位(16进制偏移1位)+ip,也就是2330 0 +5041
发表于 2017-02-26 00:54:45 回复(0)