Описание разработанных модулей. — КиберПедия 

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Описание разработанных модулей.

2023-01-01 27
Описание разработанных модулей. 0.00 из 5.00 0 оценок
Заказать работу

 

Модуль MacroGen.

interface

uses

Expr, Strings, SysUtils, Forms, Windows;

Const

{список констант – ограничителей}

MAX_MACRO_DESC      = 32;        // максимально количество макросов

MAX_MACRO_DEF_STR   = 1024; // максимальное количество строк в таблице макроопределений

MAX_MARKS           = $FF; // максимальное количество макрометок

MAX_STR_ARRAY_LEN   = $FF; // максимальное количество параметров макроса

MAX_LOCALS          = 32 ;   // максимально количество локальных переменных

MAX_SRC_LEN         = 1024; // максимальное количество строк, считываемых из исходного файла

MAX_OUTPUT_LEN      = $FFFF; // максимальное количество строк, выводимых в выходной файл

MAX_JUMPS           = $FF;  // максимальное количество переходов (условных и безусловных) в программе

MAX_LEVEL           = $FF; // максимальный уровень вложенности операторов IF

MAX_CONFIGS         = 4096; //максимально количество конфигураций значений локальных переменных при обработке макроса

LOCAL_MAX_VAL       = 4095; // максимально значение локальной переменной

LOCAL_MIN_VAL       = -4096; // минимальное значение локальной переменной

{список констант, определяющих количества типов команд и ошибок}

NUM_ERR_TYPES       = 44; // количество типов ошибок

NUM_ASM_COM         = 8; // количество типов ассемблерных команд

NUM_MACRO_COM       = 11; // количество типов макрокоманд

{значения, возвращаемые основными функциями макропроцессора}

BAD_INDEX           = -1;    // значение, которое возвращают функции получения индекса в случае, когда искомый элемент не найден

NORM_RESULT         = 0;    // стандартное значение, возвращаемое в случае, когда не найдено ошибок

{далее перечисляются коды ошибок}

ERR_END_NOT_FOUND   = 1;   

ERR_DUP_MDEF_NAME   = 2;

ERR_BAD_MDEF_NAME   = 3;

ERR_UNCLOSED_MDEF   = 4;

ERR_BAD_ACTUAL_PARAMS = 5;

ERR_BAD_FORMAL_PARAMS = 6;

ERR_DUP_MARK_NAME   = 7;

ERR_LOCAL_NOT_FOUND = 8;

ERR_MACRO_DEF_NOT_FOUND = 9;

ERR_ASM_MARK_IN_MACRO = 10;

ERR_BAD_PARAM_NAME  = 11;

ERR_PARAM_VAL_NOT_SET = 12;

ERR_PARAMS_MISMATCH = 13;

ERR_NOT_ENOUGH_PARAMS = 14;

ERR_OPERANDS_MISMATCH = 15;

ERR_LOCAL_AFTER_COM = 16;

ERR_LOCAL_HAS_MACRO_MARK = 17;

ERR_BAD_SET_SYNTAX  = 18;

ERR_ENDIF_NOT_EXPECTED = 19;

ERR_ELSE_NOT_EXPECTED = 20;

ERR_MACRO_CALL_IN_MACRO = 21;

ERR_COMMON_SYNTAX   = 22;

ERR_TOO_DEEP_LEVEL  = 23;

ERR_BAD_IF_SYNTAX   = 24;

ERR_INFINITE_LOOP_FOUND = 25;

ERR_BAD_AIF_SYNTAX  = 26;

ERR_MACRO_DEF_IN_MACRO = 27;

ERR_BAD_MACRO_MARK_NAME = 28;

ERR_TOO_BIG_PROGRAMM = 29;

ERR_TOO_MANY_MARKS  = 30;

ERR_TOO_MANY_PARAMS = 31;

ERR_MARK_NOT_FOUND  = 32;

ERR_MEND_NOT_EXPECTED = 33;

ERR_DUP_LOCALS      = 34;

ERR_TOO_MANY_JUMPS  = 35;

ERR_MACROSTUFF_OUTSIDE = 36;

ERR_LOCAL_OUT_OF_RANGE = 37;

ERR_BAD_MACRO_DEF_NAME = 38;

 

ERR_DESC: array [0..NUM_ERR_TYPES - 1] of string =

('Директива END не найдена',

'Дублирование имен макросов',

'Неверно задано имя макроса',

'Незавершенное макроопределение',

'Неверно заданы фактические параметры макровызова',

'Неверно заданы формальные параметры макроопределения',

'Дублирование имён меток',

'Локальная переменная не определена',

'Макроопределение не найдено',

'Обнаружена ассемблерная метка внутри макроса',

'Неверно задано имя параметра',

'Значение параметра не задано',

'Несоответствие фактических и формальных параметров',

'Недостаточно фактических параметров',

'Неверное количество операндов у оператора',

'Команда LOCAL должна располагаться в начале макроопределения',

'Команда LOCAL не может иметь макрометки',

 'Неверный синтаксис оператора SET',

'Оператор ENDIF не является ожидаемым',

'Оператор ELSE не является ожидаемым',

'Обнаружен макровызов внутри макроса',

'Неверный синтасис команды',

'Превышен предел уровня вложенности управляющих команд',

'Неверный синтаксис в операторе IF',

'Обнаружен бесконечный цикл',

'Неверный синтаксис в операторе AIF',

'Обнаружено макроопределение внутри макроса',

'Неверно задано имя макрометки',

'Превышен предел объёма результирующего кода',

'Превышен предел допустимого количества меток',

'Превышен предел допустимого количества параметров макроса',

'Метка не найдена',

'Оператор MEND не является ожидаемым',

'Дублирование имён локальных переменных',

'Слишком много переходов в макроопределении',

'Обнаружена макрокоманда или макрометка вне макроопределения',

'Значение локальной переменной вне допустимого диапазона',

'Неверное имя макроса',

'Неверный порядок скобок в выражении',

'Количества открывающих и закрывающих скобок не соответствуют друг другу',

'Неверный тип операнда в выражении',

'Пропущен операнд в выражении',

'Неверный тип операции в выражении',

'Значение операнда вне допустимого диапазона');

 

Type

{перечисление типов команд}

TComType = (tAIF, tAGO, tIF, tELSE, tENDIF, tMACRO, tMEND, tLOCAL, tSET, tINC, tDEC,tMACRO_CALL, tASM_COM, tUNKNOWN);

 

{структура макрокоманды}

TMacroCom = record

name, // имя макрокоманды

expectedWord: string; // строка (символ), которая ожидается после первого операнда данной команды (необходимо для команд с двумя операндами)

comType  : TComType;      // тип

minNumOperands,     // минимальное количество операндов

maxNumOperands: byte; // максимально количество операндов

end;

 

{ структура макрометки }

TMacroMark = record

name: string; // имя

addr: integer; // номер строки в ТМО, в которой расположена данная метка

end;

 

{структура ассемблерной метки}

TAsmMark = record

name: string; // имя

end;

 

{структура описателя макроса}

TMacroDesc = record

name, // имя

formalParams: string;    // строка формальных параметров

startAddr,     // начальный индекс в ТМО

endAddr: integer;   // конечный индекс в ТМО

end;

 

{структура параметрической пары}

TParamPair = record

name, // имя

val: string; // значение

end;

 

{структура, возвращаемая основными функциями макропроцессора}

TResult = record

code        : byte; // код результата

additionalInfo: string;  // дополнительные сведения об ошибках

end;

 

{структура перехода}

TJump = record

srcAddr,       // адрес, откуда совершается переход (индекс в ТМО)

destAddr: integer; // адрес, куда совершается переход (индекс в ТМО)

end;

 

{структура стека, хранящего данные о переходах}

TJumpStackElem = record

comType: TComType; // тип команды, с которой совершается переход

jumpIndex: integer; // индекс перехода в таблице переходов

end;

 

{структура конфигурации значений локальных переменных}

TParamConfig = record

strN: integer; // номер строки, соответствующий данной конфигурации

vals: array [0..MAX_LOCALS - 1] of integer; // вектор значений

end;

 

{ структура элемента ТМО }

TMacroDefStr = record

str   : string;     // строка элемента

isDone: boolean;    // флаг, принимающий значение истина, если данная строка была обработана ранее

end;

 

const

{перечисление команд ассемблера}

ASM_COM: array [0..NUM_ASM_COM - 1] of string = ('MOV', 'ADD', 'SUB', 'LOOP', 'DB', 'DD', 'NOP', 'END');

{ таблица макрокоманд }

MACRO_COM: array [0..NUM_MACRO_COM - 1] of TMacroCom =

((name: 'AIF'; expectedWord: 'AGO'; comType: tAIF; minNumOperands: 2; maxNumOperands: 2),

(name: 'AGO'; expectedWord: ''; comType: tAGO; minNumOperands: 1; maxNumOperands: 1),

(name: 'IF'; expectedWord: ''; comType: tIF; minNumOperands: 1; maxNumOperands: 1),

(name: 'ELSE'; expectedWord: ''; comType: tELSE; minNumOperands: 0; maxNumOperands: 0),

(name: 'ENDIF'; expectedWord: ''; comType: tENDIF; minNumOperands: 0; maxNumOperands: 0),

(name: 'MACRO'; expectedWord: ''; comType: tMACRO; minNumOperands: 0; maxNumOperands: 1),

(name: 'MEND'; expectedWord: ''; comType: tMEND; minNumOperands: 0; maxNumOperands: 0),

(name: 'LOCAL'; expectedWord: ''; comType: tLOCAL; minNumOperands: 1; maxNumOperands: 1),

(name: 'SET'; expectedWord: '='; comType: tSET; minNumOperands: 2; maxNumOperands: 2),

(name: 'INC'; expectedWord: ''; comType: tINC; minNumOperands: 1; maxNumOperands: 1),

(name: 'DEC'; expectedWord: ''; comType: tDEC; minNumOperands: 1; maxNumOperands: 1));

 

{строковые константы}

COMMON_SEPARATOR        = ' '; // разделитель общего назначения

OPERAND_SEPARATOR       = ',()=!<>+-\*'; // разделитель операндов макрокоманд

PARAM_SEPARATOR         = ','; // разделитель параметров макроса

MACRO_DEF_SYMBOL        = '$'; // символ, с которого должно начинаться имя макроса

MACRO_MARK_SYMBOL       = '#';     // символ, с которого должно начинаться имя макрометка

ASM_MARK_SYMBOL         = '@'; // символ, с которого должно начинаться имя метки ассемблера

PARAM_SYMBOL            = '&'; // символ, с которого должно начинаться имя локальной переменной (параметра макроса)

MACRO_MARK_FORBIDDEN_SYMBOLS = ' &$,.;"()=!<>+-\*|#@'; // строка символов, запрещенных в имени макрометки

ASM_MARK_FORBIDDEN_SYMBOLS = ' &$,.;"()=!<>+-\*|#@'; // строка символов, запрещенных в имени ассемблерной метки

PARAM_FORBIDDEN_SYMBOLS = ' &$,.;"()=!<>+-\*|#@'; // строка символов, запрещенных в имени локальной переменной (параметра макроса)

DIGITS                  = '0123456789'; // строка цифр

 

type

TStrArray = array [0..MAX_STR_ARRAY_LEN - 1] of string; // массив строк

 

{

Описание: выполняет первый проход.

Параметры:

Code – массив строка исходного кода

numStr – количество строк исходного кода

Вывод:

Объект типа TResult.

}

function doFirstStep(code: array of string; numStr: integer): TResult;

{

Описание: выполняет второй проход.

Параметры:

Code – массив строка исходного кода

numStr – количество строк исходного кода

Вывод:

Объект типа TResult.

}

function doSecondStep(code: array of string; numStr: integer): TResult;

 

{

Описание: приостанавливает работу макропроцессора.

Параметры: отсутствуют.

Вывод: отсутствует.

}

procedure suspend;

{

Описание: возобновляет работу макропроцессора.

Параметры: отсутствуют.

Вывод: отсутствует.

}

procedure resume;

{

Описание: определяет возможность прерывать работу макропроцессора.

Параметры:

isSupendable – значение истина означает, что макропроцессор будет работать в прерываемом режиме, иначе в непрерываемом.

Вывод: отсутствует.

}

procedure setSuspendable(isSuspendable: boolean);

{

Описание: прерывает работу макропроцессора.

Параметры: отсутствуют.

Вывод: отсутствует.

}

procedure breakProcess;

 

{

Описание: заполняет массив макрометок, определенных на данный момент.

Параметры:

marks – заполняемый массив макрометок.

numMarks – количество макрометок.

Вывод: отсутствует.

}

procedure getCurrMacroMarks(var marks: array of TMacroMark; var numMarks: integer);

{

Описание: заполняет массив локальных переменных, определенных на данный момент.

Параметры:

locals – заполняемый массив локальных переменных.

numLocals – количество локальных переменных.

Вывод: отсутствует.

}

procedure getCurrLocals(var locals: array of TParamPair; var numLocals: integer);

{

Описание: заполняет массив результатов подстановки, определенных на данный момент.

Параметры:

output – заполняемый массив.

numOutputStr – количество строк в массиве.

Вывод: отсутствует.

}

procedure getCurrOutput(var output: array of string; var numOutputStr: integer);

{

Описание: заполняет массив макроопределений, определенных на данный момент.

Параметры:

macroDef – заполняемый массив макроопределений.

numMacroDefStr – количество строк в массиве макроопределений.

Вывод: отсутствует.

}

procedure getCurrMacroDef(var macroDef: array of TMacroDefStr; var numMacroDefStr: integer);

{

Описание: заполняет массив макродескрипторов, определенных на данный момент.

Параметры:

macroDesc – заполняемый массив макродескрипторов.

numMacroDesc – количество макросовдескрипторов.

Вывод: отсутствует.

}

procedure getCurrMacroDesc(var macroDesc: array of TMacroDesc; var numMacroDesc: integer);

{

Описание: возвращает текущее количество строк в выходном файле.

Параметры: отсутствуют.

Вывод: количество строк.

}

function getCurrStrNum: integer;

Описание: возвращает текущее значение флага isInMacroCall.

Параметры: отсутствуют.

Вывод: значение флага isInMacroCall.

}

function inMacroCall: boolean;

 

implementation

var

numMacroDefStr, // количество строк в таблице макроопределений

numMacroDesc,    // количество макродескрипторов

numParamConfigs, // количество конфигурации значений переменных

numCurrMarks,    // количество макрометок

numCurrLocals,   // количество локальных переменных

numCurrOutputStr, // количество строк в выходном файле

currStrNum,      // номер текущей обрабатываемой строки

markCounter: integer; // количество макрометок

 

isInMacroCall,   // флаг, определяющий, выполняется ли в данный момент обработка макровызова

isBroken,        // флаг, определяющий, была ли прервана программа

isSuspendable,   // флаг, определяющий, прерываем ли макропроцессор

isSuspended   : boolean; // флаг, определяющий, прервана ли работа макропроцессора

 

{ ТМО }

macroDef: array [0..MAX_MACRO_DEF_STR - 1] of TMacroDefStr;

{ ТИМ }

macroDesc: array [0..MAX_MACRO_DESC - 1] of TMacroDesc;

{ таблица конфигураций значений переменных }

paramConfig: array [0..MAX_CONFIGS - 1] of TParamConfig;

{ массив текущих макрометок }

currMarks: array [0..MAX_MARKS - 1] of TMacroMark;

{ массив текущих локальных переменных }

currLocals: array [0..MAX_LOCALS - 1] of TParamPair;

{ массив текущего вывода }

currOutput: array [0..MAX_OUTPUT_LEN - 1] of string;

Модуль Expr.

interface

uses

SysUtils, Strings;

Type

{ перечисление типов операций }

TOperationType = (noneOp, eqOp, lessOp, moreOp, lessEqOp, moreEqOp, addOp, negOp, posOp, subOp, mulOp, divOp, nonEqOp, notOp, andOp, orOp);

{тип операции по количеству операндов}        

TOperandType = (unary, binary);

{ структура операции }

TOperation = record

name  : string;        // имя

itsType: TOperationType; // тип операции

operandType: TOperandType; // тип операции по количеству операндов

prior : byte;             // приоритет

end;

 

const

MAX_OPS_IN_EXPR     = $FF;   // максимальное количество операций в выражении

OPD_MAX_VAL         = 4095;  // максимальное значение операнда

OPD_MIN_VAL         = -4096; // минимальное значение операнда

 

NUM_OPS             = 15;          // количество типов операций

BAD_INDEX           = -1;          // значение, которое возвращают функции получения индекса в случае, когда искомый элемент не найден

 

DEFAULT_RESULT      = 0;     // значение по умолчанию

NORM_EXPR           = 0;           // возвращается функцией, если выражение корректно

{ коды ошибок }

ERR_BAD_BRACKETS_ORDER = 39;   

ERR_NUM_BRACKETS    = 40;   

ERR_BAD_OPD_TYPE    = 41;              

ERR_OPERAND_EXPECTED = 42;        

ERR_BAD_OPER_TYPE   = 43;

ERR_OPERAND_OUT_OF_RANGE = 44;

 

{таблица операций}

OPERATIONS: array [0..NUM_OPS - 1] of TOperation =

((name:'=='; itsType: eqOp; operandType: Binary; prior: 0),

(name:'!='; itsType: nonEqOp; operandType: Binary; prior: 0),

(name:'<'; itsType: lessOp; operandType: Binary; prior: 0),

(name:'>'; itsType: moreOp; operandType: Binary; prior: 0),

(name:'<='; itsType: lessEqOp; operandType: Binary; prior: 0),

(name:'>='; itsType: moreEqOp; operandType: Binary; prior: 0),

(name:'+'; itsType: addOp; operandType: Binary; prior: 4),

(name:'-'; itsType: subOp; operandType: Binary; prior: 4),

(name:'*'; itsType: mulOp; operandType: Binary; prior: 5),

(name:'/'; itsType: divOp; operandType: Binary; prior: 5),

(name:'+'; itsType: posOp; operandType: Unary; prior: 6),

(name:'-'; itsType: negOp; operandType: Unary; prior: 6),

(name:'NOT'; itsType: notOp; operandType: Unary; prior: 3),

(name:'AND'; itsType: andOp; operandType: Binary; prior: 2),

(name:'OR'; itsType: orOp; operandType: Binary; prior: 1));

{разделители}

OPERATION_SEPARATOR = ' 0123456789()'; // строка разделителей операций

OPERAND_SEPARATOR = ' ()=!<>+-*/ABCDEFGHIJKLMNOPQRSTUVWXYZ';     // строка разделителей операндов

 

{

Описание: пытается вычислить значение выражения expr.

Параметры:

Expr – вычисляемое выражение;

Err – код ошибки;

errSubExpr – подвыражение, в котором обнаружена ошибка.

Вывод: значение выражения

}

function tryEvalExpr(expr: string; var err: byte; var errSubExpr: string): integer;

Модуль Strings.

interface

 

uses

 SysUtils;

 

{

Описание: возвращает предыдущую лексему из строки str, начиная с позиции charPos, используя разделители separators.

Параметры:

Str – строка из которой извлекается лексема;

charPos – позиция в строке, начиная с которой ищется лексема;

Separators – строка разделителей.

Вывод: лексема, либо пустая строка.

}

function getPrevLexem(str: string; var charPos: integer; separators: string): string;

{

Описание: возвращает следующую лексему из строки str, начиная с позиции charPos, используя разделители separators.

Параметры:

Str – строка из которой извлекается лексема;

charPos – позиция в строке, начиная с которой ищется лексема;

Separators – строка разделителей.

Вывод: лексема, либо пустая строка.

}

function getNextLexem(str: string; var charPos: integer; separators: string): string;

{

Описание: заменяет в строке str все вхождения лексемы oldLexem на newLexem.

Параметры:

Str – строка, в которой производится замена;

oldLexem – искомая лексема;

newLexem – новая лексема.

Вывод: отсутствует.

}

procedure replaceLexems(var str: string; const oldLexem, newLexem, separators: string);

 

Модуль Main.

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, MacroGen, Grids, ExtCtrls, Buttons, Expr;

 

const

 TMO_FILE_NAME = 'TMO.txt';      // имя файла для сохранения ТМО

 TIM_FILE_NAME = 'TIM.txt';      // имя файла для сохранения ТИМ

 

var

inputFileName: string = 'input.txt';    // имя файла с исходным кодом

outputFileName: string = 'output.txt';   // имя выходного файла

 

numSrcStr: integer;    // количество строк исходного кода

 

srcCode: array [0..MAX_SRC_LEN - 1] of string; // исходный код

 

 

{

Описание:загружает исходный код в массив srcCode.

Параметры:

fileName – имя файла с исходным кодом.

Вывод: код ошибки.

}

function loadSrcCode(fileName: string): integer;

 

{

Описание: выводит информацию о результатах работы макропроцессора в выходные файлы.

Параметры: отсутствуют.

Вывод: отсутствует.

}

procedure outResultInFiles;

 

Модуль Assembler.

 

interface

 

uses

AVLTree, SysUtils, macroGen;

 

{ структура строки исходного кода}

type

TComLine = record

SymbName,      // символическое имя

MOpCode,       // код операции

Opd1, Opd2: string; // значения операндов

end;

 

{ структура ассемблерной команды }

type

TOpCode = record

Name,          // имя

Code: string;  // код

Len: byte;     // длина

IsDir: boolean; // является ли директивой

Opd1, Opd2: byte; // типы операндов

end;

 

{ перечисление типов ошибок ассемблирования }

type

TErrTypes = (eNoErr, eSTART_MISSING, eEND_MISSING, eINCORRECT_OPCODE,

          eDUP_SYMB_NAME, eINCORRECT_OPD, eSYMB_NAME_NOT_FOUND,

          eTWO_MEM_OPD, eBAD_MARK_NAME);

 

{ структура ошибка ассемблирования }

type

TError = record

ErrType: TErrTypes; // тип

StrNum: byte;       // номер строки с ошибкой

end;

 

{ константы ассеблирования }

const

NumOps   = 10;   // кол-во команд ассемблера

NumReg   = 8;    // кол-во РОН

MaxLines = 256;  // макс. кол-во строк исходного кода

MaxSymbNames = 256;  // макс. кол-во символических имен

 

BytesPerBYTE = 1;    // кол-во байт, занимаемое значением типа BYTE

BytesPerWORD = 3;    // кол-во байт, занимаемое значением типа WORD

 

{ коды типов операндов }

oNONE    = 1;    // операнд отсутствует      

oREG     = 2;    // операнд - регистр

oVALUE   = 4;    // операнд – числовая константа

oEX_VALUE = 8;    // операнд – числовая константа (возможно неопределенное значение)

oSYMB_NAME = 16;   // операнд – символическое имя

oSTRING  = 32;   // операнд – строковая константа

 

MaxByteVal = $FF;  // максимальное значение переменной типа BYTE

MaxWordVal = $FFFFFF; // максимальное значение переменной типа WORD

MaxResBVal = $FF;  // максимальное кол-во элем-в переменной типа RESB

MaxResWVal = $55;  // максимальное кол-во элем-в переменной типа RESW

 

{ текстовое описание ошибок ассемблирования }

ErrText: array [TErrTypes] of string = ('',

                                     'Не найдена точка входа START',

                                     'Не найден конец программы END',

                                     'Неверный код операции',

                                     'Дублирование символического имени',

                                     'Некорректный операнд',

                                     'Символическое имя не найдено',

                                     'Оба операнда - символические имена',

                                     'Неверное имя метки');

 

{ имена РОН }

RegName: array [0..NumReg - 1] of string = ('R1', 'R2', 'R3', 'R4', 'R5', 'R6', 'R7', 'R8');

 

Var

{ таблица ассемблерных команд }

OpCodeTable: array [0..NumOps - 1] of TOpCode = ((Name:'ADD'; Code:'01'; Len:3; IsDir:false; Opd1: oREG or oSYMB_NAME; Opd2: oREG or oSYMB_NAME or oVALUE),

 (Name:'JUMP'; Code:'02'; Len:4; IsDir:false; Opd1: oSYMB_NAME;      Opd2: oNONE),

 (Name:'NOP'; Code:'03'; Len:1; IsDir:false; Opd1: oNONE;           Opd2: oNONE),

 (Name:'BYTE'; Code:'04'; Len:0; IsDir:true; Opd1: oEX_VALUE or oSTRING; Opd2: oNONE),

 (Name:'WORD'; Code:'05'; Len:0; IsDir:true; Opd1: oEX_VALUE;       Opd2: oNONE),

 (Name:'RESB'; Code:'06'; Len:0; IsDir:true; Opd1: oEX_VALUE;       Opd2: oNONE),

 (Name:'RESW'; Code:'07'; Len:0; IsDir:true; Opd1: oEX_VALUE;       Opd2: oNONE),

 (Name:'START'; Code:'08'; Len:0; IsDir:true; Opd1: oVALUE;          Opd2: oNONE),

 (Name:'END'; Code:'09'; Len:0; IsDir:true; Opd1: oNONE or oVALUE; Opd2: oNONE),

 (Name:'MOV'; Code:'0A'; Len:3; IsDir:false; Opd1: oREG or oSYMB_NAME; Opd2: oREG or oSYMB_NAME or oVALUE));

 

InputTable, TempTable: array [0..MaxLines - 1] of TComLine; // код, обработанный макроассемблеров и промежуточная таблица ассемблирования

Output: array [0..MaxLines - 1] of string; // объектный код

SymbNameTree: TAVLTree;     // дерево символических имен

 

NumSymbNames,    // кол-во символических имен

NumLines: byte;  // кол-во строк в объектном файле

 

ProgLen: cardinal; // длина исходного кода

 

{

Описание: выполняет 1-й проход ассемблирования.

Параметры:

inputTable – таблица исхоных кодов.

tempTable – промежуточная таблица ассемблирования.

symbNameTree – дерево символических имен.

numSymbNames – кол-во сисволических имен.

Error – код ошибки.

numComLines – кол-во строк исходного кода.

progLen – длина программы в байтах.

Header – возвращаемая запись типа H.

Вывод: отсутствует.

}

procedure FirstParse(InputTable: array of TComLine; var TempTable: array of TComLine; SymbNameTree: TAVLTree; var NumSymbNames: byte; var Error: TError; NumComLines: byte; var ProgLen: cardinal; var Header: string);

 

{

Описание: выполняет 2-й проход ассемблирования.

Параметры:

tempTable – промежуточная таблица ассемблирования.

Output – объектный файл.

Error – код ошибки.

SymbNameTree – дерево символических имен.

numSymbNames – кол-во символических имен.

numComLines – кол-во строк исходного кода.

Вывод: отсутствует.

}

procedure SecondParse(TempTable: array of TComLine; var Output: array of string;

var Error: TError; SymbNameTree: TAVLTree; NumSymbNames: byte; NumComLines: byte);

 


Поделиться с друзьями:

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.451 с.