英特尔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的指令是:
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?