共有回帖数 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 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知