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
Зм. | Арк. | № докум | Підпис | Дата