📄 wasm.cpp
字号:
{
err = numEncode(param.op1, &ins.op1, symbols);
if(err) return err;
imm = true;
}
else imm = false;
if(imm) //立即数
{
ins.op1 = ins.op1 - ipn; //取偏移量
if(ins.op1 & 0x3) return ADDRESS_NOT_ALIGN;
ins.op1 = (long)ins.op1 >> 2;
if(ins.op1 & 0xfc000000 && ~ins.op1 & 0xfe000000)
return IMM_OUT_OF_RANGE;
dwIns = ((ins.code|0x10)<<(32-6)) + (ins.op1 & 0x3ffffff);
}
else //寄存器
{
dwIns = (ins.code<<(32-6)) + (ins.op1<<(32-6-5-5-5));
}
}
else if(ins.type == JU) //sys->user
{
err = regEncode(param.op1, &ins.op1);
if(err) return err;
ins.op2 = 0x10;
dwIns = (ins.code<<(32-6)) + (ins.op2<<(32-6-5)) + (ins.op1<<(32-6-5-5-5));
}
else if(ins.type == IRET) //中断返回
{
ins.op1 = 0x08;
dwIns = (ins.code<<(32-6)) + (ins.op1<<(32-6-5));
}
else if(ins.type == INT) //中断, INT n
{
err = numEncode(param.op1, &ins.op1, symbols);
if(err) return err;
if(ins.op1 & 0xffffff00) //n<256
return IMM_OUT_OF_RANGE;
ins.op2 = 0x04;
dwIns = (ins.code<<(32-6)) + (ins.op2<<(32-6-5)) + (ins.op1 & 0xff);
}
else if(ins.type == STR) //STORE、LOAD、立即数加载
{
if(!stricmp(param.code, "STR"))
{
err = regEncode(param.op1, &ins.op1);
if(err) return err;
err = regEncode(param.op2, &ins.op2);
if(err) return err;
dwIns = (ins.code<<(32-6)) + (ins.op1<<(32-6-5-5)) + (ins.op2<<(32-6-5-5-5));
}
if(!stricmp(param.code, "LDR"))
{
err = regEncode(param.op1, &ins.op1);
if(err) return err;
err = regEncode(param.op2, &ins.op2);
if(err) return err;
dwIns = (ins.code<<(32-6)) + (ins.op1<<(32-6-5)) + (ins.op2<<(32-6-5-5-5));
}
if(!stricmp(param.code, "LDA")) //16位立即数装载
{
err = regEncode(param.op1, &ins.op1);
if(err) return err;
err = numEncode(param.op2, &ins.op2, symbols);
if(err) return err;
ins.op2 = ins.op2 & 0xffff; //取低16位
dwIns = (ins.code<<(32-6)) + (ins.op1<<(32-6-5)) + (ins.op1<<(32-6-5-5))
+ ins.op2; //R1 = R2
}
if(!stricmp(param.code, "LDA32")) //移位并装载16位立即数
{
err = regEncode(param.op1, &ins.op1);
if(err) return err;
err = numEncode(param.op2, &ins.op2, symbols);
if(err) return err;
ins.op2 = ins.op2 & 0xffff; //取低16位
dwIns = (ins.code<<(32-6)) + (ins.op1<<(32-6-5)) + (ins.op1<<(32-6-5-5))
+ ins.op2; //R1 = R2
}
}
pOut->write((char*)&dwIns, 4);
ipn += 4; //程序指针
}
return 0; //成功
}
int getParam(char *str, Param *pParam)
{
char string[1024];
strcpy(string, str);
char *e;
e = strchr(string, ';'); //去除分号之后的注释
if(e) *e = 0;
int counter = 0;
char *seps = " ,\t"; //分隔符
char *tok;
tok = strtok(string, seps);
while(tok && counter<4) //取出各参数字串
{
switch(counter)
{
case 0:
strcpy(pParam->code,tok);
break;
case 1:
strcpy(pParam->op1,tok);
break;
case 2:
strcpy(pParam->op2,tok);
break;
case 3:
strcpy(pParam->op3,tok);
break;
}
++counter;
tok = strtok(NULL,seps);
}
pParam->ops = counter-1; //操作数数目
if( tok && counter==4 ) //参数太多
{
return BAD_FORMAT;
}
if(counter == 0) //空行
{
pParam->type = EMPTY;
return 0;
}
e = pParam->code + strlen(pParam->code)-1;
if( *e==':' ) //标号
{
pParam->type = LABEL;
*e = 0;
if(pParam->ops>0) return BAD_FORMAT; //参数太多
return 0;
}
if(!stricmp(pParam->code, "DD"))
{
pParam->type = DATA; //数据
if(pParam->ops!=1) return BAD_FORMAT; //参数太多
return 0;
}
int nBytes;
if(nBytes = isMacro(pParam->code)) //伪指令
{
pParam->type = MACRO;
pParam->ops = nBytes; //指令总长
return 0;
}
pParam->type = NORMAL;
return 0;
}
int insEncode(char *str, unsigned long *pCode, int *type)
{
if(!stricmp(str,"INIT"))
{
*pCode = 0x00;
*type = MACRO;
return 0;
}
if(!stricmp(str,"NOP"))
{
*pCode = 0x00;
*type = NOP;
return 0;
}
if(!stricmp(str,"MUL"))
{
*pCode = 0x0f;
*type = MUL;
return 0;
}
if(!stricmp(str,"ADD"))
{
*pCode = 0x20;
*type = ADD;
return 0;
}
if(!stricmp(str,"SUB"))
{
*pCode = 0x21;
*type = ADD;
return 0;
}
if(!stricmp(str,"AND"))
{
*pCode = 0x28;
*type = ADD;
return 0;
}
if(!stricmp(str,"OR"))
{
*pCode = 0x29;
*type = ADD;
return 0;
}
if(!stricmp(str,"XOR"))
{
*pCode = 0x2a;
*type = ADD;
return 0;
}
if(!stricmp(str,"NOT"))
{
*pCode = 0x2b;
*type = NOT;
return 0;
}
if(!stricmp(str,"SHL"))
{
*pCode = 0x2c;
*type = ADD;
return 0;
}
if(!stricmp(str,"SHR"))
{
*pCode = 0x2d;
*type = ADD;
return 0;
}
if(!stricmp(str,"ASR"))
{
*pCode = 0x2e;
*type = ADD;
return 0;
}
if(!stricmp(str,"ROR"))
{
*pCode = 0x2f;
*type = ADD;
return 0;
}
if(!stricmp(str,"CMP"))
{
*pCode = 0x01;
*type = CMP;
return 0;
}
if(!stricmp(str,"TST"))
{
*pCode = 0x08;
*type = CMP;
return 0;
}
if(!stricmp(str,"LDR"))
{
*pCode = 0x0a;
*type = STR;
return 0;
}
if(!stricmp(str,"STR"))
{
*pCode = 0x0b;
*type = STR;
return 0;
}
if(!stricmp(str,"LDA"))
{
*pCode = 0x1c;
*type = STR;
return 0;
}
if(!stricmp(str,"LDA32"))
{
*pCode = 0x1d;
*type = STR;
return 0;
}
if(!stricmp(str,"JMP"))
{
*pCode = 0x02;
*type = JMP;
return 0;
}
if(!stricmp(str,"JU"))
{
*pCode = 0x02;
*type = JU;
return 0;
}
if(!stricmp(str,"INT"))
{
*pCode = 0x02;
*type = INT;
return 0;
}
if(!stricmp(str,"IRET"))
{
*pCode = 0x02;
*type = IRET;
return 0;
}
if(!stricmp(str,"JEQ"))
{
*pCode = 0x03;
*type = JMP;
return 0;
}
if(!stricmp(str,"JNE"))
{
*pCode = 0x04;
*type = JMP;
return 0;
}
if(!stricmp(str,"JHE"))
{
*pCode = 0x05;
*type = JMP;
return 0;
}
if(!stricmp(str,"JLO"))
{
*pCode = 0x06;
*type = JMP;
return 0;
}
if(!stricmp(str,"JGE"))
{
*pCode = 0x07;
*type = JMP;
return 0;
}
if(!stricmp(str,"JLT"))
{
*pCode = 0x09;
*type = JMP;
return 0;
}
if(!stricmp(str,"MOV"))
{
*pCode = 0x0e;
*type = MOV;
return 0;
}
*pCode = 0; //没有命中
*type = UNDEFINED;
return UNDEFINED_INSTRUCTION;
}
int regEncode(char *str, unsigned long *pCode)
{
if(*str!='r' && *str!='R') return UNDEFINED_REGISTER;
int num;
num = atoi(str+1);
if(num<0 || num>31) return UNDEFINED_REGISTER;
*pCode = num;
return 0;
}
int numEncode(char *str, unsigned long *value, list<Symbol> &symbols)
{
if(*str>='0' && *str<='9' || *str == '-')
{
*value = strtol(str,0,0);
return 0;
}
else
{
list<Symbol>::iterator it;
for(it=symbols.begin(); it!=symbols.end(); ++it)
{
if(!stricmp(str,it->name))
{
*value = it->value;
return 0;
}
}
}
return UNDEFINED_SYMBOL;
}
int isMacro(char *str)
{
if(!stricmp(str,"INIT")) //载入32位立即数
{
return 8;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -