У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент


var[e++]=in[i++];

for(;isdigit(in[i]);i++,e++) var[e]=in[i];

var[e]=0;

fprintf(fout,"\tmov al,byte ptr %s \n\tcmp al,%s \n\tjnz m%i\n",sw_var,var,l_num);

i++;

STATE[++BLOCKS]=1;}

if(in[i]=='{'){

i++;

Scaner();

continue;}

if(!isalpha(in[i])){

i++;

continue;}

for(e=0;isalpha(in[i])&&in[i]!='=';i++,e++) var[e]=in[i];

var[e]=0;

v=0;

i++;

d=1;

for(e=0;in[i+e]!=';';e++)

if(!isdigit(in[i+e])&&in[i+e]!='-'){

d=0;

break;}

if(d){

 

Арк.

12

Зм. | Арк. | № докум | Підпис | Дата

i+=e;

continue;}

for(e=0;in[i+e]!=';';e++){

if(!isalpha(in[i+e])){

v=0;

break;}

v=1;

op1[e]=in[i+e];}

if(v){

op1[e]=0;

i+=e;

fprintf(fout,"\tmov al,byte ptr[%s] \n\tmov byte ptr[%s],al \n",op1,var);

continue;}}

if(STATE[BLOCKS]==0) i++;

if(STATE[BLOCKS]==1){

BLOCKS--;

fprintf(fout,"m%d:",l_num++);}}

int main(int argc,char**argv){

fin=fopen(argv[1],"r");

fout=fopen("res.asm","w+");

for(i=0;!feof(fin);i++) in[i]=fgetc(fin);

filesize=i;

fprintf(fout,".model small \n.stack 100h \n.data\nconv\tdt 0\n");

for(i=0;i<filesize;i++){

for(e=found=0;isalpha(in[i]);e++,i++){

found=1;

var[e]=in[i];}

if(found){

var[e]=0;

new_entry=1;

if(strcmp(var,"cin")==0||strcmp(var,"case")==0||strcmp(var,"switch")==0)

Арк.

13

Зм. | Арк. | № докум | Підпис | Дата

continue;

if(strcmp(var,"cout")==0){

i+=2;

if(in[i]!='"')

continue;

else{

fprintf(fout,"str%d\tdb '",str_num++);

i++;

while(in[i]!='"') fputc(in[i++],fout);

fprintf(fout,"',0Ah,'$'\n");

continue;}}

for(k=0;k<max_id;k++)

if(strcmp(id[k],var)==0){

new_entry=0;

break;}

if(new_entry){

fprintf(fout,"%s\tdw ",var);

for(e=0;var[e]!=0;e++) id[max_id][e]=var[e];

id[max_id++][e]=0;

if(in[i]=='='){

d=1;

i++;

if(in[i]=='-') fprintf(fout,"%c",in[i++]);

for(e=0;in[i]!=';';i++){

if(!isdigit(in[i])){

d=0;

break;}

var[e++]=in[i];}

var[e]=0;

if(d) fprintf(fout,"%s \n",var);

else fprintf(fout,"0 \n");}

Арк.

14

Зм. | Арк. | № докум | Підпис | Дата

else fprintf(fout,"0 \n");}}}

fprintf(fout,".code\nmain:\tmov ax,@data\n\tmov ds,ax\n\n");

str_num=0;

i=0;

while(in[i]!='{') i++;

Scaner();

fclose(fin);

fprintf(fout,"\tmov ah,1\n\tint 21h\n\tmov ax,4C00h\n\tint 21h\n\n");

fin=fopen("routines.txt","r");

while(!feof(fin)) fputc(fgetc(fin),fout);

fclose(fin);

fseek(fout,-1,1);

fprintf(fout,"end main");

fclose(fout);

system("tasm.exe res.asm");

system("tlink.exe res.obj");}

Арк.

15

Зм. | Арк. | № докум | Підпис | Дата

4 ТЕКСТ ПІДПРОГРАМ

; Підпрограма вводу 8-розрядної знакової змінної з клавіатури з

; використанням функції 01h операційної системи MSDOS. Параметром

; підпрограми є зміщення змінної в ВХ. Введення числа припиняється після

; вводу 3 цифр (+ знак ‘–‘ ) або натиснення клавіші Enter.

input: mov byte ptr conv+9,0 ; Попередньо вважаємо число додатнім

xor dx,dx ; DX=0

mov cx,5 ; Число цифр, що можна ввести

mov ah,1 ; Функція вводу символу

int 21h ; з клавіатури

cmp al,'-' ; Від'ємний знак?

jnz plus_i ; Ні, додатній (в AL перша цифра числа)

mov byte ptr conv+9,80h ; Запис знаку

d_in: int 21h ; Ввід символу

plus_i: cmp al,0Dh ; Це Enter?

jz end_i ; Так, кінець вводу числа

shl dx,4 ; Зсув числа для вставки тетради

and al,0Fh ; Очищення зайвих біт

or dl,al ; Вставка тетради

loop d_in ; Повтор циклу 3 разів

end_i: mov word ptr conv,edx ; Запис числа

finit ; Очищення стеку 8087

fbld tbyte ptr conv ; Читання числа в 8087

fist word ptr [bx] ; Збереження числа за адресою змінної

ret ; Вихід з підпрограми

; Підпрограма виводу 8-розрядної знакової змінної на екран з використанням

; функції 02h операційної системи MSDOS. Передуючі нулі числа не виводяться.

; Параметром підпрограми є зміщення змінної в ВХ.

print: finit ; Очищення стеку 8087

Арк.

16

Зм. | Лист | № докум | Підпис | Дата

fild word ptr [bx] ; Читання змінної в 8087

fbstp tbyte ptr conv ; Запис двійково-десяткового числа

mov ah,2 ; Функція виводу на екран

test byte ptr conv+9,80h ; Перевірка знаку числа

jz plus_p ; Обхід, якщо плюс

mov dl,'-' ; Вивід від'ємного

int 21h ; знаку числа

plus_p: cmp word ptr conv,0 ; Перевірка число на нуль

jnz show ; Вивід ненульового числа

mov dl,'0' ; Вивід нуля

int 21h

jmp end_p ; Перехід в кінець підпрограми

show: mov cl,8 ; Число зсувів числа для аналізу

xor al,al ; Прапорець ненульової тетради = 0

mov bx,word ptr conv ; Збереження числа в регістрі

d_out: mov dx,bx ; Копіювання числа

shr dx,cl ; Зсув для аналізу тетради

and dl,0Fh ; Очищення зайвих біт

test al,1 ; Перевірка прапорця

jnz skip_c ; Пропуск, якщо AL[0]=1

test dl,dl ; Перевірка на нуль

jz zero_n ; Нульова тетрада

skip_c: or dl,30h ; Приведення до ASCII символу

int 21h ; Вивід тетради

mov al,1 ; Знайдена ненулова тетрада

zero_n: sub cl,4 ; Продовження виводу,

jns d_out ; доки CX не дорівнює -4

end_p: mov dl,0Ah ; Перехід в наступний рядок

int 21h ; після виводу змінної

ret ; Вихід з підпрограми

Арк.

17

Зм. | Лист | № докум | Підпис | Дата

ВИСНОВКИ

В даному проекті розроблений компілятор, який дозволяє створювати спрощені програми з виводом текстових повідомлень та розгалуженнями на основі умовного оператора CASE. Операції присвоєння та порівняння реалізовані для однобайтових констант та змінних. Окрім цього реалізовані функції вводу з клавіатури та виводу змінних на екран. Результатом роботи компілятора є *.exe файл.

Арк.

18

Зм. | Арк. | № докум | Підпис | Дата

ПЕРЕЛІК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ

Іщеряков С. М. ОСНОВИ МОВИ АСЕМБЛЕР: конспект лекцій з курсів “Системне програмування”, “Системне програмування та операційні системи. – Івано-Франківськ: Факел, 2004. – 52 с.

Григорьев В. Л. Программирование однокристальных микропроцессоров. – М.: Энергоатомиздат, 1987. – 288 с.

Зубков С.В. Assembler для DOS, Windows и UNIX – 3-е изд., стер. – М.: ДМК Пресс; СПб.: Питер, 2004. – 608с.

Джорден Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT: Пер. с англ./ Предисл. Н.В. Гайского. – М.: Финансы и статистика, 1992. – 544с.

Фролов А.В., Фролов Г.В. MS-DOS для программиста. – М.: ДИАЛОГ-МИФИ, 1995. – 256с.

Системное программное обеспечение. Учебник для вузов/ А.Ю. Молчанов. - СПб: Питер, 2003. – 396 с.

Костельцев А.В. Построение интерпретаторов и компиляторов. – СПб: Наука и техника, 2001. – 224 с.

Велихов А.В. Макроассемблер: Создание и отладка программ. – М.: Майор, 2001. – 192 с. – (Мой компьютер). 1. Компаниец Р.И., Маньков Е.В., Филатов Н.Е. Системное програмирование. Основы построения трансляторов. - С-П: Корона принт, 2000.

Харт, Джонсон. Системное программирование в среде Win32. 2-е изд. Пер.с англ. – М.: Издательский дом „Вильямс”, 2001. – 464 с.: ил.

Гук М. Дисковая подсистема ПК. - СПб.: Питер, 2001. – 336с.: ил.

Юров В.Assembler. Специальный справочник. – СПб.: Питер, 2001. – 496 с.: ил.

Пирогов В.Ю. Assembler. Учебный курс. - М.: Нолидж, 2001.

А.В.Фролов, Г.В.Фролов. Апаратное обеспечение ПК, том 2. – М.: Диалог-МИФИ, 1998. – 272 с.

Арк.

19

Зм. | Арк. | № докум | Підпис | Дата


Сторінки: 1 2