CPU执行指令的过程

CPU通过控制器执行指令

PC计数器先把指令地址发送到MAR

MDR通过MAR的地址读取指令

然后送到IR

通过ID译码 CPU识别指令

然后计数器PC+1


具体执行指令就看指令是什么样 的了

### CPU指令执行过程中的异常情况示例 在CPU执行指令过程中,可能会遇到各种异常情况。这些异常通常会导致CPU中断当前的执行流程,并跳转到相应的异常处理程序入口地址[^1]。以下是一些常见的异常现象及其例子: #### 1. **地址越界异常** 当CPU尝试访问一个无效的内存地址时,会触发地址越界异常。例如,如果程序试图访问超出其权限范围的内存区域或不存在的物理地址,操作系统会检测到这一问题并触发异常。 ```c int *ptr = NULL; *ptr = 10; // 尝试向空指针写入数据,将导致地址越界异常 ``` #### 2. **除零异常** 在执行算术运算时,如果程序尝试进行除以零的操作,CPU会检测到非法操作并触发除零异常。 ```c int result = 10 / 0; // 触发除零异常 ``` #### 3. **非法指令异常** 当CPU遇到无法识别的指令时,会触发非法指令异常。这可能是因为程序中存在错误的机器码,或者由于硬件兼容性问题导致某些指令不可用。 ```asm MOV AX, BX ; 正常指令 UD2 ; 非法指令(在x86架构中用于生成异常) ``` #### 4. **堆栈溢出异常** 当程序使用的堆栈空间超过系统分配的限制时,会触发堆栈溢出异常。这种情况通常发生在递归调用过深或局部变量占用过多堆栈空间的情况下。 ```c void recursive_function() { recursive_function(); // 无限递归可能导致堆栈溢出 } recursive_function(); ``` #### 5. **页面故障异常** 在虚拟内存系统中,如果CPU尝试访问的内存页尚未加载到物理内存中,操作系统会触发页面故障异常。随后,操作系统负责将所需的页面从磁盘加载到内存中,然后恢复程序的执行。 ```c char *data = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); data[4096] = 'A'; // 访问未映射的内存,可能触发页面故障 ``` #### 6. **特权指令异常** 当用户模式下的程序尝试执行仅限于内核模式的特权指令时,会触发特权指令异常。这是为了保护操作系统的安全性和稳定性。 ```asm CLI ; 关闭中断(特权指令),在用户模式下执行将触发异常 ``` #### 7. **外部中断异常** 虽然严格来说不属于指令执行过程中的异常,但外部设备(如键盘、鼠标、硬盘等)产生的中断信号也会被CPU视为一种异常处理。这种情况下,CPU会保存当前状态并跳转到对应的中断处理程序。 ```c // 按下键盘上的某个键可能触发外部中断 ``` ### 异常处理机制 当检测到异常时,CPU会自动保存当前的程序状态(如程序计数器PC、寄存器值等),并跳转到相应的异常处理程序入口地址。异常处理程序的入口地址通常存储在中断向量表中[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值