• 大小: 53KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-15
  • 语言: C/C++
  • 标签: 汇编器  模拟器  

资源简介

c语言实现简单的汇编器,通过汇编器译码并保存译码结果到文件中,然后通过模拟器来实现对计算机的简单模拟 宾夕法尼亚大学的c语言课设

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#define MAX_LEN 200
#define INSTRS_COUNT (sizeof(g_instrs_name)/sizeof(g_instrs_name[0]))
#define INSTR_SYM {“HLT““JMP““CJMP““OJMP““CALL““RET““PUSH““POP“\
“LOADB““LOADW““STOREB““STOREW““LOADI““NOP““IN““OUT““ADD““ADDI“\
    “SUB““SUBI““MUL““DIV““AND““OR““NOR““NOTB““SAL““SAR““EQU“\
    “LT““LTE““NOTC“}
typedef struct var
{
    char var_name[10];
    int pianyi1;
    int changdu;
    unsigned char *length;
    struct var *next;
}VAR;  //用于表示变量的偏移量,变量的类型,变量所需要的内存大小
typedef struct label
{
    char label_name[10];
    int pianyi2;
    struct label *next;
}LABEL;     //用于表示标号的名字,及标号的地址

VAR *var_head=NULL;
LABEL *label_head=NULL;

const char *g_instrs_name[]=INSTR_SYM;         /*定义存放指令记号的数组*/
const char instr_format[33]=“12222133444451667575777778778881“;/*定义存放指令格式的数组,下标对应指令码,7个数字字符代表七种指令格式*/

int GetInstrCode(const char *op_sym);          /*由指令助记符得到指令代码*/
unsigned long TransToCode(char *instr_lineint instr_num);/*将指令翻译成目标代码,instr_num指令操作码*/
int GetRegNum(char *instr_linechar *reg_name);/*由寄存器名对应到编码*/
void CreatList(VAR**vhdLABEL**lhdFILE*pfIn);/*创建链表*/
int shuzu(char[10]);/*通过含有[]的字符串取出数组的大小*/
int fuzhi1(char s[MAX_LEN]unsigned char *pc);
int fuzhi2(char s[MAX_LEN]unsigned char *pc);/*数组元素赋值*/
LABEL* Findlabel(LABEL*label_hdchar s[20]);
VAR* Findvar(VAR*var_hdchar s[20]);

int main(int argcchar * *argv)
{
    char a_line[MAX_LEN];   //用于存储一行的字符
    char op_sym[8];         //用于存储助记符用于存储变量名字
    int  op_num;            //用于表示助记符对应的操作码
    int ilength_all=0;                  //pianyi用于标记偏移量
    char *pcPos;            //用于保存注释符的位置
    VAR *pv=NULL;
    unsigned long addr=0ul*shuju;
    unsigned char *all;
    FILE *pfIn*pfOut;      //源文件,目标文件

    int n;
    if(argc<3)
    {                               /*检查命令行参数的数目*/
        printf(“ERROR:no enough command line arguments!\n“);
        return 0;
    }
    if((pfIn=fopen(argv[1]“r“))==NULL){      /*打开源代码文件*/
        printf(“ERROR:cannot open file %s for reading!\n“argv[1]);
        return 0;
    }
    if((pfOut=fopen(argv[2]“w“))==NULL){     /*打开目标代码文件*/
        printf(“ERROR:cannot open file %s for writing!\n“argv[2]);
        return 0;
    }
    CreatList(&var_head&label_headpfIn);/*第一次循环处理伪指令和标号,创建链表*/
    pv=(VAR*)malloc(sizeof(VAR));
    pv=var_head;
    pfIn=fopen(argv[1]“r“);
    while(!feof(pfIn))//第二次循环处理指令
    {

        fgets(a_lineMAX_LENpfIn);
        if((pcPos=strchr(a_line‘#‘))!=NULL)
        {
            *pcPos=‘\0‘;
        }
        if((pcPos=strchr(a_line‘\n‘))!=NULL)
        {
            *pcPos=‘\0‘;
        }
        if((pcPos=strstr(a_line“WORD“))!=NULL)
        {
            continue;
        }
        else if((pcPos=strstr(a_line“BYTE“))!=NULL)
        {
            continue;
        }
        else if((pcPos=strchr(a_line‘:‘))!=NULL)
        {
           

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        1041  2014-03-16 21:37  copy.txt
     文件        9733  2014-03-16 21:37  queen.txt
     文件         199  2014-03-30 18:45  readme.txt
     目录           0  2014-03-30 18:41  sas\
     目录           0  2014-03-16 21:37  sas\bin\
     目录           0  2014-03-30 18:41  sas\bin\Debug\
     文件       41970  2014-03-16 21:37  sas\bin\Debug\sas.exe
     文件         168  2014-03-16 21:37  sas\copy.dat
     文件        1041  2014-03-16 21:37  sas\copy.txt
     文件       15429  2014-03-16 21:37  sas\main.c
     目录           0  2014-03-30 18:39  sas\obj\
     目录           0  2014-03-30 18:41  sas\obj\Debug\
     文件       14381  2014-03-30 18:39  sas\obj\Debug\main.o
     文件        9733  2014-03-16 21:37  sas\queen.txt
     文件        1111  2014-03-17 00:34  sas\sas.cbp
     文件         445  2014-03-16 21:40  sas\sas.depend
     文件         321  2014-03-17 00:34  sas\sas.layout
     目录           0  2014-03-30 18:41  ssim\
     目录           0  2014-03-16 21:37  ssim\bin\
     目录           0  2014-03-30 18:41  ssim\bin\Debug\
     文件       37773  2014-03-16 21:37  ssim\bin\Debug\ssim.exe
     文件         360  2014-03-16 21:37  ssim\copy.dat
     文件        8287  2014-03-16 21:37  ssim\main.c
     目录           0  2014-03-16 21:37  ssim\obj\
     目录           0  2014-03-30 18:41  ssim\obj\Debug\
     文件       16666  2014-03-16 21:37  ssim\obj\Debug\main.o
     文件        1872  2014-03-16 21:37  ssim\queen.dat
     文件        1088  2014-03-16 21:37  ssim\ssim.cbp
     文件         428  2014-03-16 21:37  ssim\ssim.depend
     文件         241  2014-03-16 21:37  ssim\ssim.layout

评论

共有 条评论