签到

05月06日
尚未签到

共有回帖数 0

    做月子

    等级:
    #includestdio.h
    #includeconio.h
    #includestring.h

    void open (void);//打开文件O
    void read (void);//读取十六进制数O
    void Operation (void);//中枢处理
    void Bin (void);//将字节断成三份O
    //高位
    void Teshu (void);//特殊
    void Or (void);//或
    void And (void);//与
    void Cmp (void);//比较大小
    void Sub (void);//减法
    void Add (void);//加法
    void Mov (void);//移动
    //目标
    void AX1 (void);//AX寄存器
    void BX1 (void);//BX寄存器
    void CX1 (void);//CX寄存器
    void DX1 (void);//DX寄存器
    void OperateNumber (void);//操作数字指令
    void Tiaozhuan (void);//跳转
    void Not (void);//否
    void Illegal (void);//非法
    //源
    void AX2 (void); //源AX寄存器
    void BX2 (void); //源BX寄存器
    void CX2 (void); //源CX寄存器
    void DX2 (void); //源DX寄存器
    void BXBX (void); //间接BX寄存器
    void Con (void); //立即数
    //特殊指令
    void Mul (void);//AX与BX相乘高位放在CX低位放在DX
    void Div (void);
    void Ret (void);
    void Mov2 (void);//将寄存器AX值给间接BX
    void Get (void);//得到P0端口
    void Put (void);//输出P0端口
    void Put2 (void);//输出P1端口
    //跳转指令(第三份)
    void Je (void);//等于跳转
    void Jne (void);//不等于跳转
    void Jb (void);//小于跳转
    void Jbe (void);//小于等于跳转
    void Ja (void);//大于跳转
    void Jae (void);//大于等于跳转
    void Jmp (void);//无条件跳转
    //其他
    void Push (void);
    void Pop (void);
    void Call (void);

    #define DAXIAO 10000
    unsigned short int AX=0,BX=0,CX=0,DX=0,X,X2,DAXIAO2,iPC=0,iPC2;
    int iI,iR,iM;
    int iKey=0,Con2=0;
    unsigned char P0,P1;
    unsigned char A[DAXIAO],cI,cR,cM,Status;
    FILE *fpA;

    main()
    {
        int i;
        open();
        read();
        fseek(fpA,0,SEEK_END);
        DAXIAO2=ftell(fpA);
        DAXIAO2=(DAXIAO2-2)/3+1;
        printf("文件大小为:%dn",DAXIAO2);
        for(i=0;iDAXIAO2;i++)
        {
            printf("%x ",A);
        }
        printf("输入停止iPC值:");
        scanf("%d",&iPC2);
        fflush(stdin);
        while(iPC2DAXIAO2)
        {
            printf("超过最大值没有这条语句");
            printf("输入新停止iPC值:");
            scanf("%d",&iPC2);
            fflush(stdin);
        }
        Operation();
        printf("n运行结束寄存器AX=%x,BX=%x,CX=%x,SP=%xn端口P0=%x,P1=%x",AX,BX,CX,DX,P0,P1);
        return 0;
    }

    void open (void)
    {
        fpA=fopen("1.txt","r");
        if(fpA==0){printf("nCan not open it!");}
        return;
    }

    void read (void)
    {
        int i;
        for(i=0;iDAXIAO;i++){fscanf(fpA,"%x",&A);}
        return;
    }

    void Bin (void)
    {
        unsigned char I[DAXIAO],R[DAXIAO],M[DAXIAO];

        I[iPC]=A[iPC];
        R[iPC]=A[iPC];
        M[iPC]=A[iPC];
        I[iPC]=I[iPC]5;
        iI=(int)I[iPC];
        R[iPC]=R[iPC]3;
        R[iPC]=R[iPC]6;
        iR=(int)R[iPC];
        M[iPC]=M[iPC]5;
        iM=(int)M[iPC];
        printf("n这句是:%x",A[iPC]);
        printf("niI=%x,iR=%x,iM=%x,iPC=%dn",iI,iR,iM,iPC);
        iPC++;
        return ;
    }

    void Operation (void)
    {
        while(iPCDAXIAO2)
        {
            Bin();
            if(iPC==iPC2+1)
            {
                printf("n到达指定位置iPC=%dn当前寄存器情况如下nAX=%x,BX=%x,CX=%x,SP=%x",iPC2,AX,BX,CX,DX);
                getch();
            }
            if(iI==0x0){Teshu();}
            else if(iI==0x3){Cmp();}
            else if(iI==0x4){Sub();}
            else if(iI==0x5){Add();}
            else if(iI==0x6){Mov();}
            else {printf("非法指令%d",iPC-1);}
            printf("当前寄存器如下nAX=%x,BX=%x,CX=%x,SP=%xn状态寄存器:%dn端口:P0=%x,P1=%x",AX,BX,CX,DX,Status,P0,P1);
        }
        return;
    }
    //高位
    void Teshu (void)
    {
        if(iR==0x0){OperateNumber();}
        if(iR==0x40){Tiaozhuan();}
        if(iR==0x80){if(iM==0x0){Push();}if(iM==0x20){Pop();}}
        return;
    }
    void Or (void)
    {
        return;
    }
    void And (void)
    {
        return;
    }
    void Cmp (void)
    {
        if(iR==0x0){AX1();}
        if(iR==0x40){BX1();}
        if(iR==0x80){CX1();}
        if(iR==0xc0){DX1();}
        if(X==1&&X2==1){Status=0x1;}
        else if(X==1&&X2==2){if(AXBX){Status=0x2;}else if(AX==BX){Status=0x1;}else{Status=0x0;}}


        else if(X==1&&X2==3){if(AXCX){Status=0x2;}else if(AX==CX){Status=0x1;}else{Status=0x0;}}
        else if(X==1&&X2==4){if(AXDX){Status=0x2;}else if(AX==DX){Status=0x1;}else{Status=0x0;}}
        else if(X==2&&X2==1){if(BXAX){Status=0x2;}else if(BX==AX){Status=0x1;}else{Status=0x0;}}
        else if(X==2&&X2==2){Status=0x1;}
        else if(X==2&&X2==3){if(BXCX){Status=0x2;}else if(BX==CX){Status=0x1;}else{Status=0x0;}}
        else if(X==2&&X2==4){if(BXDX){Status=0x2;}else if(BX==DX){Status=0x1;}else{Status=0x0;}}
        else if(X==3&&X2==1){if(CXAX){Status=0x2;}else if(CX==AX){Status=0x1;}else{Status=0x0;}}
        else if(X==3&&X2==2){if(CXBX){Status=0x2;}else if(CX==BX){Status=0x1;}else{Status=0x0;}}
        else if(X==3&&X2==3){Status=0x1;}
        else if(X==3&&X2==4){if(CXDX){Status=0x2;}else if(CX==DX){Status=0x1;}else{Status=0x0;}}
        else if(X==4&&X2==1){if(DXAX){Status=0x2;}else if(DX==AX){Status=0x1;}else{Status=0x0;}}
        else if(X==4&&X2==2){if(DXBX){Status=0x2;}else if(DX==BX){Status=0x1;}else{Status=0x0;}}
        else if(X==4&&X2==3){if(DXCX){Status=0x2;}else if(DX==CX){Status=0x1;}else{Status=0x0;}}
        else if(X==4&&X2==4){Status=0x1;}
        printf("状态寄存器:%d",Status);
        return;
    }
    void Sub (void)
    {
        if(iR==0x0){AX1();}
        if(iR==0x40){BX1();}
        if(iR==0x80){CX1();}
        if(iR==0xc0){DX1();}
        if(X==1&&X2==1){AX=AX+AX;}
        else if(X==1&&X2==2){AX=AX-BX;}
        else if(X==1&&X2==3){AX=AX-CX;}
        else if(X==1&&X2==4){AX=AX-DX;}
        else if(X==2&&X2==1){BX=BX-AX;}
        else if(X==2&&X2==2){BX=BX-BX;}
        else if(X==2&&X2==3){BX=BX-CX;}
        else if(X==2&&X2==4){BX=BX-DX;}
        else if(X==3&&X2==1){CX=CX-AX;}
        else if(X==3&&X2==2){CX=CX-BX;}
        else if(X==3&&X2==3){CX=CX-CX;}
        else if(X==3&&X2==4){CX=CX-DX;}
        else if(X==4&&X2==1){DX=DX-AX;}
        else if(X==4&&X2==2){DX=DX-BX;}
        else if(X==4&&X2==3){DX=DX-CX;}
        else if(X==4&&X2==4){DX=DX-DX;}
        return;
    }
    void Add (void)
    {
        if(iR==0x0){AX1();}
        if(iR==0x40){BX1();}
        if(iR==0x80){CX1();}
        if(iR==0xc0){DX1();}
        if(X==1&&X2==1){AX=AX+AX;}
        else if(X==1&&X2==2){AX=AX+BX;}
        else if(X==1&&X2==3){AX=AX+CX;}
        else if(X==1&&X2==4){AX=AX+DX;}
        else if(X==2&&X2==1){BX=BX+AX;}
        else if(X==2&&X2==2){BX=BX+BX;}
        else if(X==2&&X2==3){BX=BX+CX;}
        else if(X==2&&X2==4){BX=BX+DX;}
        else if(X==3&&X2==1){CX=CX+AX;}
        else if(X==3&&X2==2){CX=CX+BX;}
        else if(X==3&&X2==3){CX=CX+CX;}
        else if(X==3&&X2==4){CX=CX+DX;}
        else if(X==4&&X2==1){DX=DX+AX;}
        else if(X==4&&X2==2){DX=DX+BX;}
        else if(X==4&&X2==3){DX=DX+CX;}
        else if(X==4&&X2==4){DX=DX+DX;}
        return;
    }

    void Mov (void)
    {
        if(iR==0x0){AX1();}
        if(iR==0x40){BX1();}
        if(iR==0x80){CX1();}
        if(iR==0xc0){DX1();}
        if(Con2==1){Con();}
        else if(X==1&&X2==1){AX=AX;}
        else if(X==1&&X2==2){AX=BX;}
        else if(X==1&&X2==3){AX=CX;}
        else if(X==1&&X2==4){AX=DX;}
        else if(X==2&&X2==1){BX=AX;}
        else if(X==2&&X2==2){BX=BX;}
        else if(X==2&&X2==3){BX=CX;}
        else if(X==2&&X2==4){BX=DX;}
        else if(X==3&&X2==1){CX=AX;}
        else if(X==3&&X2==2){CX=BX;}
        else if(X==3&&X2==3){CX=CX;}
        else if(X==3&&X2==4){CX=DX;}
        else if(X==4&&X2==1){DX=AX;}
        else if(X==4&&X2==2){DX=BX;}
        else if(X==4&&X2==3){DX=CX;}
        else if(X==4&&X2==4){DX=DX;}
        Con2=0;
        return;
    }

    //目标兼存器与特殊
    void AX1 (void)
    {
        X=1,X2=0;
        if(iM==0x0){X2=1;}
        if(iM==0x20){X2=2;}
        if(iM==0x40){X2=3;}
        if(iM==0x60){X2=4;}
        if(iM==0x80){BXBX();}
        if(iM==0xe0){Con2=1;}

        return;
    }

    void BX1 (void)
    {
        X=2,X2=0;
        if(iM==0x0){X2=1;}
        if(iM==0x20){X2=2;}
        if(iM==0x40){X2=3;}
        if(iM==0x60){X2=4;}
        if(iM==0x80){BXBX();}
        if(iM==0xe0){Con2=1;}
        return;

    }

    void CX1 (void)
    {
        X=3,X2=0;
        if(iM==0x0){X2=1;}
        if(iM==0x20){X2=2;}
        if(iM==0x40){X2=3;}
        if(iM==0x60){X2=4;}
        if(iM==0x80){BXBX();}
        if(iM==0xe0){Con2=1;}
        return;
    }
    void DX1 (void)
    {
        X=4,X2=0;
        if(iM==0x0){X2=1;}
        if(iM==0x20){X2=2;}
        if(iM==0x40){X2=3;}
        if(iM==0x60){X2=4;}
        if(iM==0x80){BXBX();}
        if(iM==0xe0){Con2=1;}
        return;
    }
    void OperateNumber (void)
    {
        if(iM==0x0){Not();}
        if(iM==0x20){Mul();}
        if(iM==0x40){Div();}
        if(iM==0x60){Ret();}
        if(iM==0x80){Mov2();}
        if(iM==0xa0){Get();}
        if(iM==0xc0){Put();}
        if(iM==0xe0){Put2();}
        return;
    }
    void Tiaozhuan (void)
    {
        if(iM==0x0){Je();}
        if(iM==0x20){Jne();}
        if(iM==0x40){Jb();}
        if(iM==0x60){Jbe();}
        if(iM==0x80){Ja();}
        if(iM==0xa0){Jae();}
        if(iM==0xc0){iPC=(A[iPC+1]8)+A[iPC];printf("n产生:PC无条件跳转到%d节n",iPC);}
        if(iM==0xe0){Call();}
        return;
    }

    //源与指令
    void BXBX (void)
    {
        if(X=1){AX=AX+A[BX];}
        else if(X=2){BX=BX+A[BX];}
        else if(X=3){CX=CX+A[BX];}
        else if(X=4){DX=DX+A[BX];}
        return;
    }
    void Con (void)
    {
        if(X==1){AX=(unsigned short int)((A[iPC+1]8)+A[iPC]);printf("n产生:寄存器AX得到立即数:%xn",AX);}
        if(X==2){BX=(unsigned short int)((A[iPC+1]8)+A[iPC]);printf("n产生:寄存器BX得到立即数:%xn",BX);}
        if(X==3){CX=(unsigned short int)((A[iPC+1]8)+A[iPC]);printf("n产生:寄存器CX得到立即数:%xn",CX);}
        if(X==4){DX=(unsigned short int)((A[iPC+1]8)+A[iPC]);printf("n产生:堆栈寄存器SP得到立即数:%xn",DX);}

       iPC=iPC+2;
        return;
    }
    void Not (void)
    {
        AX=~AX;
        return;
    }

    void Mul (void)
    {
        unsigned short int C,C2;
        C=(AX*BX);
        C2=(AX*BX);
        C=C8;
        AX=(unsigned char)C2;
        BX=(unsigned char)C;
        printf("n产生:AX乘以BX,低位AX=%x,高位BX=%x",AX,BX);
        return;
    }
    void Div (void)
    {
        int i;
        i=AX;
        AX=AX/BX;
        BX=i%BX;
        printf("n产生:AX除以BX,商AX=%x,余数BX=%x",AX,BX);
        return;
    }
    void Ret (void)
    {
        iPC=A[DX]+(A[DX+1]8);
        printf("返回主程序第%d节",iPC);
        return;
    }
    void Mov2 (void)
    {
        A[BX]=AX;
        printf("n产生:将AX寄存器值%d给间接BX",AX);
        return;
    }
    void Get (void)
    {
        printf("输入P0:");
        scanf("%x",&P0);
        fflush(stdin);
        AX=P0;
        printf("n产生:将P0的值%x给AX寄存器n",P0);
        return;
    }
    void Put (void)
    {
        P0=AX;
        printf("n产生:将AX寄存器值%d给P0n",AX);
        return;
    }
    void Put2 (void)
    {
        P1=AX;
        printf("n产生:将AX寄存器值%d给P1n",AX);
        return;
    }
    void Je (void)
    {
        if(Status==1){iPC=(A[iPC+1]8)+A[iPC];printf("n产生:比较器为等于跳转到%d节n",iPC);}
        return;
    }
    void Jne (void)
    {
        if(Status==2||Status==0){iPC=(A[iPC+1]8)+A[iPC];printf("n产生:比较器为不等于跳转到%d节n",iPC);}
        return;
    }

    void Jb (void)
    {
        if(Status==0){iPC=(A[iPC+1]8)+A[iPC];printf("n产生:比较器为小于跳转到%d节n",iPC);}
        return;
    }
    void Jbe (void)
    {
        if(Status==0||Status==1){iPC=(A[iPC+1]8)+A[iPC];printf("n产生:比较器为小于等于跳转到%d节n",iPC);}
        return;
    }
    void Ja (void)
    {
        if(Status==2){iPC=(A[iPC+1]8)+A[iPC];printf("n产生:比较器为大于跳转到%d节n",iPC);}
        return;
    }
    void Jae (void)
    {
        if(Status==2||Status==1){iPC=(A[iPC+1]8)+A[iPC];printf("n产生:比较器为大于等于跳转到%d节n",iPC);}
        return;
    }
    void Call (void)
    {
        unsigned short int I,I2;
        I=iPC+2;
        I2=iPC+2;
        I=I8;
        A[DX]=(unsigned char)I;
        DX--;
        A[DX]=(unsigned char)I2;
        iPC=(A[iPC+1]8)+A[iPC];
        printf("n产生:呼叫子程序位置第%d节n",iPC);    
        return;
    }
    void Push (void)
    {
        unsigned short int I,I2;
        I=AX;
        I2=AX;
        I8;
        A[DX]=(unsigned char)I;
        DX--;
        A[DX]=(unsigned char)I2;
        return;
    }
    void Pop (void)
    {
        AX=A[DX]+(A[DX+1]8);
        return;
    }

    指令集            目标              源
    000 特殊       00 AX         000 AX
    001 OR         01 BX          001 BX
    010 And        10 CX         010 CX
    011 Cmp        11 SP         011 SP
                  100 [BX]
    100 Sub                      111 立即数
    101 Add      00 操作数指令    
    110 Mov        01 跳转指令    000 Not
                  001 Mul    
                  010 Div
                  011 Ret
                  100 Mov[BX]
                  101 Get
                  110 Put P0
                  111 Put P1

                  000 Je
                  001 Jne
                  010 Jb
                  011 Jbe
                  100 Ja
                  101 Jae
                  110 Jmp
                 111 Call

    楼主 2015-12-05 12:48 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知