鱼C论坛

 找回密码
 立即注册
查看: 595|回复: 6

[已解决]2.10 CS和IP的问题

[复制链接]
发表于 2023-3-29 21:21:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
CS=2000
IP=0000
然后计算机从内存20000处开始读取指令,那么,问题来了,计算机是怎么知道,读取的是20000,20001,20002这三个内存区块的内容的
换句话说,CS2000,IP0000,它指向的段地址应该是20000这个没问题,但是它是怎么知道读到20002停止的呢
最佳答案
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地址开始读取。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

首先,谢谢您 的指教,但是,我还是没有明白,书上给的例子是20000+0000=20000,然后计算机就把内存单元20000~20002的内容都读进去了,,然后开始执行下一条指令,是从20003处开始读,我就是没明白为什么计算机只读到20002处就停了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-3-29 21:35:00 | 显示全部楼层
按我的理解,是寻址范围从20000~20002,可是,按公式相加后,值是2FFFF,也不是20002呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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地址开始读取。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

因为这条指令的长度正好是3个字节,,,这个才是关键点,对吗,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-29 21:39:51 | 显示全部楼层
liuming1978 发表于 2023-3-29 21:36
因为这条指令的长度正好是3个字节,,,这个才是关键点,对吗,谢谢

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

不同的指令可能有不同的长度,计算机在执行指令时,会根据当前指令的长度来更新IP(指令指针)的值。这样,计算机就能知道下一条指令应该从哪个地址开始读取。在这个例子中,计算机读取了长度为3字节的指令,然后根据指令的长度更新IP的值,知道下一条指令应该从20003地址开始读取。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-16 19:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表