因此,正如问题所述,在英特尔8086中CS和IP寄存器的目的是什么
我找到了这个解释:
代码段(CS)是一个16位寄存器,包含带处理器的64 KB段的地址 说明。处理器使用CS段来访问所引用的指令 指令指针(IP)寄存器。 CS寄存器不能直接更改。 CS注册 在远程跳转,远程呼叫和远程返回指令期间自动更新。
和IP:
指令指针(IP)是一个16位寄存器。
我真的不明白这基本上意味着什么,所以如果有人可以提供更“生动”的解释,那就太棒了:))
答案 0 :(得分:24)
物理地址由2部分计算。 i)分段地址。 ii)抵消地址。 CS(代码段寄存器)用于寻址存储器的代码段,即存储代码的存储器中的位置。 IP(指令指针)包含存储器代码段内的偏移量。因此CS:IP用于指向存储器中代码的位置(即计算物理地址)。
答案 1 :(得分:16)
由于指令指针(IP)为16位,这意味着您只能拥有64k指令(2 ^ 16),这在80年代甚至不多。因此,要扩展地址空间,您需要第二个寄存器,该寄存器可以处理64k块。您可以将cs:ip视为一个32位寄存器,然后能够寻址2 ^ 32个字节...即4G,这是您在使用32位地址的处理器上获得的。 8086使用了20位地址,因此您可以访问1M内存。
答案 2 :(得分:11)
接下来要执行的指令是内存地址等于:
16 * CS + IP
这允许寻址20位存储器,尽管寄存器只有16位宽(并且它还创建了两种不同的方式来编码大多数地址)。
CS的效果类似于其他段寄存器的效果。例如,DS
按16 * DS
递增数据访问(未指定其他段寄存器)。
<强> CS 强>
修改CS的说明是:
CS不能像其他段寄存器那样由mov
修改。尝试使用CS的标准标识符对其进行编码,如果你写的话,GNU GAS 2.24会毫无怨言地进行编码:
mov %ax, %cs
在执行时导致无效的代码异常。
要观察CS的效果,请尝试将以下内容添加到引导扇区并在QEMU中运行,如此处所述https://stackoverflow.com/a/32483545/895245
/* $1 is the new CS, $1f the new IP. */
ljmp $1, $after1
after1:
/* Skip 16 bytes to make up for the CS == 1. */
.skip 0x10
mov %cs, %ax
/* cs == 1 */
ljmp $2, $after2
after2:
.skip 0x20
mov %cs, %ax
/* cs == 2 */
<强> IP 强>
只要指令按照指令的编码长度执行,IP就会自动增加:这就是程序向前移动的原因!
IP通过修改CS的相同指令以及这些指令的非远程版本进行修改(更常见的情况)。
无法直接观察到IP,因此更难以使用它。检查此问题的替代方案: Reading Program Counter directly
答案 3 :(得分:1)
在汇编程序文本中编写.code后,该.code指向cs值。文件中较晚或较早的任何命令将按照cs:ip进行寻址,其中ip是来自cs的偏移值。
当然,您必须记住,汇编编译器会首先将文本转换为机器代码指令。
答案 4 :(得分:1)
示例:强>
CS的值是1234Hex(十六进制)
IP的值是5678Hex
现在移动4位后的CS值是12340Hex然后加上IP值后它是179B8Hex这是物理地址
答案 5 :(得分:0)
IP寄存器 - IP是指令指针。其功能与其他微处理器中的PC(程序计数器)相同,即指向BIU单元提取的下一条指令进入EU单元。