//#include "main.h" #include "STU_InstructAndDecode.h" uint8_t STU_InstructAndDecode(void) { uint8_t uc_operand; uint32_t uw_operand1,uw_operand2,uw_result; int32_t w_operand1,w_operand2,w_result; /**************************赋值指令******************************/ uc_operand = 0x55; if(uc_operand != 0x55) { return(ERROR); } uc_operand = 0xAA; if(uc_operand != 0xAA) { return(ERROR); } uw_operand1 = 0x55555555; if(uw_operand1 != 0x55555555) { return(ERROR); } uw_operand1 = 0xAAAAAAAA; if(uw_operand1 != 0xAAAAAAAA) { return(ERROR); } /**************************加法指令******************************/ uw_operand1 = 1000; uw_operand2 = 2000; uw_result = uw_operand1 + uw_operand2; if(uw_result != 3000) { return(ERROR); } uw_operand1 = 0xFFFFFFFF; uw_operand2 = 0x02; uw_result = uw_operand1 + uw_operand2; if(uw_result != 0x01) { return(ERROR); } w_operand1 = 1000; w_operand2 = -2000; w_result = w_operand1 + w_operand2; if(w_result != -1000) { return(ERROR); } w_operand1 = 0x7FFFFFFF; w_operand2 = 0x01; w_result = w_operand1 + w_operand2; if(w_result != (int32_t)0x80000000) { return(ERROR); } w_operand1 = 0x7FFFFFFF; w_operand2 = 0x02; w_result = w_operand1 + w_operand2; if(w_result != (int32_t)-0x7FFFFFFF) { return(ERROR); } w_operand1 = 0x7FFFFFFF; w_operand2 = 0x03; w_result = w_operand1 + w_operand2; if(w_result != (int32_t)-0x7FFFFFFE) { return(ERROR); } /**************************减法指令******************************/ uw_operand1 = 2000; uw_operand2 = 1000; uw_result = uw_operand1 - uw_operand2; if(uw_result != 1000) { return(ERROR); } uw_operand1 = 2000; uw_operand2 = 2001; uw_result = uw_operand1 - uw_operand2; if(uw_result != 0xFFFFFFFF) { return(ERROR); } uw_operand1 = 0; uw_operand2 = 1; uw_result = uw_operand1 - uw_operand2; if(uw_result != 0xFFFFFFFF) { return(ERROR); } w_operand1 = 1000; w_operand2 = 2000; w_result = w_operand1 - w_operand2; if(w_result != (int32_t)-1000) { return(ERROR); } w_operand1 = 0; w_operand2 = 1; w_result = w_operand1 - w_operand2; if(w_result != (int32_t)-1) { return(ERROR); } w_operand1 = 0x80000000; w_operand2 = 1; w_result = w_operand1 - w_operand2; if(w_result != (int32_t)0x7FFFFFFF) { return(ERROR); } /**************************自加“++”指令******************************/ uw_operand1 = 1000; uw_operand1++; if(uw_operand1 != 1001) { return(ERROR); } uw_operand1 = 0xFFFFFFFF; uw_operand1++; if(uw_operand1 != 0) { return(ERROR); } uw_operand1 = 0x00; uw_operand1++; if(uw_operand1 != 0x01) { return(ERROR); } w_operand1 = 1000; w_operand1++; if(w_operand1 != 1001) { return(ERROR); } w_operand1 = 0x00; w_operand1++; if(w_operand1 != 0x01) { return(ERROR); } w_operand1 = 0x7FFFFFFF; w_operand1++; if(w_operand1 != 0x80000000) { return(ERROR); } w_operand1 = 0x80000000; w_operand1++; if(w_operand1 != 0x80000001) { return(ERROR); } /**************************自减“--”指令******************************/ uw_operand1 = 1000; uw_operand1--; if(uw_operand1 != 999) { return(ERROR); } uw_operand1 = 0x0; uw_operand1--; if(uw_operand1 != 0xFFFFFFFF) { return(ERROR); } uw_operand1 = 0xFFFFFFFF; uw_operand1--; if(uw_operand1 != 0xFFFFFFFE) { return(ERROR); } w_operand1 = 1000; w_operand1--; if(w_operand1 != 999) { return(ERROR); } w_operand1 = 0x80000000; w_operand1--; if(w_operand1 != 0x7FFFFFFF) { return(ERROR); } w_operand1 = 0x7FFFFFFF; w_operand1--; if(w_operand1 != 0x7FFFFFFE) { return(ERROR); } w_operand1 = 0x0; w_operand1--; if(w_operand1 != 0xFFFFFFFF) { return(ERROR); } /**************************乘法指令******************************/ uw_operand1 = 100; uw_operand2 = 10; uw_result = uw_operand1 * uw_operand2; if(uw_result != 1000) { return(ERROR); } uw_operand1 = 0x0FFFFFFF; uw_operand2 = 0x11; uw_result = uw_operand1 * uw_operand2; if(uw_result != 0x0FFFFFEF) { return(ERROR); } uw_operand1 = 0xFFFFFFFF; uw_operand2 = 0x1; uw_result = uw_operand1 * uw_operand2; if(uw_result != 0xFFFFFFFF) { return(ERROR); } uw_operand1 = 100; uw_operand2 = 0; uw_result = uw_operand1 * uw_operand2; if(uw_result != 0) { return(ERROR); } /**************************除法指令******************************/ uw_operand1 = 1000; uw_operand2 = 10; uw_result = uw_operand1 / uw_operand2; if(uw_result != 100) { return(ERROR); } uw_operand1 = 1; uw_operand2 = 10; uw_result = uw_operand1 / uw_operand2; if(uw_result != 0) { return(ERROR); } uw_operand1 = 0; uw_operand2 = 10; uw_result = uw_operand1 / uw_operand2; if(uw_result != 0) { return(ERROR); } uw_operand1 = 1000; uw_operand2 = 0; uw_result = uw_operand1 / uw_operand2; if(uw_result != 0) { return(ERROR); } uw_operand1 = 0xFFFFFFFF; uw_operand2 = 1; uw_result = uw_operand1 / uw_operand2; if(uw_result != 0xFFFFFFFF) { return(ERROR); } /**************************左移指令******************************/ uw_operand1 = 0x2; uw_result = uw_operand1 << 1; if(uw_result != 0x4) { return(ERROR); } uw_operand1 = 0x2; uw_result = uw_operand1 << 8; if(uw_result != 0x200) { return(ERROR); } uw_operand1 = 0x2; uw_result = uw_operand1 << 31; if(uw_result != 0x0) { return(ERROR); } /**************************右移指令******************************/ uw_operand1 = 0xFFFF; uw_result = uw_operand1 >> 1; if(uw_result != 0x7FFF) { return(ERROR); } uw_operand1 = 0xFFFF; uw_result = uw_operand1 >> 8; if(uw_result != 0xFF) { return(ERROR); } uw_operand1 = 0xFFFF; uw_result = uw_operand1 >> 31; if(uw_result != 0x0) { return(ERROR); } /**************************if else指令******************************/ uw_operand1 = 1; if(uw_operand1) { //ok } else { return(ERROR); } uw_operand1 = 0; if(uw_operand1) { return(ERROR); } else { //ok } uw_operand1 = 0xFF; if(uw_operand1) { //ok } else { return(ERROR); } /**************************大于指令******************************/ uw_operand1 = 100; uw_operand2 = 10; if(uw_operand1 > uw_operand2) { //ok } else { return(ERROR); } uw_operand1 = 100; uw_operand2 = 100; if(uw_operand1 > uw_operand2) { return(ERROR); } else { //ok } uw_operand1 = 10; uw_operand2 = 100; if(uw_operand1 > uw_operand2) { return(ERROR); } else { //ok } uw_operand1 = 0xFFFFFFFF; uw_operand2 = 0; if(uw_operand1 > uw_operand2) { //ok } else { return(ERROR); } w_operand1 = 0x7FFFFFFF; w_operand2 = 0x80000000; if(w_operand1 > w_operand2) { //ok } else { return(ERROR); } /**************************小于指令******************************/ uw_operand1 = 10; uw_operand2 = 100; if(uw_operand1 < uw_operand2) { //ok } else { return(ERROR); } uw_operand1 = 100; uw_operand2 = 100; if(uw_operand1 < uw_operand2) { return(ERROR); } else { //ok } uw_operand1 = 100; uw_operand2 = 10; if(uw_operand1 < uw_operand2) { return(ERROR); } else { //ok } uw_operand1 = 0; uw_operand2 = 0xFFFFFFFF; if(uw_operand1 < uw_operand2) { //ok } else { return(ERROR); } w_operand1 = 0x80000000; w_operand2 = 0x7FFFFFFF; if(w_operand1 < w_operand2) { //ok } else { return(ERROR); } /**************************大于等于指令******************************/ uw_operand1 = 100; uw_operand2 = 10; if(uw_operand1 >= uw_operand2) { //ok } else { return(ERROR); } uw_operand1 = 100; uw_operand2 = 100; if(uw_operand1 >= uw_operand2) { //ok } else { return(ERROR); } uw_operand1 = 10; uw_operand2 = 100; if(uw_operand1 >= uw_operand2) { return(ERROR); } else { //ok } uw_operand1 = 0xFFFFFFFF; uw_operand2 = 0; if(uw_operand1 >= uw_operand2) { //ok } else { return(ERROR); } w_operand1 = 0x7FFFFFFF; w_operand2 = 0x80000000; if(w_operand1 >= w_operand2) { //ok } else { return(ERROR); } /**************************小于等于指令******************************/ uw_operand1 = 10; uw_operand2 = 100; if(uw_operand1 <= uw_operand2) { //ok } else { return(ERROR); } uw_operand1 = 100; uw_operand2 = 100; if(uw_operand1 <= uw_operand2) { //ok } else { return(ERROR); } uw_operand1 = 100; uw_operand2 = 10; if(uw_operand1 <= uw_operand2) { return(ERROR); } else { //ok } uw_operand1 = 0; uw_operand2 = 0xFFFFFFFF; if(uw_operand1 <= uw_operand2) { //ok } else { return(ERROR); } w_operand1 = 0x80000000; w_operand2 = 0x7FFFFFFF; if(w_operand1 <= w_operand2) { //ok } else { return(ERROR); } /**************************等于指令******************************/ uw_operand1 = 100; uw_operand2 = 100; if(uw_operand1 == uw_operand2) { //ok } else { return(ERROR); } uw_operand1 = 0xFFFFFFFF; uw_operand2 = 0xFFFFFFFF; if(uw_operand1 == uw_operand2) { } else { return(ERROR); } uw_operand1 = 0; uw_operand2 = 0; if(uw_operand1 == uw_operand2) { } else { return(ERROR); } w_operand1 = 0x80000000; w_operand2 = 0x80000000; if(w_operand1 == w_operand2) { } else { return(ERROR); } w_operand1 = 0; w_operand2 = 0; if(w_operand1 == w_operand2) { } else { return(ERROR); } w_operand1 = 0x7FFFFFFF; w_operand2 = 0x7FFFFFFF; if(w_operand1 == w_operand2) { } else { return(ERROR); } /**************************不等于指令******************************/ uw_operand1 = 100; uw_operand2 = 100; if(uw_operand1 != uw_operand2) { return(ERROR); } else { } uw_operand1 = 0xFFFFFFFF; uw_operand2 = 0xFFFFFFFF; if(uw_operand1 != uw_operand2) { return(ERROR); } else { } uw_operand1 = 0; uw_operand2 = 0; if(uw_operand1 != uw_operand2) { return(ERROR); } else { } w_operand1 = 0x80000000; w_operand2 = 0x80000000; if(w_operand1 != w_operand2) { return(ERROR); } else { } w_operand1 = 0; w_operand2 = 0; if(w_operand1 != w_operand2) { return(ERROR); } else { } w_operand1 = 0x7FFFFFFF; w_operand2 = 0x7FFFFFFF; if(w_operand1 != w_operand2) { return(ERROR); } else { } /**************************SWITCH 指令******************************/ uw_operand1 = 1; uw_operand2 = 0; switch(uw_operand1) { case 1: uw_operand2 = uw_operand2 + 2; break; case 2: uw_operand2 = uw_operand2 + 4; break; case 3: uw_operand2 = uw_operand2 + 8; break; default : break; } if(uw_operand2 != 2) { return(ERROR); } uw_operand1 = 2; uw_operand2 = 0; switch(uw_operand1) { case 1: uw_operand2 = uw_operand2 + 2; break; case 2: uw_operand2 = uw_operand2 + 4; break; case 3: uw_operand2 = uw_operand2 + 8; break; default : break; } if(uw_operand2 != 4) { return(ERROR); } uw_operand1 = 3; uw_operand2 = 0; switch(uw_operand1) { case 1: uw_operand2 = uw_operand2 + 2; break; case 2: uw_operand2 = uw_operand2 + 4; break; case 3: uw_operand2 = uw_operand2 + 8; break; default : break; } if(uw_operand2 != 8) { return(ERROR); } uw_operand1 = 4; uw_operand2 = 0; switch(uw_operand1) { case 1: uw_operand2 = uw_operand2 + 2; break; case 2: uw_operand2 = uw_operand2 + 4; break; case 3: uw_operand2 = uw_operand2 + 8; break; default : break; } if(uw_operand2 != 0) { return(ERROR); } /**************************与 或 指令******************************/ uw_operand1 = 0; uw_operand2 = 0; if( uw_operand1 && uw_operand2 ) { return(ERROR); } else { //ok } if( uw_operand1 || uw_operand2 ) { return(ERROR); } else { //ok } uw_operand1 = 0; uw_operand2 = 1; if( uw_operand1 && uw_operand2 ) { return(ERROR); } else { //ok } if( uw_operand1 || uw_operand2 ) { //ok } else { return(ERROR); } uw_operand1 = 1; uw_operand2 = 1; if( uw_operand1 && uw_operand2 ) { //ok } else { return(ERROR); } if( uw_operand1 || uw_operand2 ) { //ok } else { return(ERROR); } uw_operand1 = 1; uw_operand2 = 0xFF; if( uw_operand1 && uw_operand2 ) { //ok } else { return(ERROR); } if( uw_operand1 || uw_operand2 ) { //ok } else { return(ERROR); } uw_operand1 = 0; uw_operand2 = 0xFF; if( uw_operand1 && uw_operand2 ) { return(ERROR); } else { //OK } if( uw_operand1 || uw_operand2 ) { //ok } else { return(ERROR); } /**************************异或运算指令******************************/ uw_operand1 = 0x55555555; uw_operand2 = 0x55555555; uw_result = uw_operand1 ^ uw_operand2; if(uw_result != 0x0) { return(ERROR); } uw_operand1 = 0x55555555; uw_operand2 = 0xAAAAAAAA; uw_result = uw_operand1 ^ uw_operand2; if(uw_result != 0xFFFFFFFF) { return(ERROR); } uw_operand1 = 0x00000000; uw_operand2 = 0x00000000; uw_result = uw_operand1 ^ uw_operand2; if(uw_result != 0x00000000) { return(ERROR); } uw_operand1 = 0xFFFFFFFF; uw_operand2 = 0xFFFFFFFF; uw_result = uw_operand1 ^ uw_operand2; if(uw_result != 0x00000000) { return(ERROR); } uw_operand1 = 0x00000000; uw_operand2 = 0xFFFFFFFF; uw_result = uw_operand1 ^ uw_operand2; if(uw_result != 0xFFFFFFFF) { return(ERROR); } /**************************取反运算指令******************************/ uw_operand1 = 0x55555555; uw_result = ~uw_operand1; if(uw_result != 0xAAAAAAAA) { return(ERROR); } uw_result = ~uw_result; if(uw_result != 0x55555555) { return(ERROR); } uw_operand1 = 0x00000000; uw_result = ~uw_operand1; if(uw_result != 0xFFFFFFFF) { return(ERROR); } uw_result = ~uw_result; if(uw_result != 0x00000000) { return(ERROR); } return (SUCCESS); }//STU_InstructAndDecode