英特尔8086汇编中CS和IP寄存器的用途是什么?

时间:2013-07-21 21:32:41

标签: x86 intel x86-16

因此,正如问题所述,在英特尔8086中CS和IP寄存器的目的是什么

我找到了这个解释:

  

代码段(CS)是一个16位寄存器,包含带处理器的64 KB段的地址   说明。处理器使用CS段来访问所引用的指令   指令指针(IP)寄存器。 CS寄存器不能直接更改。 CS注册   在远程跳转,远程呼叫和远程返回指令期间自动更新。

和IP:

  

指令指针(IP)是一个16位寄存器。

我真的不明白这基本上意味着什么,所以如果有人可以提供更“生动”的解释,那就太棒了:))

6 个答案:

答案 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的效果类似于其他段寄存器的效果。例如,DS16 * DS递增数据访问(未指定其他段寄存器)。

<强> CS

修改CS的说明是:

  • ljmp(跳远)
  • lcall(远程调用),将ip cs推送到堆栈,然后远程跳转
  • lref(远程返回),它反转远程调用
  • int,从中断向量表中读取IP / CS
  • iret,反转int

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)

由于8086处理器使用20位寻址,我们可以访问1MB的内存,但8086的寄存器只有16位,所以为了从存储器访问数据,我们将组合代码段寄存器和指令指针寄存器中的值为了生成物理地址,通过移动CS 4位的值来完成 向左,然后添加值IP

示例:

CS的值是1234Hex(十六进制)

IP的值是5678Hex

现在移动4位后的CS值是12340Hex然后加上IP值后它是179B8Hex这是物理地址

答案 5 :(得分:0)

IP寄存器 - IP是指令指针。其功能与其他微处理器中的PC(程序计数器)相同,即指向BIU单元提取的下一条指令进入EU单元。