close

Вход

Забыли?

вход по аккаунту

?

9 (3)

код для вставкиСкачать
Лабораторная работа №9
Генерация кода
Генерация кода на ассемблере, с помощью которого после компиляции и компоновки новой программы, можно будет получить результат
Таким образом, изменим в программе синтаксического анализа процедуры procedure ff ; procedure tt ; procedure ee и получим:
Код программы (pascal)
procedure tt;
begin
ff;
scan1(t,n);
while not(((t='r')and((n=7)or(n=10)or(n=11)or(n=17)or(n=9)or(n=14)or(n=15)or(n=5)or(n=3)))or((t='R')and((n=4)or(n=5)or(n=6)))) do
begin
scan(t,n);
if (t='r') then
case n of
12: begin
ff;
writeln(final,'pop bx');
writeln(final,'pop ax');
writeln(final,'mul bx');
writeln(final,'push ax');
end;
13: begin
ff;
writeln(final,'pop bx');
writeln(final,'pop ax');
writeln(final,'div bx');
writeln(final,'push ax');
end;
else begin
err('ожидалось арифметическое действие');
end;
end
else err(' ожидалось арифметическое действие ');
scan1(t,n);
end;
end;
procedure ee;
begin
tt;
scan1(t,n);
while not(((t='r')and((n=7)or(n=17)or(n=9)or(n=14)or(n=15)or(n=5)or(n=3)))or((t='R')and((n=4)or(n=5)or(n=6)))) do
begin
scan(t,n);
if (t='r') then
case n of
10: begin
tt;
writeln(final,'pop bx');
writeln(final,'pop ax');
writeln(final,'add ax,bx');
writeln(final,'push ax');
end;
11: begin
tt;
writeln(final,'pop bx');
writeln(final,'pop ax');
writeln(final,'sub ax,bx');
writeln(final,'push ax');
end;
else begin
err(ожидалось арифметическое действие ');
end;
end
else err(ожидалось арифметическое действие ');
scan1(t,n);
end;
end;
procedure ff;
var temps:string;
k:integer;
begin
scan(t,n);
case t of
'c': begin
writeln(final,'mov ax,',sl);
writeln(final,'push ax');
end;
'i': begin writeln(final,'mov ax,',sl);
writeln(final,'push ax');
end;
'r': begin
if (n=6) then
begin
ee;
scan(t,n);
if not ((t='r')and(n=7)) then err('ожидалась закрывающая скобка');
end
else err('ожидалась открывающая скобка')
end
else err('неожиданный символ');
end;
end;
Главный метод программы:
begin
prepare;
writeln(final,'.model tiny');
writeln(final,'.code');
writeln(final,'.386');
writeln(final,'org 100h');
writeln(final,'start:');
ee;
writeln(final,'pop ax');
writeln(final,'mov bx,10');
writeln(final,'mov di,0');
writeln(final,'mov si,ax');
writeln(final,'cmp ax,0');
writeln(final,'jns @a');
writeln(final,'neg si');
writeln(final,'mov ah,2');
writeln(final,'mov dl, "-"');
writeln(final,'int 21h');
writeln(final,'mov ax,si');
writeln(final,'@a:');
writeln(final,'mov dx,0');
writeln(final,'div bx');
writeln(final,'add dl, 30h');
writeln(final,'mov vivod [di],dl');
writeln(final,'inc di');
writeln(final,'cmp al,0');
writeln(final,'jnz @a');
writeln(final,'mov cx,di');
writeln(final,'dec di');
writeln(final,'mov ah,2');
writeln(final,'@b:');
writeln(final,'mov dl,vivod[di]');
writeln(final,'dec di');
writeln(final,'int 21h');
writeln(final,'loop @b');
writeln(final,'mov dl, " "');
writeln(final,'int 21h');
writeln(final,'ret');
writeln(final,'end start');
if (buf[ub]='(') then count:=count+1 else if (buf[ub]=')') then count:=count-1;
if (count<>0) then err(0);
writeln(' Строка правильная');
close(f);
assign(f,'D:\tab_i.txt');
append(f);
for i:=1 to z-1 do
writeln(f,tab_i[i]);
close(f);
end;
Выполнение
Исходный файл: 30+(40/2)-(13*3)#
Получим: 11
.model tiny
.code
.386
org 100h
start:
mov ax,30
push ax
mov ax,40
push ax
mov ax,2
push ax
pop bx
pop ax
div bx
push ax
pop bx
pop ax
add ax,bx
push ax
mov ax,13
push ax
mov ax,3
push ax
pop bx
pop ax
mul bx
push ax
pop bx
pop ax
sub ax,bx
push ax
pop ax
mov bx,10
mov di,0
mov si,ax
cmp ax,0
jns @met7
neg si
mov ah,2
mov dl, "-"
int 21h
mov ax,si
@met7:
mov dx,0
div bx
add dl, 30h
mov vivod [di],dl
inc di
cmp al,0
jnz @met7
mov cx,di
dec di
mov ah,2
@met8:
mov dl,vivod[di]
dec di
int 21h
loop @met8
mov dl, " "
int 21h
ret
end start
Документ
Категория
Рефераты
Просмотров
10
Размер файла
25 Кб
Теги
1/--страниц
Пожаловаться на содержимое документа