BestCoder Round#15 1002-Instruction

本文介绍了一种简单的指令编码和解码算法,包括ADD、SUB、DIV等操作的二进制编码实现,并提供了一个具体的编程示例。

http://acm.hdu.edu.cn/showproblem.php?pid=5083

 

官方题解——》

1002 Instruction 先考虑编码,首先找到operation对应的编码,如果是SET就找后面的一个R后面跟着的数字a,令b=0,否则找后面第一个R后面的数字当作a,第二个R后面的数字当作b,最后依次输出operation二进制编码,a, b的二进制编码。 再说解码,先将前6位,中间5位和后面5位转化成十进制记为oid, a, b。如果oid<1||oid>6就是Error!,如果oid<6那么a,b都不能为0,如果oid==6那么a!=0&&b==0。其它情况都是Error!,最后按照oid,a,b输出指令即可。

 下面来代码。。水平有限,比较丑,勿怪-_-|||

 

  1 #include <stdio.h>

 2 #include < string.h>
 3 #include <math.h>
 4 
 5  int num[ 33] = {
 6      011011100101110111,
 7      10001001101010111100110111101111,
 8      1000010001100101001110100101011011010111,
 9      1100011001110101101111100111011111011111
10 };
11 
12  int op[ 10] = {
13      011011100101110
14 };
15 
16  char op2[ 7][ 6] = {
17      """ ADD "" SUB "" DIV "" MUL "" MOVE "" SET "
18 };
19 
20 
21 
22 
23  int main(){
24      int type, a, b, i, j, c;
25      char str[ 20];
26      while(scanf( " %d ", &type) != EOF){
27          if(type ==  1){
28             scanf( " %s  ", str);
29               if(strcmp(str,  " ADD ") ==  0){
30                 scanf( " %*c%d,%*c%d ", &a, &b);
31                 printf( " %06d%05d%05d\n ", op[ 1], num[a], num[b]);
32             }
33              else  if(strcmp(str,  " SUB ") ==  0){
34                 scanf( " %*c%d,%*c%d ", &a, &b);
35                 printf( " %06d%05d%05d\n ", op[ 2], num[a], num[b]);
36             }
37              else  if(strcmp(str,  " DIV ") ==  0){
38                 scanf( " %*c%d,%*c%d ", &a, &b);
39                 printf( " %06d%05d%05d\n ", op[ 3], num[a], num[b]);
40             }
41              else  if(strcmp(str,  " MUL ") ==  0){
42                 scanf( " %*c%d,%*c%d ", &a, &b);
43                 printf( " %06d%05d%05d\n ", op[ 4], num[a], num[b]);
44             }
45              else  if(strcmp(str,  " MOVE ") ==  0){
46                 scanf( " %*c%d,%*c%d ", &a, &b);
47                 printf( " %06d%05d%05d\n ", op[ 5], num[a], num[b]);
48             }
49              else  if(strcmp(str,  " SET ") ==  0){
50                 scanf( " %*c%d ", &a);
51                 printf( " %06d%05d%05d\n ", op[ 6], num[a], num[ 0]);
52             }
53         }
54          else{
55             scanf( " %s ", str);
56              for(c = i =  0; i <  6; i++){
57                  if(str[i] ==  ' 1 '){
58                     c += ( int)pow( 25 - i);
59                 }
60             }
61              if(c >  6 || c ==  0){
62                 printf( " Error!\n ");
63                  continue;
64             }
65              for(a =  0, i =  6; i <  11; i++){
66                  if(str[i] ==  ' 1 '){
67                     a += ( int)pow( 210 - i);
68                 }
69             }
70              if(a >  32 || a ==  0){
71                 printf( " Error!\n ");
72                  continue;
73             }
74              for(b =  0, i =  11; i <  16; i++){
75                  if(str[i] ==  ' 1 '){
76                     b += ( int)pow( 215 - i);
77                 }
78             }
79              if(b >  32){
80                 printf( " Error!\n ");
81                  continue;
82             }
83              if(c ==  6 && b !=  0){
84                 printf( " Error!\n ");
85                  continue;
86             }
87              if(c ==  6 && a !=  0 && b ==  0){
88                 printf( " %s R%d\n ", op2[c], a);
89                  continue;
90             }
91              if(c >  0 && c <  6 && a !=  0 && b !=  0){
92                 printf( " %s R%d,R%d\n ", op2[c], a, b);
93                  continue;
94             }
95             printf( " Error!\n ");
96         }
97     }
98      return  0;
99 }

转载于:https://www.cnblogs.com/angle-qqs/p/4051151.html

在ARM体系结构中,异常处理分为两种:中断(Interrupt)和异常(Exception)。其中,中断是由外部设备触发的异步事件,而异常是由指令执行引起的同步事件。 在ARM处理器执行异常处理程序时,需要从异常模式(Exception Mode)返回到原来的执行模式。为了实现这一过程,需要使用异常返回指令(Exception Return Instruction)将程序计数器(PC)置为返回地址。不同的异常或入口对应不同的异常返回指令和返回地址,具体如下: 1. 未定义的指令异常(Undefined Instruction Exception):当ARM处理器遇到未定义的指令时,会触发该异常。在异常处理程序中,需要使用MOVS PC,R14_und指令将PC置为R14_und的值,返回地址为R14。 2. 预取指中止异常(Prefetch Abort Exception):当ARM处理器无法从内存中预取指令时,会触发该异常。在异常处理程序中,需要使用SUBS PC,R14_abt,#4指令将PC置为R14_abt-4的值,返回地址为R14-4。 3. 中断异常(Interrupt Exception):当外部设备触发中断时,会触发该异常。在异常处理程序中,需要使用SUBS PC,R14_irq,#4指令将PC置为R14_irq-4的值,返回地址为R14-4。 4. 数据中止异常(Data Abort Exception):当ARM处理器无法从内存中读取或写入数据时,会触发该异常。在异常处理程序中,需要使用SUBS PC,R14_abt,#8指令将PC置为R14_abt-8的值,返回地址为R14-8。 因为不同的异常或入口对应不同的异常返回指令和返回地址,所以偏移量也不相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值