网教29. 微处理器模拟

本文介绍了具有特定特性的小型微处理器,其内存为256个字,使用四位字和双字地址。处理器拥有9条指令,部分指令带有参数。程序从地址00开始执行,直至遇到终止指令。内容包括了输入输出的详细说明和示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

考虑一个具有以下特性的的小型微处理器:

  • 每个字有四位。
  • 地址是两个字。 高字在前。 也就是说两个字组成的地址中的高字总是在低字的内存前。
  • 内存占有256个字。
  • 有两个累加器,A和B, 每个存储一个字。
  • 一个有9个指令代码。每个指令需要至少一个字来存储代表这条指令的代码。有四条指令有参数并需要额外的两字。

每个四位代表的数字可以有值0~15,包括0和15在内,10进制。我们会以常见的十六进制的行式编写代码。也就是说A代表10,B代表11……

下面是9条指令:

代 码字数

描述

03LD:装载指令中参数代表的地址的内容到累加器A
13ST:向指令中参数代表的地址写入累加器A的内容
21SWP:交换A和B的内容
31ADD:将A和B中的内容相加,并将结果的低字写入A,高字写入B
41INC:A中数加1,允许向上溢出,也就是说F+1-->0
51DEC:A中数减1,允许向下溢出,也就是说0-1-->F
63BZ:如果A=0,下一个要执行的命令是在参数代表的地址的指令;如果A不是0,则参数被忽略不执行。
73BR:下一条要执行的指令在参数指定的地址。
81STP:程序中止执行。

微处理器每次都从00处的代码开始执行,并一直执行直到遇到中止的命令。

以下的例子表现了部分的程序并描述了它们的功效。

程序描述
01A8将在1A(10进制26)处的内容装入A,并终止。
01A512F8将在1A(10进制26)处的内容装入A,A减1,把结果保存在2F处,并终止。

输入

在输入中将包含由正好256个字符组成的数行。每一行都代表内存的内容,地址00到FF。

如果一行代码的00处是8,程序结束输入。程序运行的过程中不会从内存中溢出,也就是说不会有F0到FF的指令让你去执行。

输出

对于给出的每一种内存状况,你必须从00开始模拟执行,当遇到停止命令时,将当时的内存中的内容输出成一行256个字符的串(由16进制表示)。

  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 2 以文本方式显示
  1. 0102011311321128FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000↵
  2. 8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000↵
以文本方式显示
  1. 0102011311321128FF1E00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000↵
1秒 1024KB 0
题解:
这个题只是看着很麻烦。。其实直接把所有情况过一遍就能出结果了,也没什么算法可言。
唯一可能出问题的就是6和7了,我一开始没读懂6和7的意思,其实是读到这个(7ab)的时候,就直接跳到“ab”位置进行此处该运行的操作。
一开始错的原因是把ab算出来之后直接让i等于那个位置,但是之后i进行了一次++操作,就导致i又往后跳了一位。所以i应该等于num-1,然后++操作之后就是num了。
AC代码:
#include<stdio.h> 
#include<string.h> 
char a[300]; 
int change(char t) 
{ 
 if (t == '0') return 0; 
    else if (t == '1') return 1; 
   else if (t == '2') return 2; 
   else if (t == '3') return 3; 
   else if (t == '4') return 4; 
   else if (t == '5') return 5; 
   else if (t == '6') return 6; 
   else if (t == '7') return 7; 
   else if (t == '8') return 8; 
   else if (t == '9') return 9; 
   else if (t == 'A') return 10; 
  else if (t == 'B') return 11; 
  else if (t == 'C') return 12; 
  else if (t == 'D') return 13; 
  else if (t == 'E') return 14; 
  else if (t == 'F') return 15; 
} 
char changeback(int t) 
{ 
   if (t == 0) return '0'; 
    else if (t == 1) return '1'; 
   else if (t == 2) return '2'; 
   else if (t == 3) return '3'; 
   else if (t == 4) return '4'; 
   else if (t == 5) return '5'; 
   else if (t == 6) return '6'; 
   else if (t == 7) return '7'; 
   else if (t == 8) return '8'; 
   else if (t == 9) return '9'; 
   else if (t == 10) return 'A'; 
  else if (t == 11) return 'B'; 
  else if (t == 12) return 'C'; 
  else if (t == 13) return 'D'; 
  else if (t == 14) return 'E'; 
  else if (t == 15) return 'F'; 
} 
int main() 
{ 
   while (scanf("%s", a) != EOF) 
  { 
      if (a[0] == '8') 
           break; 
     int b = 0, c = 0; 
      int len = strlen(a); 
       for (int i = 0; i < len; i++) 
       { 
          int num; 
           if (a[i] == '0') 
           { 
              num = change(a[i + 1]) * 16 + change(a[i + 2]); 
                b = change(a[num]); 
                i += 2; 
            } 
          else if (a[i] == '1') 
          { 
              num = change(a[i + 1]) * 16 + change(a[i + 2]); 
                a[num] = changeback(b); 
                i += 2; 
            } 
          else if (a[i] == '2') 
          { 
              int tmp; 
               tmp = b; 
               b = c; 
             c = tmp; 
           } 
          else if (a[i] == '3') 
          { 
              int tmp = b + c; 
               b = tmp % 16; 
              c = tmp / 16; 
          } 
          else if (a[i] == '4') 
          { 
              b++; 
               while (b >= 16) 
                 b -= 16; 
           } 
          else if (a[i] == '5') 
          { 
              b--; 
               while (b < 0) 
                   b += 16; 
           } 
          else if (a[i] == '6') 
          { 
              if (b == 0) 
                { 
                  num = change(a[i + 1]) * 16 + change(a[i + 2]); 
                    i = num-1; 
             } 
              else 
                   i += 2; 
            } 
          else if (a[i] == '7') 
          { 
              num = change(a[i + 1]) * 16 + change(a[i + 2]); 
                i = num - 1; 
           } 
          else if (a[i] == '8') 
          { 
              break; 
         } 
      } 
      printf("%s\n", a); 
 } 
  return 0; 
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值