Excel模拟分析 (excel模拟编程)

如何用Excel制作一个16位CPU

你可能听说过用Excel做一些有趣的事情,比如画图,玩游戏,甚至写代码。但你知道吗,有人用Excel制作了一个完整的16位CPU,并且还可以运行自己设计的汇编语言!这个项目的名字叫做Excel 16-Bit CPU,它是由GitHub用户s0lly创建的,你可以在这里找到它的源代码和说明。

https://github.com/InkboxSoftware/excelCPU

Excel模拟分析,excel可以数值仿真吗

什么是CPU?

CPU,即中央处理器,是计算机的核心部件,负责执行各种指令,处理数据,控制其他硬件。CPU的基本结构包括寄存器,运算单元,控制单元,时钟信号等。寄存器是CPU内部的小容量存储器,用来暂存数据或地址。运算单元是用来执行算术或逻辑运算的部件。控制单元是用来解析指令,生成控制信号,控制CPU的工作流程的部件。时钟信号是用来同步CPU内部各个部件的工作节奏的信号。

如何用Excel制作CPU?

要用Excel制作CPU,首先要了解Excel的一个重要功能,就是迭代计算。迭代计算是指当一个单元格的值依赖于另一个单元格的值,而另一个单元格的值又依赖于前一个单元格的值时,Excel会不断重复计算这两个单元格的值,直到达到一个稳定的状态或者超过最大迭代次数。这个功能可以用来模拟CPU的时钟信号,让CPU在每次迭代时执行一条指令。

Excel 16-Bit CPU的主要文件是CPU.xlsx,它包含了CPU的所有部件,以及128KB的RAM和一个128x128的显示器。CPU.xlsx的工作原理是这样的:

  • 在B2单元格设置时钟信号,可以用一个开关或者一个滑动条来控制时钟信号的高低。
  • 在F2单元格设置复位按钮,如果为真,会将程序计数器(PC)寄存器重置为0。
  • 在J2单元格设置手动模式按钮,如果为真,会让CPU执行D8单元格中的指令,而不是从RAM中读取指令。
  • 在N2单元格设置清空RAM按钮,如果为真,会将RAM中的所有数据清零。
  • 在R2单元格设置读取ROM按钮,如果为真,会将ROM.xlsx中的数据复制到RAM中。

要运行一个程序,首先要将程序编写在ROM.xlsx中,或者用Excel-ASM16语言编写程序并用compileExcelASM16.py编译器将其转换为ROM.xlsx中的数据。然后,打开CPU.xlsx和ROM.xlsx,按照以下步骤操作:

  • 将复位按钮设为真,将PC寄存器重置为0。
  • 将清空RAM按钮或者读取ROM按钮设为真,然后再设为假,将RAM中的数据清空或者从ROM中读取数据。
  • 将复位按钮设为假,让PC寄存器开始工作。
  • 根据需要,将手动模式按钮设为真或者假,让CPU执行指定的指令或者从RAM中读取指令。
  • 按F9键,让Excel进行一次迭代计算,CPU执行一条指令。
  • 观察CPU的寄存器,运算单元,控制单元,以及RAM和显示器的变化。

Excel-ASM16语言

Excel-ASM16是一种简单的汇编语言,用来编写Excel 16-Bit CPU的程序。它有24种不同的指令,分为三类:跳转指令,数据传输指令,和算术逻辑指令。每条指令有三种操作数:寄存器,内存,和立即数。寄存器是用R开头的数字表示,如R0,R1,R15等。内存是用@开头的16位十六进制数表示,如@0000,@F000,@FFFF等。立即数是用#或者$开头的十进制或者十六进制数表示,如#0000,$0CCC,#60340,$FF10等。

跳转指令用来改变PC寄存器的值,从而改变程序的执行流程。跳转指令有四种:

  • JMP IMD ; 无条件跳转到立即数指定的地址
  • JEQ IMD ; 如果零标志(ZF)为0,跳转到立即数指定的地址
  • JLT IMD ; 如果进位标志(CF)为0,跳转到立即数指定的地址
  • JGE IMD ; 如果进位标志(CF)为1或者零标志(ZF)为1,跳转到立即数指定的地址

数据传输指令用来在寄存器,内存,和立即数之间传输数据。数据传输指令有八种:

  • MOV REG, REG ; 将第二个寄存器的值复制到第一个寄存器
  • MOV REG, MEM ; 将内存中的值复制到寄存器
  • MOV MEM, REG ; 将寄存器的值复制到内存中
  • MOV REG, IMD ; 将立即数的值复制到寄存器
  • MOV MEM, IMD ; 将立即数的值复制到内存中
  • LDR REG, REG ; 将第二个寄存器的值作为内存地址,将内存中的值复制到第一个寄存器
  • STR REG, REG ; 将第一个寄存器的值作为内存地址,将第二个寄存器的值复制到内存中
  • SWP REG, REG ; 交换两个寄存器的值

算术逻辑指令用来对寄存器,内存,和立即数进行算术或者逻辑运算,并设置相应的标志位。算术逻辑指令有十二种:

  • ADD REG, REG ; 将两个寄存器的值相加,结果存放在第一个寄存器,设置CF和ZF
  • ADD REG, MEM ; 将寄存器和内存的值相加,结果存放在寄存器,设置CF和ZF
  • ADD REG, IMD ; 将寄存器和立即数的值相加,结果存放在寄存器,设置CF和ZF
  • SUB REG, REG ; 将两个寄存器的值相减,结果存放在第一个寄存器,设置CF和ZF
  • SUB REG, MEM ; 将寄存器和内存的值相减,结果存放在寄存器,设置CF和ZF
  • SUB REG, IMD ; 将寄存器和立即数的值相减,结果存放在寄存器,设置CF和ZF
  • AND REG, REG ; 将两个寄存器的值进行按位与运算,结果存放在第一个寄存器,设置ZF
  • AND REG, MEM ; 将寄存器和内存的值进行按位与运算,结果存放在寄存器,设置ZF
  • AND REG, IMD ; 将寄存器和立即数的值进行按位与运算,结果存放在寄存器,设置ZF
  • OR REG, REG ; 将两个寄存器的值进行按位或运算,结果存放在第一个寄存器,设置ZF

Excel模拟分析,excel可以数值仿真吗