Моделирование машины Фон-Неймана
Автор работы: Пользователь скрыл имя, 25 Февраля 2015 в 20:19, реферат
Описание работы
Данная вычислительная практика посвящена изучению структуры и работы ЦВМ, изучению, освоению и использованию графических возможностей C++, знакомству с основами языка ассемблера и машинного языка, составом стандартных библиотек системы программирования на языке С++.
Файлы: 1 файл
Отчет практика.doc
— 202.00 Кб (Скачать файл)switch (ArrLine[i].Dir)
{
case Right: line(ArrLine[i].X,ArrLine[i].
break;
case Down : line(ArrLine[i].X,ArrLine[i].
break;
}
}
for (i=0;i<CountInfo;i++)
outtextxy(ArrInfo[i].X,
return 0;
}
int InitMBM(void)
{
/* request auto detection */
int gdriver = DETECT, gmode, errorcode;
/* initialize graphics mode */
initgraph(&gdriver, &gmode, "");
/* read result of initialization */
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
// printf("Press any key to halt:");
getch();
exit(1); /* return with error code */
}
OutStructure();
return 0;
}
void OutValues()
{
short int i;
char *S,*Str;
for (i=0; i<CountReg;i++)
{
if (ArrReg[i].Value != NULL)
if ((i==0)||(i==1))
{OutIntXY(ArrReg[i].X+5, ArrReg[i].Y+7,5, *ArrReg[i].Value);}
else if (i==23)
{ClearBar(ArrReg[i].X+1, ArrReg[i].Y+1, ArrReg[i].X+47, ArrReg[i].Y+19);
}
else if (i==7)
{OutIntXY(ArrReg[i].X+17, ArrReg[i].Y+7,2,*ArrReg[i].
else OutHexXY(ArrReg[i].X+5, ArrReg[i].Y+7, 4, *ArrReg[i].Value);
}
OutSost();
}
void RectangleDouble()
{
rectangle(ArrReg[CurrentReg].
}
char ReadKey()
{
char Symbol;
asm{
mov AH,07h
int 21h
mov Symbol,AL
}
return Symbol;
}
void OutSost()
{
ClearBar(535,175,535+4*8,170+
outtextxy(535,175,SostName[
}
Модуль графических подпрограмм (graphlib.cpp)
//графическая библиотека GraphLib.cpp
#include <graphics.h>
#include <strstream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include "func.h"
void ClearBar(int Left,int Top,int Right,int Bottom)
{
setfillstyle(1,0);
bar(Left,Top,Right,Bottom);
}
char * WordToHex(word N,short int Lens)
{
const char HexDigit[]="0123456789ABCDEF";
char *S="0000";
int Pos; int Ost;
for (Pos=Lens-1;Pos>-1;Pos--)
{
Ost=N%16;
N/=16;
S[Pos]=HexDigit[Ost];
}
return S;
}
void OutHexXY(int X,int Y, int short Lens, word Val)
{
char *S,*Str;
ClearBar(X,Y,X+textwidth("0")*
Str[0]='$';
S=WordToHex(Val,Lens);
Str[1]=S[0];Str[2]=S[1];Str[3]
outtextxy(X,Y,Str);
}
void OutIntXY(int X, int Y, int Lens,word IntVal)
{
char Str7[7];
ultoa(IntVal,Str7,10);
ClearBar(X,Y, X+45,Y+7);
outtextxy(X,Y,Str7);
}
Модуль выполнения машинных команд (MBMcpu.cpp)
#include <dos.h>
#include "func.h"
extern word NumTakt;
extern word Adres;
extern word Aisp;
extern word Data;
extern word Mem[];
extern word buf;
extern word Akk;
extern word Flags;
extern word PC;
extern int EndProg;
extern word Command;
extern word ADR;
extern int EndCmnd;
extern word Speed;
extern word COP;
extern TSost Sost;
extern word MaxTakt[]={5,11,11,11,10,8,10,
void ExecAdd()
{
switch (NumTakt)
{
case 7 : Adres=Aisp; break;
case 8 : Data=Mem[Adres]; break;
case 9 : buf=Akk;Akk+=Data;break;
case 10: if (buf>Akk)
{
if (Akk==0) Flags=3;
else Flags=1;
}
else
{
if (Akk==0) Flags=2;
else Flags=0;
}
break;
}
}
void ExecSub()
{
switch (NumTakt)
{
case 7 : Adres=Aisp;break;
case 8 : Data=Mem[Adres];break;
case 9 : buf=Akk;Akk-=Data;
break;
case 10: if (buf<Akk) Flags=1;
else
if (Akk==0) Flags=2;
else Flags=0;
break;
}
}
void ExecLoa()
{
switch (NumTakt)
{
case 7 : Adres=Aisp;break;
case 8 : Data=Mem[Adres];break;
case 9 : Akk=Data; break;
case 10: if (Akk==0) Flags=2; else Flags=0; break;
}
}
void ExecSto()
{
switch (NumTakt)
{
case 7 : Adres=Aisp; break;
case 8 : Data=Akk; break;
case 9 : Mem[Adres]=Data; break;
}
}
void ExecJZ()
{
if (Flags==2)
switch (NumTakt)
{
case 7 : PC=Aisp; break;
}
}
void ExecJmp()
{
switch (NumTakt)
{
case 7 : Adres=Aisp; break;
case 8 : Data=Mem[Adres];break;
case 9 : PC=Data; break;
}
}
void ExecEND()
{
switch (NumTakt)
{
case 7 : Adres=Aisp; break;
case 8 : Data=Mem[Adres]; break;
case 9 : PC=Data; break;
case 10: EndProg=1; break;
}
}
void ExecOperation()
{
switch (COP)
{
case 1 : ExecAdd(); break;
case 2 : ExecSub(); break;
case 3 : ExecLoa(); break;
case 4 : ExecSto(); break;
case 5 : ExecJZ() ; break;
case 6 : ExecJmp(); break;
case 7 : ExecEND(); break;
}
}
void ExecTakt()
{
switch (NumTakt)
{
case 0 : Adres=PC; break;
case 1 : Data=Mem[Adres]; break;
case 2 : Command=Data; break;
case 3 : PC++; break;
case 4 : COP=Command >> 8; break;
case 5 : ADR=Command & 0x00FF; break;
case 6 : Aisp= PC & 0xFF00 | ADR;break;
case 7 : ExecOperation(); break;
case 8 : ExecOperation(); break;
case 9 : ExecOperation(); break;
case 10: ExecOperation(); break;
}
NumTakt=(NumTakt+1)%MaxTakt[
if (NumTakt==0) EndCmnd=1;
}
void ExecuteProgram()
{
if (Sost != Vvod)
{
ExecTakt();
OutValues();
switch (Sost)
{
case Takt : Sost=Vvod; break;
case Cmnd : if (EndCmnd) Sost=Vvod; break;
case Auto : if (EndProg) Sost=Vvod; break;
case Demo : if (Speed != 0) delay(1000/Speed);
if (EndProg) Sost=Vvod; break;
}
}
}
Главная программа (MBM.cpp)
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include "func.h"
extern char UserCmnd;
extern char CmndExit;
extern word NumTakt;
extern word PC;
extern word Shag;
extern int EndCmnd;
extern int EndProg;
extern TSost Sost;
extern TRegTV ArrReg[];
extern const word MaxTakt[];
extern word COP;
extern word CurrentReg;
extern word MaxCurrReg;
int main()
{
InitMBM();
setwritemode(1);
do
{
OutValues();
RectangleDouble();
do
{
OutTime();
ExecuteProgram();
}
while (!kbhit());
RectangleDouble();
UserCmnd=ReadKey();
switch (UserCmnd)
{
case 9 : CurrentReg=(CurrentReg+1)%
case 65: Sost=Takt;break;
case 66: Sost=Cmnd;EndCmnd=0;break;
case 67: Sost=Demo;EndProg=0;
case 68 :Sost=Auto;EndProg=0;break;
case 27: Sost=Vvod;NumTakt=0;PC=0x000C;
case 43: if (Sost==Vvod)
if (CurrentReg==1) *ArrReg[CurrentReg].Value+=1;
else
*ArrReg[CurrentReg].Value+=
if (Sost==Demo)
*ArrReg[CurrentReg].Value+=
break;
case 42: if (Sost==Vvod)
if (CurrentReg==1) *ArrReg[CurrentReg].Value-=1;
else *ArrReg[CurrentReg].Value-=
if (Sost==Demo)
*ArrReg[CurrentReg].Value-=
break;
}
}
while (UserCmnd!=CmndExit);
closegraph();
return 0;
}