| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2161 人关注过本帖, 1 人收藏
标题:不等了。关于CPU模拟的解决方案发布 及 散分!
只看楼主 加入收藏
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 29楼 你们都要疼我哦
终于知道你想表达的意思了。

谈一下我的观点吧。我的模拟是相当底层的模拟。single_step这个函数完成的是该CPU一个机器周期的工作。

code = vm->code[vm->pc++]; 模拟取指周期
switch(code)    即译码过程
case 0xXX    模拟执行周期

SWITCH中每一个CASE对应相应指令的动作步骤。它相当于CPU中的控制部分(指令译码器和控制矩阵)。这里我要纠正一个概念,我的这个函数做的不是什么整体转换,是执行指令。这个其实写成对象模型就更形象了。

建议参考微机原理的相关部分,看一下处理器的译码器电路执行原理。

这里我提个问题。你把操作码解析出来的目的是什么?为什么要解析出是操作指令、操作数、寻址方式这些东西?

你想要的解析结果只是符合人的思维习惯,但实现来说只会增加代码的复杂程度,并没有别的积极的改善(理解起来也未必轻松)。关于这一点光靠嘴说是没用的。如果你有成熟的方案我非常希望你能实现成代码。这不是在比试什么,我也不是在挑衅你。我想借鉴一下你的思想,而理解你编程思想的最直接的方法当然是看你的代码。

我觉得你搞混了编译器和虚拟机的差别。编译器是将一种指令系统转化为另一种指令系统。在这个过程中才需要对前一种指令进行解析,分离出各种元素,然后再合成为另一种指令系统。而虚拟机则是用于在一个系统上执行另一个系统的指令序列。

重剑无锋,大巧不工
2012-03-13 12:54
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 30楼 clcqifeng
在你的原贴中我已经说过了,我认为你示例2的第3个字节敲错了。不是10000001,而是10001001。

这一点请你和你们头头核实,最好让他核实一遍我发的指令集是否符合要求。有不同意见请反馈回来。

我没想到你的水平还没达到入门的阶段。并没有指责你的意思,只想说,暂时你还做不了这样的程序,解释你也听不懂的。还是静下心来先把基础打扎实了。

重剑无锋,大巧不工
2012-03-13 13:04
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 32楼 beyondyf
我头头让我自己做。被他知道我问还不拍死我。
程序代码:
char *cp, *dp;
char r1, r2, r3;


docopy(command)
{
  if (command & 8) {
    direction = 1;
  }
  if (command & 5) {
    if (direction) {
      r3=r1;
    }
    else {
      r1 = r3;
    }
  }
  if (command & 6) {
  }
  if (command & 4) {
  }
}

doprint(command)
{
  if (command & 8) {
    if (command & 4) {
      printf((dp+r1));
    }
    if (command & 2) {
      printf((dp+r2));
    }
    if (command & 1) {
      printf((dp+r3));
    }
  }
}

execute(command)
{
  switch(cp >> 4) {
    case 1:
      docopy(command)
      break;
    case 2:
      doadd(command)
      break
    case 3:
      ...
    case 8:
      doprint(command);
    default:
  }
}

main(argc, argv)
{
  filename = getfilename(argv)
  cp = getcommand(filename);
  dp = getdata(filename);
  while (cp != 0xf0) {
    execute(*cp);
    cp++;
  }
}
他让我做的好像就跟以上程序框架内的差不多。.好像没那么复杂...
2012-03-13 14:22
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
自己做着做着有点懂你这个了。但->这东西还没弄懂。.刚做完第四步

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


FILE *fp;
char *cp, *dp;
char r1, r2, r3;


char* getcommand(char* filename)
{
  char *ret = malloc(4000);
  char *c = ret;
  fread(c, 1, sizeof(char), fp);
  while((*c & 0xf0)!= 0xf0){
    c++;
    fread(c, 1, sizeof(char), fp);
  }
  return ret;
}


char* getdata(char* filename)
{
  int i = 0;
  char *ret = malloc(4000);
  char *d = ret;
  fread(d, 1, sizeof(char), fp);
  while(!feof(fp)){
    d++;
    fread(d, 1, sizeof(char), fp);
  }
  return ret;
}


docopy(command)
{
  switch(command & 0x0f){
    case 6: r1 = r2; break;
    case 5: r1 = r3; break;
    case 3: r2 = r3; break;
    case 14: r2 = r1; break;
    case 13: r3 = r1; break;
    case 11: r3 = r2; break;
  }
}


doadd(command)
{
  switch(command & 0x0f){
    case 6: r1 = r1+ r2; break;
    case 5: r1 = r1+ r3; break;
    case 3: r2 = r2+ r3; break;
    case 14: r2 = r1+ r2; break;
    case 13: r3 = r1+ r3; break;
    case 11: r3 = r2+ r3; break;
  } 

}


dosub(command)
{
  switch(command & 0x0f){
    case 6: r1 = r1- r2; break;
    case 5: r1 = r1- r3; break;
    case 3: r2 = r2- r3; break;
    case 14: r2 = r1- r2; break;
    case 13: r3 = r1- r3; break;
    case 11: r3 = r2- r3; break;
  } 

}


movereg(command)
{
  switch(command & 0x0f){
    case 6: r1 = *(dp + r2); break;
    case 5: r1 = *(dp + r3); break;
    case 3: r2 = *(dp + r3); break;
    case 14: r2 = *(dp + r1); break;
    case 13: r3 = *(dp + r2); break;
    case 11: r3 = *(dp + r1); break;
    case 4: r1 = *(++cp); break;
    case 2: r2 = *(++cp); break;
    case 1: r1 = *(++cp); break;
  }
}

movemem(command)
{
  switch(command & 0x0f){
    case 6: 

  }
}


execute(command)
{
  switch(command >> 4){
    case 1:
      docopy(command);
      break;
    case 2:
      doadd(command);
      break;
    case 3:
      dosub(command);
      break;
    case 4:
      movereg(command);
      break;
    case 5:
      movemem(command);
      break;
    case 6:
      break;
    case 7:
      break;
    case 8:
      break;
  }
}

int main(int argc, char* argv[])
{
  int c;
  char filename[1024];
  strcpy(filename, argv[1]);
  fp = fopen(filename, "r");
  cp = getcommand(filename);
  printf("%2x\n",*cp);
  dp = getdata(filename);
  printf("%2x\n",*(dp+1));
  while((*cp & 0xf0) != 0xf0){
    execute(*cp);
    cp++;
  }
  fclose(fp);
  free(cp);
  free(dp);
}

2012-03-14 10:35
C_596322153
Rank: 6Rank: 6
来 自:徽州
等 级:侠之大者
帖 子:182
专家分:466
注 册:2012-1-10
收藏
得分:0 
老大  能解释下这个程序具体是干嘛的吗?

另外 这个 strtok    这句VM vm; 不太懂   VM是不是结构体 变量名
努力看中。。。
2012-03-14 11:34
快速回复:不等了。关于CPU模拟的解决方案发布 及 散分!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016814 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved