Національний Технічний Університет
«Харківський Політехнічний Інститут»
Звіт
з лабораторної роботи № 7
з дисципліни «системного програмування»
Виконав: студент
групи КІТ-14в
Богачов О. С.
Викладачі:
Межерицький С. Г.
Харків-2006 р.
Асемблери.
Ціль роботи: засвоїти принципи написання та функціонування компіляторів програм та придбати практичні навички в розробці програм компіляції (асемблювання) на прикладі написання компілятора початкового модулю (файла), написаного на мові асемблера.
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define PT_EOST 0
#define PT_SIGN 1
#define PT_WORD 2
#define PT_LABEL 3
#define MAXSTR 64
#define DIR_SEG 0
#define DIR_DB 1
#define DIR_DW 2
#define DIR_ENDS 3
#define DIR_DD 8 //new
#define DIR_ASSUME 4 //new
#define OP_DEC 1
#define OP_JL 11 //new
#define OP_JB 12 //new
char *directives[] = {"SEGMENT","DB","DW","ENDS","ASSUME","","","","DD"} ;/*Директивы */
char *registers[] = {
"AX","CX","DX","BX","SP","BP","SI","DI",
}; /*Регистры */
char *mnemonics[] = {
"MOV" , "DEC" , "INC",
"ADD" , "SUB" , "CMP",
"OR" , "XOR" , "AND",
"IN" , "OUT" , "JB", "JL" , //new
"END"
}; /*Мнемоники команд */
struct seg_tab /*Таблица сегментов */
{
char name[MAXSTR]; /*Имя*/
int length; /*Длина*/
};
struct sym_tab /* Таблица символов*/
{
char mnem[MAXSTR]; /*Имя символа*/
char type[MAXSTR]; /*Тип*/
char atrib[MAXSTR]; /*Базовый адрес*/
int ef_adr; /* Смещение */
};
struct label_tab
{
char mnem[MAXSTR]; /* Имя метки */
char type[MAXSTR]; /* Тип */
char atrib[MAXSTR]; /* Базовый адрес */
int ef_adr; /* Смещение */
} ;
struct seg_tab segtab[20];
struct sym_tab symtab[20];
struct label_tab labeltab[20];
/* Объектные коды команд */
char *mnem[]={"8B","04","04","03","2B","3D","OB","33","23","ED","EF","72","7C"};
/* Объектные коды первых операндов команд */
char cop1[]={'C','C','D','D','E','E','F','F'};
/* Объектные коды вторых операндов команд */
char cop2[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
/* Тип операции
0 - команда без операндов
1 - команда имеет один операнд
2 - команда имеет два операнда */
int operandcount[]={2,1,1,2,2,2,2,2,2,2,2,1,1,0};
/* Разделители */
char signs[] = "~!@#$%^&*()_)+|`\\=,./<>?;':\"";
char signs1[] = "~!@#$%^&*()_)+|`\\=,./<>?;'\"";
/* Тип символа */
char *sym[]={"NEAR","BYTE","WORD","NEAR","","","","","DWORD"};
/* Конец строки и табуляция */
char separators[] = "\t \r\n";
char parsetyp = 0; /* Тип выделеной лексемы */
char lexbuf[MAXSTR]; /* Сюда считывается лексема */
char cmdbuf[MAXSTR]; /* Сюда считывается строка из файла */
int j=0;
int n,number=0,offs;
FILE *F,*F1;
/* Функция сравнения лексемы с десятичным числом */
int strtoi(char *s, int *i) /* В случае равенства
принимает значение 0 */
{
int sign;
int val;
val = 0;
if(!*s)
return -1;
if(*s == '-')
{
sign = -1;
s++;
}
else
sign = 1;
while(*s)
{
if(*s < '0') return -1;
if(*s > '9') return -1;
val *= 10;
val += *s - '0';
*s++;
}
*i = val * sign;
return 0;
}
/* Функция преобразования прописных символов в строчные */
void strupcase(char *s)
{
while(*s)
{
if((*s > ('a' - 1)) && (*s < ('z'+1)))
*s -= ('z' - 'Z');
s++;
}
}
/* Функция сравнения двух строк :
если стоки не равны,принимает значение 0
если равны , то 1 */
char strcomp(char *s1, char *s2)
{
while(*s1)
{
if(*s1 != *s2)
return 0;
s1++;
s2++;
}
if(*s2)
return 0;
return 1;
}
/* Функция поиска символа в массиве символов :
если символ найден, то 1, иначе 0 */
int strconsist(char *s, char c)
{
while(*s)
if(*s++ == c)
return 1;
return 0;
}
/* Функция выделения лексемы из строки str
parsetype=PT_EOST -символ конца строки или табуляции,либо пробел
PT_SIGN -разделитель
PT_LABEL -метка */
char *parse(char *buf, char *str)
{
char c;
while(*str)
{
c=*str;
if(!strconsist(separators,c))
{
if(strconsist(signs,c))
{
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.