Автор работы: Пользователь скрыл имя, 21 Марта 2015 в 19:50, курсовая работа
Транслятор С0 переводит исходную программу с языка С0 на язык ассемблера IBM PC. Таким образом, использование языка ассемблера в качестве объектного языка делает его однопроходным и более удобным в понимании основных методов трансляции, избежав многочисленных деталей генерации машинного кода.
ЗАДАНИЕ……………………………………………………………..
ОПИСАНИЕ ПРИМЕНЕНИЯ………………………………………..
Общие сведения о трансляторе С0…………………………….
Возможности языка C0………………………………………...
Использование компилятора C0………………………………
Сообщения об ошибках………………………………………...
ОПИСАНИЕ ПРОГРАММЫ…………………………………………
Описание новых возможностей языка C0…………………….
3.1.1 Тип данных: char………………………………………..…
3.1.2 Дополнительные операции: ++,--……………………...
3.1.3 if else…………………………………………………
3.1.4 Тип комментария: \………………………………………...
3.1.5 Тип констант: 16……………………………………………
Список подпрограмм транслятора С0 ………………………..
ТЕСТИРОВАНИЕ ПРОГРАММЫ …………………………………..
ЗАКЛЮЧЕНИЕ………………………………………………………..
СПИСОК ЛИТЕРАТУРЫ…………………………………
chsim();
}
}
return leksema;
}
3.1.5. Константа 16-ная.
/*****************************
/* чтение лексемы */
/*****************************
enum tipleks chleks()
{
.
.
.
.
else
if (*usim >= '0' && *usim <= '9')
{
/* цифра */
/* чтение числа */
znach = 0;
leksema = chislo;
if (*usim == '0')
{
chsim();
if (*usim == 'X' || *usim == 'x')
{
mn = 16;
chsim();
}
}
while (*usim >= '0' && *usim <= '9' || mn == 16 &&
(*usim >= 'A' && *usim <= 'F' || *usim >= 'a' && *usim <= 'f'))
{
if (znach > 32767)
{
oshibka(1);
znach = 0;
/*пpопуск цифp*/
while (chsim() >= '0' && *usim <= '9' || mn == 16 &&
(*usim >= 'A' && *usim <= 'F' || *usim >= 'a' && *usim <= 'f'));
}
else
{
if (*usim >= '0' && *usim <= '9')
{
znach = mn * znach + *usim - '0';
chsim();
}
else
{
if (*usim >= 'a' && *usim <= 'f') *usim = *usim - 'a' + 'A';
if (*usim >= 'A' && *usim <= 'F' && mn == 16)
{
znach = mn * znach + *usim - 'A' + 10;
chsim();
}
else
{
oshibka(23);
znach = 0;
/*пpопуск цифp*/
while (chsim() >= '0' && *usim <= '9' || mn == 16 &&
(*usim >= 'A' && *usim <= 'F' || *usim >= 'a' && *usim <= 'f'));
}
}
}
}
3.2. Список подпрограмм транслятора С0
Список подпрограмм транслятора С0 представлен в таблице 1.
Таблица 1
Номер строки |
Имя |
Назначение |
Вызываемые функции |
816
924
1106
136
584
382
217
243
269
991
369
950
977
465
768
959
796 |
chleks
chsim
kodret
main
operac
operatr
opisper_int
opisper_ptr
oprfun
oshibka
poslop
pozic
test
virag
vitsk
vkluch
zopreg(z,t,r)
|
Чтение очередной лексемы и присваива ние её значения переменной leksema.
Чтение символа.
Генерация кода оператора return.
Трансляция конструкции «программа».
Компиляция/интерпретация операции выражения.
Трансляция конструкции оператор.
Трансляция конструкции «описание переменных» для типа int.
Трансляция конструкции «описание переменных» для типа ptr
Трансляция конструкции «описание функции».
Генерация сообщения о типе и позиции ошибки.
Трансляция последовательности операторов вида “[оператор]…}”.
Поиск позиции имени в таблице имён.
Проверка лексемы. В случае ошибки – выдача сообщения и пропуск части тела программы.
Трансляция выражения (определение порядка операций).
Выталкивание из стека скобки “(“ или “имя(“.
Включение имени в таблицу имён.
Генерация кода загрузки в регистр r операнда z типа t. |
chsim.
—
—
opisper_int, opisper_ptr, test,oprfun.
oshibka.
virag,chleks, poslop, operator,oshibka, kodret,test. pozic, oshibka vkluch,chleks.
pozic, oshibka vkluch,chleks.
opisper, pozic, oshibka vkluch,chleks.
operator,chleks, test.
—
oshibka chleks.
chleks,pozic,vkluch, oshibka, operac,vitsk zopreg,test
zopreg, , oshibka.
oshibka.
adrper,oshibka . |
4. ТЕСТИРОВАНИЕ ПРОГРАММЫ
Для тестирования новых возможностей языка C0 на вход транслятора подавалась следующая программа на языке С0:
int g,h,f;
main ()
{
g=0xC8;
f=g;
f++;//primer so skobkoi
putn(f);
putchar(10);
putchar(13);
if (f>200)
{
do
{
h=g--;
putn(h);
putchar(10);
putchar(13);
}
while(h!=190);
}
getch();
}
На выходе сформировался файл p.asm следующего содержания:
ASSUME CS:KOM_,SS:STEK_,DS:
STEK_ SEGMENT STACK
DW 10000 DUP (?)
DNOST_ DW ?
STEK_ ENDS
;int g,h,f;
;main ()
KOM_ SEGMENT
_main PROC FAR
MOV AX,DAN_
MOV DS,AX
MOV AX,STEK_
MOV SS,AX
;{
;
; g=0xC8;
LEA SP,DNOST_
PUSH BP
MOV BP,SP
MOV AX,200
; f=g;
MOV _g,AX
MOV AX,_g
; f++;//primer so skobkoi
MOV _f,AX
INC _f
; putn(f);
MOV AX,_f
MOV AX,_f
PUSH AX
; putchar(10);
CALL _putn
MOV AX,10
PUSH AX
; putchar(13);
CALL _putchar
MOV AX,13
PUSH AX
; if (f>200)
CALL _putchar
MOV BX,200
MOV AX,_f
CMP AX,BX
MOV AX,1
JG CC_1
SUB AX,AX
CC_1:
; {
TEST AX,AX
JNZ CC_2
JMP CC_3
; do
CC_2:
; {
; h=g--;
CC_4:
DEC _g
MOV AX,_g
; putn(h);
MOV _h,AX
MOV AX,_h
PUSH AX
; putchar(10);
CALL _putn
MOV AX,10
PUSH AX
; putchar(13);
CALL _putchar
MOV AX,13
PUSH AX
; }
; while(h!=190);
CALL _putchar
MOV BX,190
MOV AX,_h
CMP AX,BX
MOV AX,1
JNE CC_5
SUB AX,AX
CC_5:
TEST AX,AX
; }
JNZ CC_4
; getch();
CC_3:
;}
CALL _getch
POP BP
MOV AH,4CH
INT 21H
;
_main ENDP
INCLUDE std.asm
KOM_ ENDS
DAN_ SEGMENT
_g DW ?
_h DW ?
_f DW ?
DAN_ ENDS
END _main
;Компилятоp С0 от 10/04/08:
;колич. ошибок 0
В результате ассемблирования, компоновки и выполнения данной программы на экране сформировался следующий результат:
C:\DOCUME~1\9335~1\C316~1\
201
199
198
197
196
195
194
193
192
191
190
ЗАКЛЮЧЕНИЕ
В результате выполнения данной курсовой работы были более подробно рассмотрены методы трансляции, а также произведено самостоятельное расширение возможностей транслятора.
СПИСОК ЛИТЕРАТУРЫ