因此,正如问题所述,在英特尔8086中CS和IP寄存器的目的是什么
我找到了这个解释:
代码段(CS)是一个16位寄存器,包含带有处理器指令的64 KB段的地址.处理器使用CS段来访问指令指针(IP)寄存器引用的指令.CS寄存器不能直接更改.CS寄存器在远跳,远程调用和远程返回指令期间自动更新.
这对于IP:
指令指针(IP)是一个16位寄存器.
我真的不明白这基本上意味着什么,所以如果有人能提供更"生动"的解释,那就太棒了:)
小智 29
物理地址由2部分计算.i)分段地址.ii)抵消地址.CS(代码段寄存器)用于寻址存储器的代码段,即存储器中存储代码的位置.IP(指令指针)包含存储器代码段内的偏移量.因此CS:IP用于指向存储器中的代码的位置(即,计算物理地址).
use*_*959 16
由于指令指针(IP)是16位,这意味着你只能有64k指令(2 ^ 16),这在80年代甚至不多.因此,要扩展地址空间,您需要第二个寄存器,该寄存器可以处理64k块.您可以将cs:ip视为一个32位寄存器,然后能够寻址2 ^ 32个字节...即4G,这是您在使用32位地址的处理器上获得的.8086使用了20位地址,因此您可以访问1M内存.
Cir*_*四事件 11
接下来要执行的指令是在内存地址处等于:
16 * CS + IP
Run Code Online (Sandbox Code Playgroud)
这允许寻址20位存储器,尽管寄存器仅为16位宽(并且它还创建了两种不同的方式来编码大多数地址).
CS的效果类似于其他段寄存器的效果.例如,DS增加数据访问(不指定另一个段寄存器)16 * DS.
CS
修改CS的说明如下:
我不能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无法直接观察,因此更难以使用它.检查此问题的替代方案: 直接阅读程序计数器
| 归档时间: |
|
| 查看次数: |
54581 次 |
| 最近记录: |