# 3230117105朱逸萧-20位指令模拟器 **Repository Path**: YIXiao_zy/yixiao ## Basic Information - **Project Name**: 3230117105朱逸萧-20位指令模拟器 - **Description**: No description available - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-15 - **Last Updated**: 2025-06-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 20位指令模拟器文档 🧠 项目概述 这是一个用C语言编写的简单处理器模拟程序,能够处理20位二进制指令。程序通过解析指令、执行运算并设置处理器标志位来模拟CPU的基本功能。 📋 指令格式 text [4位操作码][8位操作数A][8位操作数B] OPCODE A B 📌 支持的操作指令 操作码 运算 说明 0000 加法 A + B 0001 减法 A - B 0010 与运算 A AND B 0011 或运算 A OR B 0100 异或 A XOR B 0101 非运算 NOT A 0110 左移 将A左移1位 0111 右移 将A右移1位 🚩 处理器标志位 零标志(ZF): 当运算结果为0时置1 进位标志(CF): 加法运算: 溢出时置1 减法运算: 下溢时置1 其他运算: 通常为0或N/A 💻 代码结构解析 核心功能函数 二进制转换: int binstr_to_int(const char *s); // 二进制字符串转整数 void int_to_bin_array(int num, int bin[8]); // 整数转8位二进制数组 位运算实现(未使用内置运算符): int bit_and(int a, int b); // 与运算 int bit_or(int a, int b); // 或运算 int bit_xor(int a, int b); // 异或运算 int bit_not(int a); // 非运算 算术逻辑单元(ALU)操作: int do_and(int a, int b); // 执行与运算 int do_or(int a, int b); // 执行或运算 int do_xor(int a, int b); // 执行异或运算 int do_not(int a); // 执行非运算 int do_shl(int a); // 执行左移 int do_shr(int a); // 执行右移 主程序流程 读取20位二进制指令 解码操作码和操作数 执行指定运算 设置处理器标志位 输出运算结果 📊 输入输出示例 示例输入1: text Input 20-bit instruction: 00001010101010101111 示例输出1: text 运算结果: 170 零标志: 0 进位标志: 0 示例输入2: text Input 20-bit instruction: 00011111111100000001 示例输出2: text 运算结果: 254 零标志: 0 进位标志: 1 ⚠️ 使用限制 固定20位指令长度 8位操作数限制(0-255) 基础错误处理机制 💡 关键技术点 所有位运算均手动实现,未使用内置运算符 采用基于数组的位操作方式 处理溢出/下溢条件 通过标志位跟踪处理器状态 🎓 教学价值 本模拟器完整展示了: 计算机指令的基本格式 算术逻辑单元的工作原理 处理器标志位的设置机制 底层位运算的实现方式 关键代码: int do_and(int a, int b) { int ab[8], bb[8], rb[8], res = 0; int_to_bin_array(a, ab); int_to_bin_array(b, bb); for (int i = 0; i < 8; ++i) rb[i] = bit_and(ab[i], bb[i]); for (int i = 0; i < 8; ++i) res = res * 2 + rb[i]; return res; } int do_or(int a, int b) { int ab[8], bb[8], rb[8], res = 0; int_to_bin_array(a, ab); int_to_bin_array(b, bb); for (int i = 0; i < 8; ++i) rb[i] = bit_or(ab[i], bb[i]); for (int i = 0; i < 8; ++i) res = res * 2 + rb[i]; return res; } int do_xor(int a, int b) { int ab[8], bb[8], rb[8], res = 0; int_to_bin_array(a, ab); int_to_bin_array(b, bb); for (int i = 0; i < 8; ++i) rb[i] = bit_xor(ab[i], bb[i]); for (int i = 0; i < 8; ++i) res = res * 2 + rb[i]; return res; } int do_not(int a) { int ab[8], rb[8], res = 0; int_to_bin_array(a, ab); for (int i = 0; i < 8; ++i) rb[i] = bit_not(ab[i]); for (int i = 0; i < 8; ++i) res = res * 2 + rb[i]; return res; } int do_shl(int a) { int ab[8], res = 0; int_to_bin_array(a, ab); for (int i = 0; i < 7; ++i) ab[i] = ab[i + 1]; ab[7] = 0; for (int i = 0; i < 8; ++i) res = res * 2 + ab[i]; return res; } int do_shr(int a) { int ab[8], res = 0; int_to_bin_array(a, ab); for (int i = 7; i > 0; --i) ab[i] = ab[i - 1]; ab[0] = 0; for (int i = 0; i < 8; ++i) res = res * 2 + ab[i]; return res; }