寒假学习笔记1.14
一、 基本概念与模型设计
- 核心概念映射
寄存器模拟:用Python字典模拟CPU内部寄存器,如AX、BX等,作为临时数据存储单元。
内存模拟:用Python列表模拟RAM,每个索引代表一个内存地址,可存储数据。
指令集:定义可执行的操作命令,每个命令对应一个Python函数。
- 虚拟机初始化
硬件资源抽象
REGISTERS = {'AX': 0, 'BX': 0, 'CX': 0, 'DX': 0} # 通用寄存器
MEMORY = [0] * 16 # 16个内存单元,地址0-15
PC = 0 # 程序计数器,指向当前执行指令
二、 基础指令实现
- 数据移动指令(MOV)
功能:在寄存器、内存、立即数之间传输数据
寻址模式:
立即数寻址:MOV AX, 5
寄存器寻址:MOV AX, BX
内存直接寻址:MOV AX, [2]
寄存器间接寻址:MOV [0], AX
- 算术运算指令(ADD)
功能:将源操作数加到目标寄存器
操作限制:目标必须是寄存器,源可以是寄存器或立即数
示例:ADD AX, BX 实现 AX = AX + BX
- 程序结构
指令序列示例:计算(5+3)*2
指令集 = [
'MOV AX, 5', # 加载立即数5到AX
'MOV BX, 3', # 加载立即数3到BX
'ADD AX, BX', # AX = 8
'MOV CX, 2', # 加载乘数
'MUL AX, CX', # AX = 16(假设已实现乘法)
'MOV [0], AX' # 结果存储到内存0地址
]
三、 控制流指令引入
- 标签与跳转
标签定义:为代码位置命名,如START:
无条件跳转:JMP LABEL 直接跳转到标签处
实现机制:通过维护标签到指令索引的映射
- 条件跳转指令
比较指令:CMP A, B 比较两个操作数,设置标志位
条件跳转:
JE LABEL # 相等时跳转
JNE LABEL # 不相等时跳转
JG LABEL # 大于时跳转
- 循环结构实现
用汇编思维实现循环:计算1+2+...+5
指令集 = [
'MOV AX, 0', # 累加器清零
'MOV CX, 1', # 计数器从1开始
'LOOP_START:',
'CMP CX, 6', # 比较CX和6
'JE END', # 如果CX=6则跳转到END
'ADD AX, CX', # 累加
'ADD CX, 1', # 计数器加1
'JMP LOOP_START',# 继续循环
'END:',
'MOV [0], AX' # 存储结果
]
浙公网安备 33010602011771号