JMP CALL 二进制指令计算公式

本文详细解析了不同类型的跳转(JMP)与调用(CALL)指令,包括立即数跳转、内存地址跳转及远跳转等,并介绍了它们对应的机器码和偏移量计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

;示例一 CALL立即数 CALL后面跟一个32位立即数
;===================================
1 [bits 32]
2 test:
3 00000000 90 nop
4 00000001 90 nop
5 00000002 90 nop
6 00000003 E8F8FFFFFF call test
7 00000008 90 nop
8 00000009 90 nop
9 0000000A 90 nop
;===================================
CALL后面跟一个立即数,也就是32位偏移量时,机器码为 0XE8 后面的32位立即数是偏移量.
偏移量的计算: 目标偏移地址 减 CALL 指令后的下一条指令的地址 在当前的例子中,test是目标偏移地址,地址是0 CALL指令后的地址为 08 , 0-08=FFFFFFF8 注意,在内存中,低字在前,高字在后,所以是 0XE8 F8 FF FF FF

偏移量计算的公式二: 目标偏移-CALL指令的起始偏移-CALL指令的大小

;示例二 CALL [内存地址]
;=====================================
1 [bits 32]
2
3 00000000 90 nop
4 00000001 90 nop
5 00000002 90 nop
6 00000003 FF15[0B000000] call [test]
7 00000009 90 nop
8 0000000A 90 nop
9 test:
10 0000000B 90 nop
;======================================
机器码是0XFF15 后面跟的是内存地址. test的内存地址是 0B ,所以后面跟的是0B 同样是低字在前,高字在后

示例三 call far [内存地址]
;=======================================
1 [bits 32]
2
3 00000000 90 nop
4 00000001 90 nop
5 00000002 90 nop
6 00000003 FF1D[0B000000] call far [test]
7 00000009 90 nop
8 0000000A 90 nop
9 test:
10 0000000B 90 nop
;=======================================
CALL FAR 内存地址,机器码是 0XFF1D 后面内存地址的表示是相同的,但执行不同. 会同时改变CS 与 IP.

;示例四 JMP 立数数
;=======================================
1 [bits 32]
2
3 00000000 90 nop
4 00000001 90 nop
5 00000002 90 nop
6 00000003 E902000000 jmp test
7 00000008 90 nop
8 00000009 90 nop
9 test:
10 0000000A 90 nop
;=======================================
JMP 立即数,机器码是 E9 ,后面跟一个偏移量. 偏移量计算与上面CALL相同. test 地址是 0A,JMP指令后下一条指令地址是 08 ,0A-08=2

;JMP 内存地址
;=======================================
1 [bits 32]
2
3 00000000 90 nop
4 00000001 90 nop
5 00000002 90 nop
6 00000003 FF25[0B000000] jmp [test]
7 00000009 90 nop
8 0000000A 90 nop
9 test:
10 0000000B 90 nop
;=======================================
JMP 内存地址,机器码是 0XFF25 后面跟的是内存地址. 注意,是从后面的内存地址取出目标数值来改变EIP.

;JMP FAR 内存地址
;========================================
1 [bits 32]
2
3 00000000 90 nop
4 00000001 90 nop
5 00000002 90 nop
6 00000003 FF2D[0B000000] jmp far [test]
7 00000009 90 nop
8 0000000A 90 nop
9 test:
10 0000000B 90 nop
;========================================
JMP FAR 机器地址是 0XFF2D 后面同样是内存地址.

;============================================================
直接远跳转与直接远调用
;============================================================
1 [bits 32]
2 00000000 EA007C00000800 jmp 0x8:0x7c00
3 00000007 9A007C00000800 call 0x8:0x7c00
JMP直接远跳,机器码是0XEA 32位的偏移在前,16位的段选择子在后.
CALL直接远跳,机器码是0X9A 32位的偏移在前,16位的段选择子在后.

<think>我们正在讨论计算机组成原理中的指令系统。用户要求提供名词解释和定义。根据用户要求,我们需要:1.使用行内数学表达式时用$...$,独立公式用$$...$$2.使用中文回答3.生成相关问题4.在引用的段落末尾添加引用标识(但注意,由于我们没有具体的引用来源,这里将省略引用标识,但保留格式要求)5.结构清晰,逐步解决问题注意:用户之前的问题是关于十进制转换,但现在是关于指令系统的名词解释。因此,我们需要切换主题。指令系统的核心概念包括:-指令的定义-指令格式(操作码、地址码等)-寻址方式-指令类型(数据传送、算术运算、逻辑运算、控制转移等)-CISC和RISC我们将按照以下结构组织回答:1.指令系统的基本定义2.指令的组成要素(操作码、地址码)3.常见的寻址方式4.指令类型分类5.CISC与RISC6.系统级指令(用户不可见指令)和用户可见指令注意:用户提到“系统级指令(用户不可见)”,我们也要解释这一点。由于是名词解释,我们将以清晰、条理的方式列出关键名词并解释。</think>### 计算机组成原理:指令系统名词解释 #### 1. **指令系统定义** 指令系统(Instruction Set Architecture, ISA)是计算机硬件与软件之间的接口规范,定义了处理器能执行的所有指令集合、操作类型、数据格式及寻址方式。它是计算机体系结构的核心组成部分,直接影响硬件设计和软件编程[^1]。 **核心公式**: $$ \text{程序} = \sum_{i=1}^{n} \text{指令}_i $$ #### 2. **关键组成要素** 1. **操作码(Opcode)** 指令中表示操作类型的二进制字段,如 `ADD`、`MOV` 等。 **位宽公式**: $$ \text{指令总数} \leq 2^{\text{Opcode位数}} $$ 2. **地址码(Address Field)** 指定操作数来源的字段,包含: - **源操作数地址**:$ \text{SRC}_1, \text{SRC}_2 $ - **目标操作数地址**:$ \text{DEST} $ *示例*:`ADD R1, R2, R3`(R2+R3→R1)[^2] 3. **指令格式类型** | 类型 | 结构 | 特点 | |------------|---------------------|--------------------------| | 零地址指令 | `OP` | 隐含操作数(如堆栈操作) | | 一地址指令 | `OP + A1` | 单操作数(如INC) | | 二地址指令 | `OP + A1 + A2` | 最常见格式(如MOV) | | 三地址指令 | `OP + A1 + A2 + A3` | RISC常用(如ADD) | #### 3. **寻址方式** 1. **立即寻址** 操作数直接包含在指令中: $$ \text{操作数} = \text{指令地址字段值} $$ *例*:`MOV R1, #5`(R1←5) 2. **直接寻址** 地址字段给出操作数真实内存地址: $$ \text{EA} = A $$ *例*:`LOAD R1, 0x1000` 3. **间接寻址** 地址字段指向操作数的地址指针: $$ \text{EA} = (A) $$ *例*:`LOAD R1, @0x2000`(0x2000处存有实际地址) 4. **寄存器寻址** 操作数在寄存器中: $$ \text{操作数} = R_i $$ *例*:`ADD R3, R1, R2` 5. **基址寻址** 地址=基址寄存器+偏移量: $$ \text{EA} = (BR) + D $$ *应用*:数组访问[^3] #### 4. **指令分类** 1. **数据传送类** `MOV`, `LOAD`, `STORE` *功能*:$ \text{DEST} \leftarrow \text{SRC} $ 2. **算术运算类** `ADD`, `SUB`, `MUL` *功能*:$ R_d \leftarrow R_s \oplus R_t $ 3. **逻辑运算类** `AND`, `OR`, `NOT` *功能*:$ R_d \leftarrow R_s \land R_t $ 4. **控制转移类** `JMP`, `CALL`, `RET` *功能*:$ \text{PC} \leftarrow \text{目标地址} $ 5. **系统指令(特权指令)** 操作系统专用指令(用户不可见): - `HALT`(停机) - `I/O` 端口操作 - 缓存管理指令[^2] #### 5. **CISC vs RISC** | 特性 | CISC(复杂指令集) | RISC(精简指令集) | |--------------|--------------------------|--------------------------| | 指令数量 | >200条 | <100条 | | 指令长度 | 变长(1-15字节) | 定长(4字节) | | 执行周期 | 多周期(2-10周期) | 单周期(1周期) | | 寻址方式 | ≥5种 | ≤3种 | | 代表架构 | x86 | ARM, RISC-V | #### 6. **指令执行过程** $$ \text{取指} \rightarrow \text{译码} \rightarrow \text{取数} \rightarrow \text{执行} \rightarrow \text{写回} $$ - **CPI**(Cycles Per Instruction):$ \text{CPI} = \frac{\text{总时钟周期数}}{\text{指令数}} $ - **MIPS**(Million Instructions Per Second):$ \text{MIPS} = \frac{f_{\text{clock}}}{ \text{CPI} \times 10^6 } $[^3] --- ### 相关问题 1. **RISC-V指令集的三操作数格式如何提高代码密度?** 2. **x86的变长指令解码过程有何硬件优化技术?** 3. **间接寻址在实现指针操作时会产生哪些性能开销?** 4. **特权指令(如`MSR`)如何保障操作系统的安全性?** 5. **如何通过CPI和MIPS指标评估处理器的指令效率?**[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值