出于学习目的,我打算开始构建一个8051微控制器仿真器.我很乐于用C/C++/C#编程.这不是课堂项目等,而是来自我方的学习计划.
我确实发现了很多讨论这个问题的问题.但是,我想在粒度级别上进行更多细分,以便在实际开始编写代码之前,我可以知道需要关注哪些区域.
我最初的要求是:
文本编辑器(可以使用编辑框控件),用户可以在其中编写汇编代码
验证语法是否正确
有一个小窗口,显示运行时的寄存器值.
当用户启动程序时,指令应逐步更新寄存器窗口.
除了GUI元素,我更感兴趣的是如何模拟微控制器.
我理解的方式可以进一步分解:
我需要有一个查找表以获取指令或其他一些方法来存储可用指令并验证语法.有任何指示如何实现这一点,请让我知道.
如何模拟8051的每条指令?
对于寄存器,我可以根据类型使用un/signed整数并更新表.
由于微控制器具有有限的RAM存储器,如何检查代码长度或者更确切地说是在存储器中执行的代码以避免和缓冲溢出或其他问题.
如果有一些开源项目详细说明了如何构建仿真器,我们将不胜感激.
我认为你对这个项目的范围有点不清楚,至少与标题有关.
一个仿真器执行的二进制代码,而不是其他.模拟器不包括编辑器(这是一个开发工具),也不包括汇编程序(同上).汇编程序负责进行语法检查和转换,这样仿真器只能执行预先验证的合法代码.
听起来你想构建一个完整的IDE.这将围绕编辑器,汇编器和模拟器包装很多GUI.我会把这一步留作最后一步.
至于你关于模拟器本身的问题:
您可以使用最多(例如)64K字节的数组作为仿真器的工作存储器.您可以在程序中使用变量来模拟寄存器.我用一个unsigned char *来模拟程序计数器,并int用于大多数其他东西......
操作非常简单:在0(或预定的引导位置)启动程序计数器,并启动一个循环,该循环通过该指针获取指令,并应用于寄存器和存储器与该指令相关的任何操作.一个简单的实现将围绕一个switch包含所有可能的指令代码的巨大语句.
正如我所说,你的模拟器不应该担心非法指令,因为汇编程序不应该生成任何非法指令.你可以让你的程序(即主循环)停止,如果它遇到非法操作.
类似地,你的模拟器不必担心范围,索引或大小溢出......这也是汇编程序的问题,或者如果你有的话,也可能是链接器的问题.
更新: SO中的一些指示:
最近我为AVR芯片组装了一个仿真器,它也是一个小型的8位微控制器.源代码在GitHub上作为ghewgill/emulino.最有趣的文件是cpu.c,它包含每个CPU指令的实现.关键线是cpu_run()(省略一些细节):
while (state == CPU_RUN) {
u16 instr = Program[PC++];
Instr[instr](instr);
}
Run Code Online (Sandbox Code Playgroud)
这将从PC寄存器指向的程序存储器中加载一个16位字,然后将其用作指令跳转表的索引(这是一个64k的函数指针数组 - 实际表是在编译时由脚本生成的).该函数将是do_XXX()该源文件中的函数之一,并且可以在执行实际指令之前进行进一步的指令解码.例如,do_ADD()功能:
static void do_ADD(u16 instr)
{
trace(__FUNCTION__);
// ------rdddddrrrr
u16 r = (instr & 0xf) | ((instr >> 5) & 0x10);
u16 d = ((instr >> 4) & 0x1f);
u8 x = Data.Reg[d] + Data.Reg[r];
Data.SREG.H = (((Data.Reg[d] & Data.Reg[r]) | (Data.Reg[r] & ~x) | (~x & Data.Reg[d])) & 0x08) != 0;
Data.SREG.V = (((Data.Reg[d] & Data.Reg[r] & ~x) | (~Data.Reg[d] & ~Data.Reg[r] & x)) & 0x80) != 0;
Data.SREG.N = (x & 0x80) != 0;
Data.SREG.S = Data.SREG.N ^ Data.SREG.V;
Data.SREG.Z = x == 0;
Data.SREG.C = (((Data.Reg[d] & Data.Reg[r]) | (Data.Reg[r] & ~x) | (~x & Data.Reg[d])) & 0x80) != 0;
Data.Reg[d] = x;
Cycle++;
}
Run Code Online (Sandbox Code Playgroud)
这会执行实际的加法运算(Data.Reg[d] + Data.Reg[r]),然后根据结果设置所有各种条件标志.
| 归档时间: |
|
| 查看次数: |
3077 次 |
| 最近记录: |