首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >指令集仿真器指南

指令集仿真器指南
EN

Stack Overflow用户
提问于 2012-11-18 01:38:00
回答 1查看 3.3K关注 0票数 4

我对为gameboy和其他手持控制台编写模拟器很感兴趣,但我读到的第一步是模拟指令集。我在这里找到了一个链接,说对于初学者来说,要仿真Commodore 64 8位微处理器,问题是我对仿真指令集一无所知。我知道mips指令集,所以我想我可以理解其他指令集,但问题是模仿它们是什么意思?

注意:如果有人能为我提供一个指令集仿真的逐步指南给初学者,我将不胜感激。

注意#2:我计划用C编写。

注意#3:这是我第一次尝试学习整个仿真过程。

谢谢

编辑:我发现这个站点详细介绍了如何编写仿真器,看起来很有前途。我将开始阅读它,并希望它也能帮助其他正在考虑编写仿真器的人。

Emulator 101

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-18 03:23:21

指令集仿真器是从软件设备读取二进制数据并执行数据所包含的指令的软件程序,就好像它是访问物理数据的物理微处理器一样。

Commodore 64使用6502微处理器。我曾经为这个处理器写过一个模拟器。您需要做的第一件事是阅读处理器上的数据表,并了解其行为。它有什么类型的操作码,内存寻址,IO方法。它的寄存器是什么?它是如何开始执行的?这些都是您在编写仿真器之前需要能够回答的问题。

下面是它在C中的大致情况(不是100%准确):

代码语言:javascript
复制
uint8_t RAM[65536]; //Declare a memory buffer for emulated RAM (64k)
uint16_t A; //Declare Accumulator
uint16_t X; //Declare X register
uint16_t Y; //Declare Y register
uint16_t PC = 0; //Declare Program counter, start executing at address 0
uint16_t FLAGS = 0 //Start with all flags cleared;

//Return 1 if the carry flag is set 0 otherwise, in this example, the 3rd bit is
//the carry flag (not true for actual 6502)
#define CARRY_FLAG(flags)  ((0x4 & flags) >> 2)

#define ADC 0x69
#define LDA 0xA9

while (executing) {
    switch(RAM[PC]) {  //Grab the opcode at the program counter
        case ADC: //Add with carry
            A = X + RAM[PC+1] + CARRY_FLAG(FLAGS);
            UpdateFlags(A);
            PC += ADC_SIZE;
            break;
        case LDA: //Load accumulator
            A = RAM[PC+1]; 
            UpdateFlags(X);
            PC += MOV_SIZE;
            break;
        default:
            //Invalid opcode!

    }
}

根据this reference的说法,模数转换器在6502处理器中实际上有8个操作码,这意味着您的switch语句中将有8个不同的模数转换器,每个模数转换器对应不同的操作码和内存寻址方案。您必须处理字节顺序和字节顺序,当然还有指针。如果你还没有指针和类型转换的话,我会对C有一个扎实的理解。要操作标志寄存器,您必须对C中的逐位操作有扎实的理解。如果您很聪明,您可以使用C宏甚至函数指针来节省一些工作,就像上面的CARRY_FLAG示例一样。

每次执行一条指令时,必须使程序计数器按该指令的大小前进,每个操作码的大小各不相同。一些操作码不带任何参数,因此它们的大小只有1个字节,而另一些操作码则像我上面的MOV示例那样接受16位整数。所有这些都应该被很好地记录下来。

分支指令(JMP、JE、JNE等)很简单:如果在标志寄存器中设置了某个标志,则将PC加载到指定的地址。这就是微处理器是如何做出“决定”的,模拟它们只需更换PC,就像真正的微处理器所做的那样。

编写指令集仿真器最困难的部分是调试。你怎么知道每件事是否都正常工作呢?有很多资源可以帮助你。人们已经编写了测试代码来帮助您调试每条指令。您可以一次执行一条指令,并比较参考输出。如果有不同的地方,你知道你有一个bug,并可以修复它。

这应该足以让您入门了。重要的是,你对你想要模拟的指令集有很好的理解,B)对C语言的低级数据操作有扎实的理解,包括类型转换、指针、位操作、字节顺序等。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13433028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档