private void I()
{
string word = get_word();
WORDTYPE w_type;
//printf("got word %s\n\n",word);
w_type = get_word_type(word);
if (w_type == WORDTYPE.LABEL)
{
//do something...
#if debug
Debug("got label :" + word + '\n');
#endif
//push_convert(word);
skip_space();
if (cur_token != ':')
error("指令不完整,期望分号':'");
// push_convert(":");
string upper_word = word.ToUpper();
if (extern_symbol_tmp.ContainsKey(upper_word))
error(string.Format("标记{0}已被声明为Extern,不能被定义", word));
if (dataTable.Contains(upper_word) == true)
error(string.Format("符号{0}已经在data段声明过,不能重复!", word));
if (textTable.Contains(upper_word))
error(string.Format("标记{0}出现重定义", word));
else
textTable.Add(upper_word);
if (global_symbol_tmp.ContainsKey(upper_word))
{
global_symbol_tmp.Remove(upper_word);
}
//把标记从等待确认标记是否存在的列表出去除
remove_from_wait(upper_word);
format_line.Append(AppendSpace(upper_word + " :"));
get_src_token();
skip_space();
word = get_word();
w_type = get_word_type(word);
if (w_type == WORDTYPE.LABEL)
error("不能识别的指令操作符\'" + word + '\'');
}
else
{
format_line.Append(AppendSpace());
}
//得到操作码在表KEYWORDS中的具体索引,
//该索引会记录到DLXObject中,linker阶段通过索引
//进行表驱动
format_line.Append(AppendSpace(word.ToUpper(), SPACENUM2));
switch (w_type)
{
case WORDTYPE.ALR://I-类型算术/逻辑运算
I_ALR(word);
break;
case WORDTYPE.ALI://R-类型算术/逻辑运算
I_ALI(word);
break;
case WORDTYPE.LHI://LHI指令
I_LHI(word);
break;
case WORDTYPE.LOAD ://数据传送加载指令
I_LOAD(word);
break;
case WORDTYPE.STORE ://数据传送储存指令
I_STORE(word);
break;
case WORDTYPE.CB://条件分支
I_CB(word);
break;
case WORDTYPE.JMPI://使用立即数的跳,包括J和JAL
I_JMPI(word);
break;
case WORDTYPE.TRAP://TRAP指令
I_TRAP(word);
break;
case WORDTYPE.JMPR://使用寄存器的跳,包括JR和JALR
I_JMPR(word);
break;
case WORDTYPE.RFE:
I_RFE(word);
break;
case WORDTYPE.RET://从跳转(函数)返回 ,等价于JR R31
I_RET(word);
break;
default:
error("不能识别的指令码" + word);
break;
}
//push_convert("\n");
}