
Система команд микроЭвм к1816ве51
В таблицах П1.1 – П1.4 приведены мнемокоды команд, длина команды в МЦ, HEX-коды и описание команды. В таблицах использованы следующие обозначения:
A,B |
- аккумулятор, дополнительный аккумулятор; |
Rn |
- регистр общего назначения (n = 0..7); |
@Ri |
- косвенный адрес через Ri (i = 0,1); |
direct |
- прямой адрес DSEG (8 бит); |
#data |
- непосредственный операнд длиной 8 бит; |
#data16 |
- непосредственный операнд длиной 16 бит; |
addr11 |
- адрес перехода длиной 11 бит; |
addr16 |
- адрес перехода длиной 16 бит; |
rel |
- смещение на странице CSEG длиной 8 бит; |
bit |
- прямой адрес BSEG (номер бита). |
Таблица П1.1
Команды пересылки
Мнемокод |
МЦ |
HEX-коды |
Описание команды |
MOV A, Rn |
1 |
E8 .. EF |
A Rn |
MOV A, direct |
1 |
E5 |
A (direct) |
MOV A, @Ri |
1 |
E6 .. E7 |
A (Ri) |
MOV A, #data |
1 |
74 |
A data |
MOV Rn, A |
1 |
F8 .. FF |
Rn A |
MOV Rn, direct |
2 |
A8 .. AF |
Rn (direct) |
MOV Rn, #data |
1 |
78 .. 7F |
Rn data |
MOV direct, A |
1 |
F5 |
(direct) A |
MOV direct, Rn |
2 |
88 .. 8F |
(direct) Rn |
MOV direct, direct |
2 |
85 |
(direct) (direct) |
MOV direct, @Ri |
2 |
86 .. 87 |
(direct) (Ri) |
MOV direct, #data |
2 |
75 |
(direct) data |
MOV @Ri, A |
1 |
F6 .. F7 |
(Ri) A |
MOV @Ri, direct |
2 |
A6 .. A7 |
(Ri) (direct) |
MOV @Ri, #data |
1 |
76 .. 77 |
(Ri) data |
MOV DPTR, #data16 |
2 |
90 |
DPTR data16 |
MOVC A,@A+DPTR |
2 |
93 |
A CSEG(A+DPTR) |
MOVC A,@A+PC |
2 |
83 |
A CSEG(A+PC) |
MOVX A, @Ri |
2 |
E2 .. E3 |
A XSEG(P2.Ri) |
MOVX A, @DPTR |
2 |
E0 |
A XSEG(DPTR) |
MOVX @Ri, A |
2 |
F2 .. F3 |
XSEG (P2.Ri) A |
MOVX @DPTR, A |
2 |
F0 |
XSEG (DPTR) A |
PUSH direct |
2 |
C0 |
+(SP) (direct) |
POP direct |
2 |
D0 |
(direct) (SP)- |
XCH A, Rn |
1 |
C8 .. CF |
A Rn |
XCH A, direct |
1 |
C5 |
A (direct) |
XCH A, @Ri |
1 |
C6 .. C7 |
A (Ri) |
XCHD A, @Ri |
1 |
D6 .. D7 |
A[3:0] (Ri[3:0]) |
Таблица П1.2
Логические и арифметические команды
Мнемокод |
МЦ |
HEX-коды |
Описание команды |
|
ANL A, Rn |
1 |
58 .. 5F |
A A Rn |
|
ANL A, direct |
1 |
55 |
A A (direct) |
|
ANL A, @Ri |
1 |
56 .. 57 |
A A (Ri) |
|
ANL A, #data |
1 |
54 |
A A data |
|
ANL direct, A |
1 |
52 |
(direct) (direct) A |
|
ANL direct, #data |
2 |
53 |
(direct) (direct) data |
|
ORL A, Rn |
1 |
48 .. 4F |
A A Rn |
|
ORL A, direct |
1 |
45 |
A A (direct) |
|
ORL A, @Ri |
1 |
46 .. 47 |
A A (Ri) |
|
ORL A, #data |
1 |
44 |
A A data |
|
ORL direct, A |
1 |
42 |
(direct) (direct) A |
|
ORL direct, #data |
2 |
43 |
(direct) (direct) data |
|
XRL A, Rn |
1 |
68 .. 6F |
A A Rn |
|
XRL A, direct |
1 |
65 |
A A (direct) |
|
XRL A, @Ri |
1 |
66 .. 67 |
A A (Ri) |
|
XRL A, #data |
1 |
64 |
A A data |
|
XRL direct, A |
1 |
62 |
(direct) (direct) A |
|
XRL direct, #data |
2 |
63 |
(direct) (direct) data |
|
CLR A |
1 |
E4 |
A 0000 0000 (Очистка акк.) |
|
CLP A |
1 |
F4 |
A A\ (Инверсия аккумулятора) |
|
RL A |
1 |
23 |
Сдвиг левый циклический |
|
RLC A |
1 |
33 |
Сдвиг левый с переносом |
|
RR A |
1 |
03 |
Сдвиг правый циклический |
|
RRC A |
1 |
13 |
Сдвиг правый с переносом |
|
SWAP A |
1 |
C4 |
A[7:4] A[3:0] |
|
ADD A, Rn |
1 |
28 .. 2F |
A A + Rn |
|
ADD A, direct |
1 |
25 |
A A + (direct) |
|
ADD A, @Ri |
1 |
26 .. 27 |
A A + (Ri) |
|
ADD A, #data |
1 |
24 |
A A + data |
|
ADDC A, Rn |
1 |
38 .. 3F |
A A + Rn + CY |
|
ADDC A, direct |
1 |
35 |
A A + (direct) + CY |
|
ADDC A, @Ri |
1 |
36 .. 37 |
A A + (Ri) + CY |
|
ADDC A, #data |
1 |
34 |
A A + data + CY |
|
SUBB A, Rn |
1 |
98 .. 9F |
A A - Rn - CY |
|
SUBB A, direct |
1 |
95 |
A A - (direct) - CY |
|
SUBB A, @Ri |
1 |
96 .. 97 |
A A - (Ri) - CY |
|
SUBB A, #data |
1 |
94 |
A A - data - CY |
|
INC A |
1 |
04 |
A A + 1 |
|
INC Rn |
1 |
08 .. 0F |
Rn Rn + 1 |
|
INC direct |
1 |
05 |
(direct) (direct) + 1 |
|
INC @Ri |
1 |
06 .. 07 |
(Ri) (Ri) + 1 |
|
INC DPTR |
1 |
A3 |
DPTR DPTR + 1 |
|
DEC A |
1 |
14 |
A A - 1 |
|
DEC Rn |
1 |
18 .. 1F |
Rn Rn - 1 |
|
DEC direct |
1 |
15 |
(direct) (direct) - 1 |
|
Таблица П1.2 (окончание) |
|
|||
DEC @Ri |
1 |
16 .. 17 |
(Ri) (Ri) - 1 |
|
MUL AB |
4 |
A4 |
B.A A × B |
|
DIV AB |
4 |
84 |
A.B A B |
|
DA A |
1 |
74 |
Десятичная коррекция сложения |
Таблица П1.3
Команды передачи управления
Мнемокод |
МЦ |
HEX-коды |
Описание команды |
ACALL addr11 |
2 |
aaa10001 |
+(SP) PC; PC[10:0] adrr11 |
LCALL addr16 |
2 |
12 |
+(SP) PC; PC adrr16 |
RET |
2 |
22 |
PC (SP)- |
RETI |
2 |
32 |
PC (SP)-; конец прерывания |
AJMP addr11 |
2 |
aaa00001 |
PC[10:0] adrr11 |
LJMP addr16 |
2 |
02 |
PC adrr16 |
JMP @A + DPTR |
2 |
73 |
PC DPTR +A |
SJMP rel |
2 |
80 |
PC PC + rel |
JZ rel |
2 |
60 |
if A = 0 then PC PC + rel |
JNZ rel |
2 |
70 |
if A 0 then PC PC + rel |
CJNE A, direct, rel |
2 |
B5 |
if A (direct) then PC PC + rel |
CJNE A, #data, rel |
2 |
B4 |
if A data then PC PC + rel |
CJNE Rn, #data, rel |
2 |
B8 .. BF |
if Rn data then PC PC + rel |
CJNE @Ri,#data, rel |
2 |
B6 .. B7 |
if (Ri) data then PC PC + rel |
CJNZ Rn,rel |
2 |
D8 .. DF |
Rn Rn - 1
if Rn 0 then PC PC + rel |
CJNE direct, rel |
2 |
D5 |
(direct) (direct) - 1
if (direct) 0 then PC PC + rel |
NOP |
1 |
00 |
|
Таблица П1.4
Булевые команды
Мнемокод |
МЦ |
HEX-коды |
Описание команды |
|
MOV C, bit |
1 |
A9 |
CY BSEG(bit) |
|
MOV bit, C |
1 |
92 |
BSEG(bit) CY |
|
CLR C |
1 |
C3 |
CY 0 |
|
CLR bit |
1 |
C2 |
BSEG(bit) 0 |
|
SETB C |
1 |
D3 |
CY 1 |
|
SETB bit |
1 |
D2 |
BSEG(bit) 1 |
|
CPL C |
1 |
B3 |
CY CY\ |
|
CPL bit |
1 |
B2 |
BSEG(bit) BSEG(bit)\ |
|
ANL C, bit |
2 |
82 |
CY CY BSEG(bit) |
|
ANL C, bit\ |
2 |
B0 |
CY CY BSEG(bit)\ |
|
ORL C, bit |
2 |
72 |
CY CY BSEG(bit) |
|
ORL C, bit\ |
2 |
A0 |
CY CY BSEG(bit)\ |
|
JC rel |
2 |
40 |
if CY = 1 then PC PC + rel |
|
JNC rel |
2 |
50 |
if CY = 0 then PC PC + rel |
|
JB bit, rel |
2 |
20 |
if BSEG(bit) = 1
then PC PC + rel |
|
Таблица П1.4 (окончание) |
|
|||
JNB bit, rel |
2 |
30 |
if BSEG(bit) = 0
then PC PC + rel |
|
JBC bit, rel |
2 |
10 |
if BSEG(bit) = 1 then
PC PC + rel и BSEG(bit) 0 |
Листинг программы на С++
Файл Project1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("uMAIN.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
Файл uMAIN.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "uMAIN.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
using namespace std;
vector<structure> TableOfCodes;
TStringList* Table = new TStringList();
TStringList* Found = new TStringList();
TStringList* NotFound = new TStringList();
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Find(int code, FILE* stream)
{
int i,j;
for (i=0;i<TableOfCodes.size();i++)
for (j=0;j<TableOfCodes[i].OpCode.size();j++)
{
if (code==TableOfCodes[i].OpCode[j])
{
Found->Add(TableOfCodes[i].NameOfOperation);
return;
}
}
NotFound->Add(IntToHex(code,1));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
FILE *stream;
unsigned char code;
Memo1->Clear();
Memo2->Clear();
Found->Clear();
NotFound->Clear();
if (OpenDialog1->Execute())
{
//присваиваем имя открытого файла edit1
int LastSlash = LastDelimiter("\\",OpenDialog1->FileName);
AnsiString FileNameTPP = OpenDialog1->FileName.SubString(LastSlash + 1,OpenDialog1->FileName.Length() - LastSlash);
Edit1->Text=FileNameTPP;
stream = fopen(OpenDialog1->FileName.c_str(), "rb");
if (stream)
{
do
{
code=fgetc(stream);
Find((int)code,stream);
}
while (!feof(stream));
}
fclose(stream);
}
// выводим в memo1 найденные команды
Memo1->Lines->AddStrings(Found);
//удаляем повторяющиеся коды из ненайденных команд
int i=0;
AnsiString temp;
while (i<NotFound->Count)
{
temp=NotFound->Strings[i];
int j=i+1;
while(j<NotFound->Count)
{
if (NotFound->Strings[i]==NotFound->Strings[j])
{
NotFound->Delete(j);
}
else
{
j++;
}
}
i++;
}
// выводим в memo2 ненайденные команды
Memo2->Lines->AddStrings(NotFound);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ParseString(AnsiString *Source, TStringList *Dest)
{
while (Source->Length())
{
*Source=(*Source).TrimLeft();
Dest->Add(Source->SubString(1,Source->Pos("\'")-1));
Source->Delete(1,Source->Pos("\'"));
}
}
void __fastcall TForm1::ParseOpcodes(TStringList *Dest)
{
AnsiString temp=Dest->Strings[1];
if (temp.Pos("."))
{
Dest->Delete(1);
AnsiString x="0x00"+temp.SubString(1,temp.Pos("..")-2);
temp.Delete(1,temp.Pos("..")+1);
temp=temp.Trim();
temp="0x00"+temp;
int count=StrToInt(temp)-StrToInt(x)+1;
for (int i=0;i<count;i++)
{
Dest->Add(IntToStr(StrToInt(x)+i));
}
}
else
{
AnsiString x="0x00"+temp;
Dest->Delete(1);
Dest->Add(StrToInt(x));
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormActivate(TObject *Sender)
{
AnsiString TempStr;
TStringList* Parsing=new TStringList();
//существует ли файл с таблицей
if (FileExists("data\\table.txt"))
{
//загрузка файла
Table->LoadFromFile("data\\table.txt");
//изменяем размер таблицы кодов
TableOfCodes.resize(Table->Count);
for (int i=0;i<Table->Count;i++)
{
//разбиваем каждую строку по элементам
TempStr=Table->Strings[i];
Parsing->Clear();
ParseString(&TempStr,Parsing);
ParseOpcodes(Parsing);
//заносим в массив название операции
TableOfCodes[i].NameOfOperation=Parsing->Strings[0];
for (int j=1;j<Parsing->Count;j++)
{
//увеличиваем количество кодов
TableOfCodes[i].OpCode.resize(TableOfCodes[i].OpCode.size()+1);
//заносим все коды команды
TableOfCodes[i].OpCode[j-1]=StrToInt(Parsing->Strings[j]);
}
}
}
else
{
ShowMessage("Файл table.txt не найден");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
Panel2->Width=Form1->ClientWidth/2;
}
//---------------------------------------------------------------------------
Тестовый пример
Выполнение команд:
Заключение
В данной курсовой работе мною разработан дизассемблера для однокристальной микроЭВМ. Программа получает на вход бинарный файл . На выходе программа – выводит на экран результаты выполнения команд. Если входная программа содержит ошибку – сообщение об ошибке.
Получены практические навыки при реализации интерпретатора и транслятора.