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

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

我发现这个解释:

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

这对于IP:

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

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


由于指令指针(IP)是16位,这意味着你只能有64k指令(2 ^ 16),这在80年代还不算多。 所以要扩大地址空间,你需要第二个寄存器来处理64k块。 你可以考虑cs:ip作为一个32位寄存器,然后能够寻址2 ^ 32字节......即4G,这是你在使用32位地址的处理器上得到的。 8086使用20位地址,所以你可以访问1M的内存。


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


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

16 * CS + IP

这允许寻址20位内存,尽管寄存器只有16位宽(并且它还创建了两种不同的方式来编码大部分地址)。

CS的作用类似于其他段寄存器的作用。 例如, DS数据访问(不指定另一个段寄存器)增加16 * 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的相同指令以及这些指令的非远程版本(更常见的情况)修改。

    知识产权不能直接观察,所以很难发挥它的作用。 检查这个问题的替代方案:直接读取程序计数器

    链接地址: http://www.djcxy.com/p/82355.html

    上一篇: What is the purpose of CS and IP registers in Intel 8086 assembly?

    下一篇: How can I detect the number of cores in x86 assembly?