| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2174 人关注过本帖
标题:T.P版.模拟cpu什么意思阿。这题.....
只看楼主 加入收藏
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 20楼 TonyDeng
。。。。。。。。。。
越听越迷糊。。
我想问。。。

是不是跟平时写程序那样。。。然后
#include <stdio>
mian()
{
   判定字符的2进制8位码..前四位如果为0001
   就定义0001为复制..然后第5位又给他个意思然后后3位100为r1  010为r2 001为r3那样子。。。。.
}


我没接触过这种东西阿.完全不知道什么东西来的阿....
2012-03-09 17:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
你重看20楼,有补充。

不是你以为的那样,你的头头,要求你给出的是一堆二进制代码,这叫机器代码,不是你说的C语言那样的东西。总之,最后的意思,是当要求你做显示12+34的结果时,你写出那一串二进制代码。换言之,让你的头脑做编译器。

[ 本帖最后由 TonyDeng 于 2012-3-9 17:22 编辑 ]

授人以渔,不授人以鱼。
2012-03-09 17:17
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 22楼 TonyDeng
他跟我说时候不是这样阿....
   说让我做个模拟cpu东东。。
   运行那个东东后。。
输入01000001 00000001 10000001 11110000 00000000 01001000 01100101 01101100 01101100 01101111 00101100 00100000 01110111 01101111 01110010 01101100 01100100 00100001 00000000
这串二进制后。
那个东东要显示出hello,world这样的东西阿。...
2012-03-09 17:28
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
楼主的说明中一定存在着笔误,(00001000的值是7 这个描述很明显是错的),其它指令中寄存器的描述也不统一,怀疑是笔误。
修正笔误后问一下你们头头,落实一下这两个问题
1.三个寄存器的大小是多少?
2.寻址范围是多少?

目前看起来你的三个寄存器都是8位的,寻址范围也是8位的。

就这么几条指令,模拟很简单。

重剑无锋,大巧不工
2012-03-09 17:28
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 24楼 beyondyf
  就像你那么说。。
我没接触过这类问题。。
能示范下模拟cpu
0001         复制操作
00011110       复制r1到r2
00010110       复制r2到r1
上面这三个模拟的话要怎么做。
2012-03-09 17:38
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,我是来看热闹的,看看Tony能解答到什么程度。

我解答也可以,但不想在这栋楼里。

重剑无锋,大巧不工
2012-03-09 17:48
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
怎么没动静了?

楼主,我改写并完善了你的指令集,你确认一下是否符合要求。然后谈谈对于未定义指令希望怎么表现。

程序代码:
r1 r2 r3

0001        复制操作
00010110    复制r2到r1
00010111    复制r3到r1
00011001    复制r1到r2
00011011    复制r3到r2
00011101    复制r1到r3
00011110    复制r1到r3

0010        加法
00100110    将r1与r2相加,结果存放在r1
00100111    将r1与r3相加,结果存放在r1
00101001    将r2与r1相加,结果存放在r2
00101011    将r2与r3相加,结果存放在r2
00101101    将r3与r1相加,结果存放在r3
00101110    将r3与r2相加,结果存放在r3

0011        减法
00110110    用r1减去r2,结果存放在r1
00110111    将r1减去r3,结果存放在r1
00111001    用r2减去r1,结果存放在r2
00111011    将r2减去r3,结果存放在r2
00111101    用r3减去r1,结果存放在r3
00111110    将r3减去r2,结果存放在r3

0100        移动到register
01000110    将r2中存放的地址的数据放到r1中
01000111    将r3中存放的地址的数据放到r1中
01001001    将r1中存放的地址的数据放到r2中
01001011    将r3中存放的地址的数据放到r2中
01001101    将r1中存放的地址的数据放到r3中
01001110    将r2中存放的地址的数据放到r3中
01000100 xxxxxxxx    数字X放到r1中
01001000 xxxxxxxx    数字X放到r2中
01001100 xxxxxxxx    数字X放到r3中

0101        移动到memory
01010110    将r2中存放的数据放到r1所指的内存地址中去
01010111    将r3中存放的数据放到r1所指的内存地址中去
01011001    将r1中存放的数据放到r2所指的内存地址中去
01011011    将r3中存放的数据放到r2所指的内存地址中去
01011101    将r1中存放的数据放到r3所指的内存地址中去
01011110    将r2中存放的数据放到r3所指的内存地址中去

0110        为零跳转
01100110    如果r1的值为零,则跳转到r2所指的代码处
01100111    如果r1的值为零,则跳转到r3所指的代码处
01101001    如果r2的值为零,则跳转到r1所指的代码处
01101011    如果r2的值为零,则跳转到r3所指的代码处
01101101    如果r3的值为零,则跳转到r1所指的代码处
01101110    如果r3的值为零,则跳转到r2所指的代码处

0111        不为零跳转
01110110    如果r1的值不为零,则跳转到r2所指的代码处
01110111    如果r1的值不为零,则跳转到r3所指的代码处
01111001    如果r2的值不为零,则跳转到r1所指的代码处
01111011    如果r2的值不为零,则跳转到r3所指的代码处
01111101    如果r3的值不为零,则跳转到r1所指的代码处
01111110    如果r3的值不为零,则跳转到r2所指的代码处

1000        打印
10000100    打印r1所指向的内存地址的数字
10000101    打印r1所指向的内存地址的字符串,字符串以0结尾
10001000    打印r2所指向的内存地址的数字
10001001    打印r2所指向的内存地址的字符串,字符串以0结尾
10001100    打印r3所指向的内存地址的数字
10001101    打印r3所指向的内存地址的字符串,字符串以0结尾

11110000    程序结束

重剑无锋,大巧不工
2012-03-09 20:17
clcqifeng
Rank: 2
等 级:论坛游民
帖 子:101
专家分:17
注 册:2012-2-16
收藏
得分:0 
回复 27楼 beyondyf
刚下班肥家了.
int getcommand(c)
{
  if (00100000 & c) {
    return ADD;
  }
}

main()
{
  int r1, r2, r3;
  read(c)
  a = getcommand(c)
  if (a==ADD) {
    //0110
   if (a==


要做的的是那个要求1要求2而已。.貌似是这样定义的.我做做先.
2012-03-09 20:56
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
回复 27楼 beyondyf
你没理解他的指令集是如何解析的,所以你的完善是错的,我一会实现下

技术问题,请不要以短消息方式提问
2012-03-09 22:16
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
程序代码:
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef uint8_t machine_size;
typedef machine_size m_size_t;

#define _MOV            0x0001
#define _ADD            0x0010
#define _SUB            0x0011
#define _LEA            0x0101
#define _JZ            0x0110
#define _JNZ            0x0111
#define _DUMP            0x1000
#define _EXIT            0x11110000
#define SRC2DST            0x01
#define DST2SRC            0x00
#define UNIT_PER_BYTE        8
#define LOHALF(b)        (b & 0x0F)
#define HIHALF(b)        (b >> 4)
#define MAKEBYTE(l, h)        (((h << 4) & 0xF0) | (l & 0x0F))
#define MAKEWORD(a, b)        ((uint16_t)(((uint8_t)((uint32_t)(a) & 0xff)) |        \
                ((uint16_t)((uint8_t)((uint32_t)(b) & 0xff))) << 8))
#define MAKELONG(a, b)        ((uint32_t)(((uint16_t)((uint32_t)(a) & 0xffff)) |    \
                ((uint32_t)((uint32_t)((uint32_t)(b) & 0xffff))) << 16))

#define LOBYTE(w)        ((uint8_t)(w))
#define HIBYTE(w)        ((uint8_t)(((uint16_t)(w) >> 8) & 0xFF))
#define raise_bits(i, bits)    ((i) |= (bits))
#define _ARCH            intel
#define FAKE2REAL(index)    _ARCH[index]

#ifdef CONFIG_B2B_LMODE
#define B2B(out, in)                            \
    do {                                \
        uint16_t i;                        \
        for (i = 0; i < UNIT_PER_BYTE; i++)            \
            raise_bits(out, _BV(7-i) & in[i]);        \
    } while (0);
#else
#define B2B(out, in)                            \
    do {                                \
        uint16_t i;                        \
        for (i = 0; i < UNIT_PER_BYTE; i+=2)            \
            out[i] = MAKEBYTE(((in >> (7-i-1)) & 0x01),    \
                          ((in >> (7-i)) & 0x01));    \
    } while (0);
   
#endif
const uint16_t opcode[] = {
    _MOV, _ADD,
    _SUB, _LEA,
    _JZ, _JNZ,
    _DUMP, HIBYTE(_EXIT), LOBYTE(_EXIT)
};

const uint8_t *intel[] = {
    "MOV", "ADD",
    "SUB", "LEA",
    "JZ", "JNZ",
    "PRINT", "EXIT"
};

uint8_t *cmd_request;

struct cpu_context {
    machine_size pc;
};

static void __entry4_decode(m_size_t opcode)
{

}

static void __entry8_decode(m_size_t opcode)
{
#include <stdio.h>
    uint8_t op[4];
    B2B(op, opcode);
    switch (MAKELONG(MAKEWORD(op[3],op[2]), MAKEWORD(op[1], op[0]))) {
    case _EXIT:
        sprintf(cmd_request, "%s", FAKE2REAL(7));
    break;
    }
}

void decode_opcode(m_size_t opcode)
{
    __entry8_decode(opcode);
    __entry4_decode(opcode);
}

int main(int argc, char *argv[])
{
    return 0;
}
明天再写了

技术问题,请不要以短消息方式提问
2012-03-10 00:07
快速回复:T.P版.模拟cpu什么意思阿。这题.....
数据加载中...
 
   



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

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