修改CS,IP寄存器的指令

本文详细介绍了汇编语言中的 jmp 指令,包括如何修改 CS 和 IP 寄存器来改变指令执行路径。通过实例展示了 jmp 指令在不同情况下的使用,如 jmp2000:0、jmp 寄存器以及 jmp bx 的执行过程,并分析了在特定指令序列执行后 CPU 修改 IP 的次数及其最终值。

汇编指令  jmp——》jump

jmp是转移指令,可以修改CS,IP这两个寄存器  决定CPU从哪里读取指令

jmp 2000:0

jmp 寄存器

若想同时修改CS、IP的值可以用形如“jmp 段地址:偏移地址”的指令完成,功能:用指令中给出的段地址修改CS,偏移地址修改IP如:

jmp 2AE3:3,执行后:CS=2AE3H,  IP=0003H, CPU将从2AE33H处读取指令。

只想修改IP   “jmp 某一合法寄存器” 的指令完成,功能为:用寄存器的值修改IP,如:

jmp ax,执行指令前:ax=1000H   CS=2000H   IP=0003H

              执行指令后:ax=1000H    CS=2000H    IP=1000H    jmp ax含义上好似:  mov IP, ax

指令的执行过程:

1、CPU从CS:IP所指向的内存单元读取指令,将读取的指令存放到指令缓存器中

2、IP=IP+所读指令长度,从而指向下一条指令

3、执行指令缓冲器中的内容,回到步骤1

题目:

假设CS=2000H, IP=0000H  写出下列指令的执行过程

-a 2000:0                                            CS=2000H   IP=0

mov ax,6622H                                    CS=2000H   IP=0+3=3

jmp 1000:3                                          CS=2000H   IP=3+5=8

mov cx,ax

a 1000:0                                            CS=1000H      IP=3

mov ax,0123H                                  

mov ax,0                                           CS=1000H      IP=3+3=6

mov bx,ax                                         CS=1000H      IP=6+2=8

jmp bx                                               CS=1000H      IP=8+2=10

mov cx,0

检测点  2.3

下面三条指令执行后,CPU修改几次IP?4     都是在什么时候?最后IP中的值是多少?0  

mov  ax,bx         ----》存放到指令缓冲器中---》1 ——》执行          ax=bx

sub   ax,ax        ----》存放到指令缓冲器中——》1 ——》执行        ax=0                               sub=subtract减去

jmp   ax                ----》存放到指令缓冲器中——》1——》执行         1     IP=0

指令的执行过程:

1、CPU从CS:IP所指向的内存单元读取指令,将读取的指令存放到指令缓存器中

2、IP=IP+所读指令长度,从而指向下一条指令

3、执行指令缓冲器中的内容,回到步骤1

### CS 寄存器的作用及用法 CS(Code Segment)寄存器是代码段寄存器,用于指向当前执行的指令所在的内存段[^1]。它与 IP(Instruction Pointer,指令指针)配合使用,共同确定下一条要执行的指令地址。具体来说,CS:IP 形成一个逻辑地址,其中 CS 提供段地址,IP 提供偏移地址。CPU 根据这个逻辑地址从内存中取出并执行指令。 在汇编语言中,CS 寄存器通常是自动管理的,程序员很少直接修改它。然而,在某些特殊情况下(例如中断处理或程序切换时),可以通过特定指令修改 CS[^5]。 ```asm jmp far ptr [address] ; 修改 CS IP ``` 上述代码通过远跳转(far jump)指令修改 CS IP,从而切换到另一个代码段执行。 --- ### DX 寄存器的作用及用法 DX(Data register X)是一个通用寄存器,具有多种用途。它是 16 位寄存器,可以拆分为两个 8 位寄存器 DH(高 8 位) DL(低 8 位)[^3]。以下是 DX 的主要功能: 1. **数据存储**:作为通用寄存器,DX 可以用来存储临时数据。 2. **扩展 AX 寄存器**:在需要处理 32 位数据时,DX AX 组合形成一个 32 位寄存器,其中 DX 存储高 16 位,AX 存储低 16 位。这种组合通常用于乘法除法操作中的结果存储[^3]。 ```asm mov ax, 1234h mov dx, 0 ; 初始化 DX 为 0 cwd ; 将 AX 中的符号扩展到 DX ``` 3. **I/O 操作**:DX 也可以用来指定 I/O 端口地址,用于输入输出操作。 ```asm mov dx, 0x3F8 ; 设置串口地址 mov al, 'A' ; 准备发送字符 'A' out dx, al ; 将 AL 中的数据发送到 DX 指定的端口 ``` --- ### CS DX 的功能与区别 | 特性 | CS 寄存器 | DX 寄存器 | |---------------------|------------------------------------------------|------------------------------------------------| | **主要功能** | 指向代码段,控制程序执行流程 | 通用寄存器,用于数据存储、扩展 AX I/O 操作 | | **是否可直接修改** | 不可以直接修改,需通过特定指令(如远跳转) | 可以直接通过 MOV 指令修改 | | **数据类型** | 段地址 | 数据或地址 | | **常见用途** | 程序切换、中断处理 | 数据存储、数学运算、I/O 操作 | --- ### 示例代码 以下代码展示了如何使用 CS DX 寄存器: #### 使用 CS 寄存器 ```asm jmp far ptr [new_code_segment] ; 切换到新的代码段 ``` #### 使用 DX 寄存器 ```asm mov dx, 0x3F8 ; 设置串口地址 mov al, 'B' ; 准备发送字符 'B' out dx, al ; 将 AL 中的数据发送到 DX 指定的端口 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值