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

idj*_*adj 22 x86 intel x86-16

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

我找到了这个解释:

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

这对于IP:

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

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

小智 29

物理地址由2部分计算.i)分段地址.ii)抵消地址.CS(代码段寄存器)用于寻址存储器的代码段,即存储器中存储代码的位置.IP(指令指针)包含存储器代码段内的偏移量.因此CS:IP用于指向存储器中的代码的位置(即,计算物理地址).

  • 这是最关键的答案!感谢您的努力! (2认同)

use*_*959 16

由于指令指针(IP)是16位,这意味着你只能有64k指令(2 ^ 16),这在80年代甚至不多.因此,要扩展地址空间,您需要第二个寄存器,该寄存器可以处理64k块.您可以将cs:ip视为一个32位寄存器,然后能够寻址2 ^ 32个字节...即4G,这是您在使用32位地址的处理器上获得的.8086使用了20位地址,因此您可以访问1M内存.

  • _cs:ip一起作为一个32位寄存器,然后可以寻址2 ^ 32 bytes_。错了 即使在实模式下的32位处理器上,CS:IP仍然只能使用20位进行寻址。(通常来讲,在286或386+上,CS:IP可以将0寻址到0x10FFEF,因为0xFFFF:0xFFFF =( 0xFFFF << 4)+ 0xFFFF = 10FFEF。为了在386上寻址4gb的内存,将IP寄存器扩展为32位的EIP寄存器,该地址可以寻址4gb。 (2认同)

Cir*_*四事件 11

接下来要执行的指令是在内存地址处等于:

16 * CS + IP
Run Code Online (Sandbox Code Playgroud)

这允许寻址20位存储器,尽管寄存器仅为16位宽(并且它还创建了两种不同的方式来编码大多数地址).

CS的效果类似于其他段寄存器的效果.例如,DS增加数据访问(不指定另一个段寄存器)16 * DS.

CS

修改CS的说明如下:

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

我不能mov像其他段寄存器一样修改CS .尝试使用CS的标准标识符对其进行编码,GNU GAS 2.24无需抱怨就可以编写:

mov %ax, %cs
Run Code Online (Sandbox Code Playgroud)

执行时会导致无效的代码异常.

要观察CS的影响,请尝试将以下内容添加到引导扇区并在QEMU中运行,如此处所述/sf/answers/2273848181/

/* $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 */
Run Code Online (Sandbox Code Playgroud)

IP

无论何时通过该指令的编码长度执行指令,IP都会自动增加:这就是程序向前移动的原因!

通过修改CS的相同指令以及这些指令的非远端版本(更常见的情况)修改IP.

IP无法直接观察,因此更难以使用它.检查此问题的替代方案: 直接阅读程序计数器