回复 20楼 TonyDeng
。。。。。。。。。。越听越迷糊。。
我想问。。。
是不是跟平时写程序那样。。。然后
#include <stdio>
mian()
{
判定字符的2进制8位码..前四位如果为0001
就定义0001为复制..然后第5位又给他个意思然后后3位100为r1 010为r2 001为r3那样子。。。。.
}
我没接触过这种东西阿.完全不知道什么东西来的阿....
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 程序结束
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; }明天再写了