最简单的汇编器的javascript版本
根据 最简单的汇编器与反汇编器的设计文档的内容,开发了最简单的汇编器的javascript版本,在网络上的演示结果如下图所示:
解析汇编指令与生成机器语言代码的javascript的主要代码如下所示:
var instruction_arr=['halt','nop','rrmovl','cmovle','cmovl','cmove','cmovne','cmovge','cmovg','irmovl','rmmovl','mrmovl','addl','subl','andl','xorl','jmp','jle','jl','je','jne','jge','jg','call','ret','pushl','popl'];
var machine_code=[0,10,20,21,22,23,24,25,26,30,40,50,60,61,62,63,70,71,72,73,74,75,76,80,90,'A0','B0'];
var byte_length_arr=[1,1,2,2,2,2,2,2,2,6,6,6,2,2,2,2,5,5,5,5,5,5,5,5,1,2,2];
var token_length_arr=[1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,1,2,2];
var register_name_arr=['%eax','%ecx','%edx','%ebx','%esp','%ebp','%esi','%edi','No register'];
var register_number_arr=[0,1,2,3,4,5,6,7,'F'];
function move()
{
var str=document.getElementById("txt1").innerText;
var index=get_quwei_code_from_wubi_code(str);//api_get_token(str);//
document.getElementById("txt2").innerText=index;
//machine_code[index]+" token="+token_length_arr[index]+" byte="+byte_length_arr[index];
}
// 输入第一行: jmp loop
// 输入第二行: addl %ebc,%ecx
// 输出是一个二维数组: [['jmp','loop'],['addl','%ebx','%ecx']]
// 分隔符包括空格,逗号,换行符
function api_get_token(str)
{
var result=[];
var b=get_line_content(str);
// tempstr='';
for (var j=0;j<b.length;j++)
{
var c=get_token(b[j].str);
var temp=[];
for (var k=0;k<c.length;k++)
{
temp.push(c[k].str);
}
result.push(temp);
}
return result;
}
function get_quwei_code_from_wubi_code(str)
{
var arr=api_get_token(str);
var tempstr='';
for (var j=0;j<arr.length;j++)
{
tempstr=tempstr+get_machine_code_for_per_line(arr[j]);
}
return tempstr;
}
function get_machine_code_for_per_line(arr)
{
var result_code=0;
var index=com_redboy_editor_lib_list.get_index_from_array(instruction_arr,arr[0]);
if (token_length_arr[index]==1&&byte_length_arr[index]==1)
{ result_code=machine_code[index];
}
else if (token_length_arr[index]==3&&byte_length_arr[index]==2)
{
var index1=com_redboy_editor_lib_list.get_index_from_array(register_name_arr,arr[1]);
var index2=com_redboy_editor_lib_list.get_index_from_array(register_name_arr,arr[2]);
result_code=machine_code[index]+""+index1+index2;
}
else if (token_length_arr[index]==2&&byte_length_arr[index]==2)
{
var index1=com_redboy_editor_lib_list.get_index_from_array(register_name_arr,arr[1]);
result_code=machine_code[index]+""+index1+'F';
}
else if (token_length_arr[index]==2&&byte_length_arr[index]==5)
{
var index1='00000000'
result_code=machine_code[index]+""+index1;
}
else if (token_length_arr[index]==3&&byte_length_arr[index]==6)
{
result_code=machine_code[index]+"";
if(result_code==30)
{
var index2=com_redboy_editor_lib_list.get_index_from_array(register_name_arr,arr[2]);
result_code=machine_code[index]+"F"+index2+arr[1].substring(1,arr[1].length);
}
else if (result_code==40)
{
var register_name=arr[2].substring(arr[2].indexOf("(")+1,arr[2].indexOf(")"));
var d=arr[2].substring(0,arr[2].indexOf("("));
var index1=com_redboy_editor_lib_list.get_index_from_array(register_name_arr,arr[1]);
var index2=com_redboy_editor_lib_list.get_index_from_array(register_name_arr,register_name);
result_code=machine_code[index]+""+index1+index2+d;
}
else if (result_code==50)
{
var register_name=arr[1].substring(arr[1].indexOf("(")+1,arr[1].indexOf(")"));
var d=arr[1].substring(0,arr[1].indexOf("("));
var index1=com_redboy_editor_lib_list.get_index_from_array(register_name_arr,arr[2]);
var index2=com_redboy_editor_lib_list.get_index_from_array(register_name_arr,register_name);
result_code=machine_code[index]+""+index1+index2+d;
}
}
return result_code;
}