liuming1978 发表于 2023-3-29 21:21:36

2.10 CS和IP的问题

CS=2000
IP=0000
然后计算机从内存20000处开始读取指令,那么,问题来了,计算机是怎么知道,读取的是20000,20001,20002这三个内存区块的内容的
换句话说,CS2000,IP0000,它指向的段地址应该是20000这个没问题,但是它是怎么知道读到20002停止的呢

isdkz 发表于 2023-3-29 21:27:49

计算机在执行指令时,会根据指令的大小和类型自动地调整指令指针(IP)的值。计算机并不是事先知道要读取到哪个地址停止,而是在逐步执行指令的过程中,不断地更新IP的值。当一条指令执行完毕后,计算机会根据这条指令的大小将IP加上相应的值,以便读取下一条指令。计算机会按照这个过程一直执行指令,直到遇到停止或跳转指令为止。

在你给出的例子中,CS(代码段寄存器)的值是2000,IP的值是0000。这意味着指令的物理地址是(CS * 16 + IP)= 20000。计算机会从这个地址开始读取指令。接下来,计算机会根据当前指令的大小和类型更新IP的值,然后继续读取下一条指令。这个过程会不断重复,直到计算机遇到停止或跳转指令为止。因此,计算机并不是事先知道要读取到20002这个地址停止,而是在执行指令的过程中自动调整IP的值来实现的。

liuming1978 发表于 2023-3-29 21:32:35

isdkz 发表于 2023-3-29 21:27
计算机在执行指令时,会根据指令的大小和类型自动地调整指令指针(IP)的值。计算机并不是事先知道要读取到 ...

首先,谢谢您 的指教,但是,我还是没有明白,书上给的例子是20000+0000=20000,然后计算机就把内存单元20000~20002的内容都读进去了,,然后开始执行下一条指令,是从20003处开始读,我就是没明白为什么计算机只读到20002处就停了

liuming1978 发表于 2023-3-29 21:35:00

按我的理解,是寻址范围从20000~20002,可是,按公式相加后,值是2FFFF,也不是20002呀

isdkz 发表于 2023-3-29 21:35:38

liuming1978 发表于 2023-3-29 21:32
首先,谢谢您 的指教,但是,我还是没有明白,书上给的例子是20000+0000=20000,然后计算机就把内存单元2 ...

在这个例子中,计算机从20000地址开始读取指令,根据您的描述,它读取了20000、20001和20002这三个内存地址的内容。这很可能是因为这条指令的长度正好是3个字节。指令的长度取决于具体的指令类型和操作数,不同的指令长度会有所不同。

计算机在执行指令时,会根据当前指令的长度来更新IP(指令指针)的值。在这个例子中,计算机执行完内存地址20000~20002的指令后,知道这条指令的长度是3个字节,所以将IP的值加3(0000 + 0003 = 0003),这样计算机就知道下一条指令应该从20003地址开始读取了。

所以,计算机在执行指令时,并不是事先知道要读到哪个地址停止,而是在执行完一条指令后,根据该指令的长度更新IP的值。在这个例子中,计算机读取了20000、20001和20002这三个内存地址的内容,因为这条指令的长度正好是3个字节。然后,计算机根据指令的长度更新IP的值,知道下一条指令应该从20003地址开始读取。

liuming1978 发表于 2023-3-29 21:36:58

isdkz 发表于 2023-3-29 21:35
在这个例子中,计算机从20000地址开始读取指令,根据您的描述,它读取了20000、20001和20002这三个内存地 ...

因为这条指令的长度正好是3个字节,,,这个才是关键点,对吗,谢谢

isdkz 发表于 2023-3-29 21:39:51

liuming1978 发表于 2023-3-29 21:36
因为这条指令的长度正好是3个字节,,,这个才是关键点,对吗,谢谢

对的。计算机在执行指令时,会根据指令的长度来决定读取多少字节。在你提供的例子中,计算机从20000地址开始读取指令,读取了20000、20001和20002这三个内存地址的内容,因为这条指令的长度正好是3个字节。

不同的指令可能有不同的长度,计算机在执行指令时,会根据当前指令的长度来更新IP(指令指针)的值。这样,计算机就能知道下一条指令应该从哪个地址开始读取。在这个例子中,计算机读取了长度为3字节的指令,然后根据指令的长度更新IP的值,知道下一条指令应该从20003地址开始读取。
页: [1]
查看完整版本: 2.10 CS和IP的问题