ЛАБОРАТОРНАЯ РАБОТА № 1
Тема: " ИЗУЧЕНИЕ РАБОТЫ КОМПИЛЯТОРОВ
ЯЗЫКОВ PASCAL, CИ, ASSEMBLER ".
Цель работы: ознакомление с компиляторами. Изучение особенностей компиляции.
Анализ кода, полученного в результате компиляции.
Индивидуальное задание: Дан массив из 9-ти целых чисел. Найти 1-й положительный элемент.
В соответствии с индивидуальным заданием написать три программы:
1 - на языке Pascal (файл pas1.pas)
2 - на языке C (файл cpp1.c)
3 - на языке Assembler (файл asm1.asm)
Провести компиляцию каждого файла и получить загружаемые файлы
pas1.exe, cpp1.exe, asm1.exe.
Используя отладчик debug.exe, получить листинги машинных кодов
программ и провести анализ этих кодов.
Тексты программ:
1 - наязыке Pascal (pas1.pas)
program labcp1;
uses crt;
const a:array [1..9] of integer=(-12,-10,-3,5,-6,7,-3,-2,-23);
var
i,l:integer;
begin
clrscr;
l:=$5555;
for i:=1 to 9 do
if(a[i]>0)then exit;
l:=$5555;
writeln('OK');
end.
Листинг машинных кодов pas1.exe:
1803:0022 C70664000100 MOV WORD PTR [0064],0001
1803:0028 EB04 JMP 002E
1803:002A FF066400 INC WORD PTR [0064]
1803:002E 8B3E6400 MOV DI,[0064]
1803:0032 D1E7 SHL DI,1
1803:0034 83BD000000 CMP WORD PTR [DI+0000],+00
1803:0039 7E02 JLE 003D если <=
1803:003B EB29 JMP 0066
1803:003D 833E640009 CMP WORD PTR [0064],+09
1803:0042 75E6 JNZ 002A
1803:0044 C70666005555 MOV WORD PTR [0066],5555
00064=i cмещение переменной i в памяти
00066=l смещение переменной l в памяти
Данный листинг показывает, что Паскаль для поиска максимального элемента в массиве, использовал код (алгоритм) из 11-ти строк, что на пять строк меньше чем в коде Си, но на 6-ть строк больше чем это реализовывает ассемблер . Данный алгоритм не является эффективным из-за того, что все переменные находятся в памяти компьютера, в результате чего скорость выполнения данного кода будет не выше, а даже ниже чем в Си.
2 - на языке C++ (файл cpp1.cpp)
#include<conio.h>
#include<stdlib.h>
#include<iostream.h>
void main()
{ clrscr();
int a[9]={-12,-10,-3,5,-6,7,-3,-2,-23};
int l;
l=0x5555;
for(int i=0;i<9;i++)
{ if (a[i]>0) exit(1);
}
l=0x5555;
}
Листинг машинных кодов cpp1.exe:
1804:02B0 33F6 XOR SI,SI
1804:02B2 EB17 JMP 02CB
1804:02B4 8BDE MOV BX,SI
1804:02B6 D1E3 SHL BX,1
1804:02B8 8D46EC LEA AX,[BP-14]
1804:02BB 03D8 ADD BX,AX
1804:02BD 833F00 CMP WORD PTR [BX],+00
1804:02C0 7E08 JLE 02CA <=
1804:02C2 B80100 MOV AX,0001
1804:02C5 50 PUSH AX
1804:02C6 E88F00 CALL 0358
1804:02C9 59 POP CX
1804:02CA 46 INC SI
1804:02CB 83FE09 CMP SI,+09
1804:02CE 7CE4 JL 02B4 <
1804:02D0 C746FE5555 MOV WORD PTR [BP-02],5555
bp-14=a смещение переменной a в памяти
3 - наязыке Assembler (asm1.asm)
data segment
a dw -12,-10,-3,5,-6,7,-3,-2,-23
pol dw ?
data ends
code segment
assume cs:code, ds:data
nach:
mov ax,data
mov ds,ax
mov cx,9
mov si,offset a
mov ax,7777h
m1:cmp word ptr [si],0
jg m2 ; переход на m2, если элемент массива положительный
add si,2
loop m1
m2:mov ax,7777h
mov ah,4ch
int 21h
code ends
end nach
Листинг машинных кодов asm1.exe:
1805:000E 833C00 CMP WORD PTR [SI],+00
1805:0011 7F05 JG 0018 >
1805:0013 83C602 ADD SI,+02
1805:0016 E2F6 LOOP 000E
1805:0018 B87777 MOV AX,7777
Вывод: Таким образом мы практически установили, что самым маленьким по размеру листинг машинных кодов является листинг на языке ассемблер, затем следует язык Pascal и С++. По своей эффективности, т.е. по скорости реализации программы, они идут в таком порядке:1)ассемблер;
2)C++;
3)Pascal.
Следовательно, самым быстрым и экономичным из предложенных к рассмотрению кодов, является код ассемблера.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.