刚把二元式CPU指令生成程序弄好...
下面是需要编写的二元式CPU指令程序- 完全一比一对应的,- 感觉是编译器里面最蛋疼之一 纯体力活, 今天刚全部优化完成
不同类型之间要转换 然后再套接同类型的运算.. 不然的话...= =
1.传送
------------------------------
CPU寄存器传送:
_ACC = 常量 ok
_R1 = 常量 ok
_R2 = 常量 ok
_R3 = 常量 ok
_ACC = _ACC ok
_R1 = _ACC ok
_R2 = _ACC ok
_R3 = _ACC ok
_RAM = _ACC ok
_ACC = _RAM ok
_R1 = _RAM ok
_R2 = _RAM ok
_R3 = _RAM ok
_C = 常量 ok
_Z = 常量 ok
_BIT0 = 常量 ok
_BIT1 = 常量 ok
_BIT2 = 常量 ok
_BIT3 = 常量 ok
_BIT4 = 常量 ok
_BIT5 = 常量 ok
------------------------------
变量传送:
常量为 常量\立即数\指针常量(XXXX数组)
_ACC = char int16 int32 ok
_R1 = char int16 int32 ok
_R2 = char int16 int32 ok
_R3 = char int16 int32 ok
_ACC = 待修改跳转地址 ok
char = _ACC ok
char = char ok
int16 = 常量 ok
int16 = 无符号ACC ok
int16 = 有符号ACC ok
int16 = int16 int32 ok
int32 = 常量 ok
int32 = _ACC ok
int32 = 有符号ACC ok
int32 = 无符号int16 ok
int32 = 有符号int16 ok
int32 = int32 ok
----------------------------------
变量指针指向内容传送(*p或p[?]):
_ACC = char指针指向内容 ok
int16 = int16指针指向内容 ok
int32 = int32指针指向内容 ok
char指针指向内容 = _ACC ok
int16指针指向内容 = int16 int32 ok
int32指针指向内容 = int32 ok
int16指针指向内容 = 常量 ok
int32指针指向内容 = 常量 ok
----------------------------------
2.加法
----------------------------------
CPU寄存器加法:
ACC = ACC + R1 或 R1 + ACC ok
----------------------------------
变量和变量加法:
ACC = ACC + char 或 char + ACC ok
ACC = char + char ok
char = ACC + char 或 char + ACC ok
char = char + char 或 int16 + int16 或 int32 + int32 ok
int16 = int16 + int16 或 int32 + int32 ok
int32 = int32 + int32 ok
char指针 = char指针 + char/ACC 或 char/ACC + char指针 ok
char指针 = char指针 + int16/int32 或 int16/int32 + char指针 ok
int16指针 = int16指针 + char/ACC 或 char/ACC + int16指针 ok
int16指针 = int16指针 + int16/int32 或 int16/int32 + int16指针 ok
int32指针 = int32指针 + char/ACC 或 char/ACC + int32指针 ok
int32指针 = int32指针 + int16/int32 或 int16/int32 + int32指针 ok
变量和常量加法:
ACC = ACC + 常量 或 常量 + ACC ok
char = ACC + 常量 或 常量 + ACC ok
ACC = char + 常量 或 常量 + char ok
char = char + 常量 或 常量 + char 或 int16 + 常量 或 常量 + int16 或
int32 + 常量 或 常量 + int32 ok
int16 = int16 + 常量 或 常量 + int16 或 int32 + 常量 或 常量 + int32 ok
int32 = int32 + 常量 或 常量 + int32 ok
char指针 = char指针常量 + char/ACC 或 char/ACC + char指针常量 ok
char指针 = char指针常量 + int16/int32 或 int16/int32 + char指针常量 ok
int16指针 = int16指针常量 + char/ACC 或 char/ACC + int16指针常量 ok
int16指针 = int16指针常量 + int16/int32 或 int16/int32 + int16指针常量
ok
int32指针 = int32指针常量 + char/ACC 或 char/ACC + int32指针常量 ok
int32指针 = int32指针常量 + int16/int32 或 int16/int32 + int32指针常量
ok
----------------------------------
3.减法
----------------------------------
CPU寄存器减法:
ACC = ACC - R1 ok
----------------------------------
变量和变量减法:
ACC = ACC - char 或 char - ACC ok
ACC = char - char ok
char = ACC - char 或 char - ACC ok
char = char - char 或 int16 - int16 或 int32 - int32 ok
int16 = int16 - int16 或 int32 - int32 ok
int32 = int32 - int32 ok
char指针 = char指针 - char/ACC ok
char指针 = char指针 - int16/int32 ok
int16指针 = int16指针 - char/ACC ok
int16指针 = int16指针 - int16/int32 ok
int32指针 = int32指针 - char/ACC ok
int32指针 = int32指针 - int16/int32 ok
变量和常量减法:
ACC = ACC - 常量 或 常量 - ACC ok
char = ACC - 常量 或 常量 - ACC ok
ACC = char - 常量 或 常量 - char ok
char = char - 常量 或 常量 - char 或 int16 - 常量 或 常量 - int16 或
int32 - 常量 或 常量 - int32 ok
int16 = int16 - 常量 或 常量 - int16 或 int32 - 常量 或 常量 - int32 ok
int32 = int32 - 常量 或 常量 - int32 ok
char指针 = char指针常量 - char/ACC ok
char指针 = char指针常量 - int16/int32 ok
int16指针 = int16指针常量 - char/ACC ok
int16指针 = int16指针常量 - int16/int32 ok
int32指针 = int32指针常量 - char/ACC ok
int32指针 = int32指针常量 - int16/int32 ok
----------------------------------
4.与
----------------------------------
CPU寄存器与:
ACC = ACC & R1 或 R1 & ACC ok
----------------------------------
变量和变量与:
ACC = ACC & char 或 char & ACC ok
ACC = char & char ok
char = ACC & char 或 char & ACC ok
char = char & char 或 int16 & int16 或 int32 & int32 ok
int16 = int16 & int16 或 int32 & int32 ok
int32 = int32 & int32 ok
变量和常量与:
ACC = ACC & 常量 或 常量 & ACC ok
char = ACC & 常量 或 常量 & ACC ok
ACC = char & 常量 或 常量 & char ok
char = char & 常量 或 常量 & char 或 int16 & 常量 或 常量 & int16 或
int32 & 常量 或 常量 & int32 ok
int16 = int16 & 常量 或 常量 & int16 或 int32 & 常量 或 常量 & int32 ok
int32 = int32 & 常量 或 常量 & int32 ok
----------------------------------
5.或
----------------------------------
CPU寄存器或:
ACC = ACC | R1 或 R1 | ACC ok
----------------------------------
变量和变量或:
ACC = ACC | char 或 char | ACC ok
ACC = char | char ok
char = ACC | char 或 char | ACC ok
char = char | char 或 int16 | int16 或 int32 | int32 ok
int16 = int16 | int16 或 int32 | int32 ok
int32 = int32 | int32 ok
变量和常量或:
ACC = ACC | 常量 或 常量 | ACC ok
char = ACC | 常量 或 常量 | ACC ok
ACC = char | 常量 或 常量 | char ok
char = char | 常量 或 常量 | char 或 int16 | 常量 或 常量 | int16 或
int32 | 常量 或 常量 | int32 ok
int16 = int16 | 常量 或 常量 | int16 或 int32 | 常量 或 常量 | int32 ok
int32 = int32 | 常量 或 常量 | int32 ok
----------------------------------
6.异或
----------------------------------
CPU寄存器异或:
ACC = ACC ^ R1 或 R1 ^ ACC ok
----------------------------------
变量和变量异或:
ACC = ACC ^ char 或 char ^ ACC ok
ACC = char ^ char ok
char = ACC ^ char 或 char ^ ACC ok
char = char ^ char 或 int16 ^ int16 或 int32 ^ int32 ok
int16 = int16 ^ int16 或 int32 ^ int32 ok
int32 = int32 ^ int32 ok
变量和常量异或:
ACC = ACC ^ 常量 或 常量 ^ ACC ok
char = ACC ^ 常量 或 常量 ^ ACC ok
ACC = char ^ 常量 或 常量 ^ char ok
char = char ^ 常量 或 常量 ^ char 或 int16 ^ 常量 或 常量 ^ int16 或
int32 ^ 常量 或 常量 ^ int32 ok
int16 = int16 ^ 常量 或 常量 ^ int16 或 int32 ^ 常量 或 常量 ^ int32 ok
int32 = int32 ^ 常量 或 常量 ^ int32 ok
----------------------------------
7.非
----------------------------------
CPU寄存器非:
ACC = ~ACC ok
----------------------------------
变量非:
char = ~char 或 ~int16 或 ~int32 ok
int16 = ~int16 或 ~int32 ok
int32 = ~int32 ok
----------------------------------
8.乘法
----------------------------------
变量和变量乘法:
ACC = 无符号char * 无符号ACC 或 无符号ACC * 无符号char ok
char = 无符号char * 无符号ACC 或 无符号ACC * 无符号char ok
ACC = 无符号char * 无符号char ok
char = 无符号char * 无符号char ok
int16 = 无符号int16 * 无符号int16 ok
int32 = 无符号int32 * 无符号int32 ok
ACC = 有符号char * 有符号ACC 或 有符号ACC * 有符号char ok
char = 有符号char * 有符号ACC 或 有符号ACC * 有符号char ok
ACC = 有符号char * 有符号char ok
char = 有符号char * 有符号char ok
int16 = 有符号int16 * 有符号int16 ok
int32 = 有符号int32 * 有符号int32 ok
----------------------------------
变量和常量乘法:
ACC = 无符号ACC * 常量 或 常量 * 无符号ACC ok
char = 无符号ACC * 常量 或 常量 * 无符号ACC ok
ACC = 无符号char * 常量 或 常量 * 无符号char ok
char = 无符号char * 常量 或 常量 * 无符号char ok
int16 = 无符号int16 * 常量 或 常量 * 无符号int16 ok
int32 = 无符号int32 * 常量 或 常量 * 无符号int32 ok
ACC = 有符号ACC * 常量 或 常量 * 有符号ACC ok
char = 有符号ACC * 常量 或 常量 * 有符号ACC ok
ACC = 有符号char * 常量 或 常量 * 有符号char ok
char = 有符号char * 常量 或 常量 * 有符号char ok
int16 = 有符号int16 * 常量 或 常量 * 有符号int16 ok
int32 = 有符号int32 * 常量 或 常量 * 有符号int32 ok
----------------------------------
9.除法
----------------------------------
变量和变量除法:
ACC = 无符号char / 无符号ACC 或 无符号ACC / 无符号char ok
char = 无符号char / 无符号ACC 或 无符号ACC / 无符号char ok
ACC = 无符号char / 无符号char ok
char = 无符号char / 无符号char ok
int16 = 无符号int16 / 无符号int16 ok
int32 = 无符号int32 / 无符号int32 ok
ACC = 有符号char / 有符号ACC 或 有符号ACC / 有符号char ok
char = 有符号char / 有符号ACC 或 有符号ACC / 有符号char ok
ACC = 有符号char / 有符号char ok
char = 有符号char / 有符号char ok
int16 = 有符号int16 / 有符号int16 ok
int32 = 有符号int32 / 有符号int32 ok
----------------------------------
变量和常量除法:
ACC = 无符号ACC / 常量 或 常量 / 无符号ACC ok
char = 无符号ACC / 常量 或 常量 / 无符号ACC ok
ACC = 无符号char / 常量 或 常量 / 无符号char ok
char = 无符号char / 常量 或 常量 / 无符号char ok
int16 = 无符号int16 / 常量 或 常量 / 无符号int16 ok
int32 = 无符号int32 / 常量 或 常量 / 无符号int32 ok
ACC = 有符号ACC / 常量 或 常量 / 有符号ACC ok
char = 有符号ACC / 常量 或 常量 / 有符号ACC ok
ACC = 有符号char / 常量 或 常量 / 有符号char ok
char = 有符号char / 常量 或 常量 / 有符号char ok
int16 = 有符号int16 / 常量 或 常量 / 有符号int16 ok
int32 = 有符号int32 / 常量 或 常量 / 有符号int32 ok
----------------------------------
10.取余
----------------------------------
变量和变量取余:
ACC = 无符号char % 无符号ACC 或 无符号ACC % 无符号char ok
char = 无符号char % 无符号ACC 或 无符号ACC % 无符号char ok
ACC = 无符号char % 无符号char ok
char = 无符号char % 无符号char ok
int16 = 无符号int16 % 无符号int16 ok
int32 = 无符号int32 % 无符号int32 ok
ACC = 有符号char % 有符号ACC 或 有符号ACC % 有符号char ok
char = 有符号char % 有符号ACC 或 有符号ACC % 有符号char ok
ACC = 有符号char % 有符号char ok
char = 有符号char % 有符号char ok
int16 = 有符号int16 % 有符号int16 ok
int32 = 有符号int32 % 有符号int32 ok
----------------------------------
变量和常量取余:
ACC = 无符号ACC % 常量 或 常量 % 无符号ACC ok
char = 无符号ACC % 常量 或 常量 % 无符号ACC ok
ACC = 无符号char % 常量 或 常量 % 无符号char ok
char = 无符号char % 常量 或 常量 % 无符号char ok
int16 = 无符号int16 % 常量 或 常量 % 无符号int16 ok
int32 = 无符号int32 % 常量 或 常量 % 无符号int32 ok
ACC = 有符号ACC % 常量 或 常量 % 有符号ACC ok
char = 有符号ACC % 常量 或 常量 % 有符号ACC ok
ACC = 有符号char % 常量 或 常量 % 有符号char ok
char = 有符号char % 常量 或 常量 % 有符号char ok
int16 = 有符号int16 % 常量 或 常量 % 有符号int16 ok
int32 = 有符号int32 % 常量 或 常量 % 有符号int32 ok
----------------------------------
11.左右移位
----------------------------------
变量被移数和变量移数左右移位:
char = char << ACC/char/int16/int32 ok
int16 = int16 << ACC/char/int16/int32 ok
int32 = int32 << ACC/char/int16/int32 ok
char = 无符号char >> ACC/char/int16/int32 ok
int16 = 无符号int16 >> ACC/char/int16/int32 ok
int32 = 无符号int32 >> ACC/char/int16/int32 ok
char = 有符号char >> ACC/char/int16/int32 ok
int16 = 有符号int16 >> ACC/char/int16/int32 ok
int32 = 有符号int32 >> ACC/char/int16/int32 ok
----------------------------------
变量被移数和常量移数左右移位:
char = char << 常量 ok
int16 = int16 << 常量 ok
int32 = int32 << 常量 ok
char = 无符号char >> 常量 ok
int16 = 无符号int16 >> 常量 ok
int32 = 无符号int32 >> 常量 ok
char = 有符号char >> 常量 ok
int16 = 有符号int16 >> 常量 ok
int32 = 有符号int32 >> 常量 ok
----------------------------------
12.关系运算(生成待修改出口地址的条件跳转指令)
----------------------------------
变量和变量关系运算:
待修改跳转地址 = 无符号char > 无符号ACC 或 无符号ACC > 无符号char ok
待修改跳转地址 = 无符号char < 无符号ACC 或 无符号ACC < 无符号char ok
待修改跳转地址 = 无符号char == 无符号ACC 或 无符号ACC == 无符号char ok
待修改跳转地址 = 无符号char != 无符号ACC 或 无符号ACC != 无符号char ok
待修改跳转地址 = 无符号char >= 无符号ACC 或 无符号ACC >= 无符号char ok
待修改跳转地址 = 无符号char <= 无符号ACC 或 无符号ACC <= 无符号char ok
待修改跳转地址 = 无符号char > 无符号char ok
待修改跳转地址 = 无符号char < 无符号char ok
待修改跳转地址 = 无符号char == 无符号char ok
待修改跳转地址 = 无符号char != 无符号char ok
待修改跳转地址 = 无符号char >= 无符号char ok
待修改跳转地址 = 无符号char <= 无符号char ok
待修改跳转地址 = 无符号int16 > 无符号int16 ok
待修改跳转地址 = 无符号int16 < 无符号int16 ok
待修改跳转地址 = 无符号int16 == 无符号int16 ok
待修改跳转地址 = 无符号int16 != 无符号int16 ok
待修改跳转地址 = 无符号int16 >= 无符号int16 ok
待修改跳转地址 = 无符号int16 <= 无符号int16 ok
待修改跳转地址 = 无符号int32 > 无符号int32 ok
待修改跳转地址 = 无符号int32 < 无符号int32 ok
待修改跳转地址 = 无符号int32 == 无符号int32 ok
待修改跳转地址 = 无符号int32 != 无符号int32 ok
待修改跳转地址 = 无符号int32 >= 无符号int32 ok
待修改跳转地址 = 无符号int32 <= 无符号int32 ok
待修改跳转地址 = 有符号char > 有符号ACC 或 有符号ACC > 有符号char ok
待修改跳转地址 = 有符号char < 有符号ACC 或 有符号ACC < 有符号char ok
待修改跳转地址 = 有符号char == 有符号ACC 或 有符号ACC == 有符号char ok
待修改跳转地址 = 有符号char != 有符号ACC 或 有符号ACC != 有符号char ok
待修改跳转地址 = 有符号char >= 有符号ACC 或 有符号ACC >= 有符号char ok
待修改跳转地址 = 有符号char <= 有符号ACC 或 有符号ACC <= 有符号char ok
待修改跳转地址 = 有符号char > 有符号char ok
待修改跳转地址 = 有符号char < 有符号char ok
待修改跳转地址 = 有符号char == 有符号char ok
待修改跳转地址 = 有符号char != 有符号char ok
待修改跳转地址 = 有符号char >= 有符号char ok
待修改跳转地址 = 有符号char <= 有符号char ok
待修改跳转地址 = 有符号int16 > 有符号int16 ok
待修改跳转地址 = 有符号int16 < 有符号int16 ok
待修改跳转地址 = 有符号int16 == 有符号int16 ok
待修改跳转地址 = 有符号int16 != 有符号int16 ok
待修改跳转地址 = 有符号int16 >= 有符号int16 ok
待修改跳转地址 = 有符号int16 <= 有符号int16 ok
待修改跳转地址 = 有符号int32 > 有符号int32 ok
待修改跳转地址 = 有符号int32 < 有符号int32 ok
待修改跳转地址 = 有符号int32 == 有符号int32 ok
待修改跳转地址 = 有符号int32 != 有符号int32 ok
待修改跳转地址 = 有符号int32 >= 有符号int32 ok
待修改跳转地址 = 有符号int32 <= 有符号int32 ok
---------------------------------------------------------
变量和常量关系运算:
待修改跳转地址 = _C == 0 ok
待修改跳转地址 = _C == 1 ok
待修改跳转地址 = _Z == 0 ok
待修改跳转地址 = _Z == 1 ok
待修改跳转地址 = _A == 0 ok
待修改跳转地址 = _A == 1 ok
待修改跳转地址 = _C != 0 ok
待修改跳转地址 = _C != 1 ok
待修改跳转地址 = _Z != 0 ok
待修改跳转地址 = _Z != 1 ok
待修改跳转地址 = _A != 0 ok
待修改跳转地址 = _A != 1 ok
待修改跳转地址 = 无符号ACC > 常量 或 常量 > 无符号ACC ok
待修改跳转地址 = 无符号ACC < 常量 或 常量 < 无符号ACC ok
待修改跳转地址 = 无符号ACC == 常量 或 常量 == 无符号ACC ok
待修改跳转地址 = 无符号ACC != 常量 或 常量 != 无符号ACC ok
待修改跳转地址 = 无符号ACC >= 常量 或 常量 >= 无符号ACC ok
待修改跳转地址 = 无符号ACC <= 常量 或 常量 <= 无符号ACC ok
待修改跳转地址 = 无符号char > 常量 或 常量 > 无符号char ok
待修改跳转地址 = 无符号char < 常量 或 常量 < 无符号char ok
待修改跳转地址 = 无符号char == 常量 或 常量 == 无符号char ok
待修改跳转地址 = 无符号char != 常量 或 常量 != 无符号char ok
待修改跳转地址 = 无符号char >= 常量 或 常量 >= 无符号char ok
待修改跳转地址 = 无符号char <= 常量 或 常量 <= 无符号char ok
待修改跳转地址 = 无符号int16 > 常量 或 常量 > 无符号int16 ok
待修改跳转地址 = 无符号int16 < 常量 或 常量 < 无符号int16 ok
待修改跳转地址 = 无符号int16 == 常量 或 常量 == 无符号int16 ok
待修改跳转地址 = 无符号int16 != 常量 或 常量 != 无符号int16 ok
待修改跳转地址 = 无符号int16 >= 常量 或 常量 >= 无符号int16 ok
待修改跳转地址 = 无符号int16 <= 常量 或 常量 <= 无符号int16 ok
待修改跳转地址 = 无符号int32 > 常量 或 常量 > 无符号int32 ok
待修改跳转地址 = 无符号int32 < 常量 或 常量 < 无符号int32 ok
待修改跳转地址 = 无符号int32 == 常量 或 常量 == 无符号int32 ok
待修改跳转地址 = 无符号int32 != 常量 或 常量 != 无符号int32 ok
待修改跳转地址 = 无符号int32 >= 常量 或 常量 >= 无符号int32 ok
待修改跳转地址 = 无符号int32 <= 常量 或 常量 <= 无符号int32 ok
待修改跳转地址 = 有符号ACC > 常量 或 常量 > 有符号ACC ok
待修改跳转地址 = 有符号ACC < 常量 或 常量 < 有符号ACC ok
待修改跳转地址 = 有符号ACC == 常量 或 常量 == 有符号ACC ok
待修改跳转地址 = 有符号ACC != 常量 或 常量 != 有符号ACC ok
待修改跳转地址 = 有符号ACC >= 常量 或 常量 >= 有符号ACC ok
待修改跳转地址 = 有符号ACC <= 常量 或 常量 <= 有符号ACC ok
待修改跳转地址 = 有符号char > 常量 或 常量 > 有符号char ok
待修改跳转地址 = 有符号char < 常量 或 常量 < 有符号char ok
待修改跳转地址 = 有符号char == 常量 或 常量 == 有符号char ok
待修改跳转地址 = 有符号char != 常量 或 常量 != 有符号char ok
待修改跳转地址 = 有符号char >= 常量 或 常量 >= 有符号char ok
待修改跳转地址 = 有符号char <= 常量 或 常量 <= 有符号char ok
待修改跳转地址 = 有符号int16 > 常量 或 常量 > 有符号int16 ok
待修改跳转地址 = 有符号int16 < 常量 或 常量 < 有符号int16 ok
待修改跳转地址 = 有符号int16 == 常量 或 常量 == 有符号int16 ok
待修改跳转地址 = 有符号int16 != 常量 或 常量 != 有符号int16 ok
待修改跳转地址 = 有符号int16 >= 常量 或 常量 >= 有符号int16 ok
待修改跳转地址 = 有符号int16 <= 常量 或 常量 <= 有符号int16 ok
待修改跳转地址 = 有符号int32 > 常量 或 常量 > 有符号int32 ok
待修改跳转地址 = 有符号int32 < 常量 或 常量 < 有符号int32 ok
待修改跳转地址 = 有符号int32 == 常量 或 常量 == 有符号int32 ok
待修改跳转地址 = 有符号int32 != 常量 或 常量 != 有符号int32 ok
待修改跳转地址 = 有符号int32 >= 常量 或 常量 >= 有符号int32 ok
待修改跳转地址 = 有符号int32 <= 常量 或 常量 <= 有符号int32 ok