Міністерство Освіти і Науки України
Національний Технічний Університет
Лабораторна робота № 1
по курсу “Системне програмування”
на тему:
“Вивчення роботи компіляторів мов Pascal, C та Assembler”
Виконав:
студент групи КІТ-11А
Ткаченко С. М.
Мета роботи:
Ознайомлення з компіляторами. Вивчення особливостей компіляції. Аналіз коду, отриманого в результаті компіляції.
Індивідуальне завдання:
Маємо масив 10 байтів. Знайти кількість чисел, більших 128 та менших 144.
1.Вивчення компілятора мови Pascal.
1.1.Текст програми мовою Pascal:
uses crt;
const
N = 10;
var
mas : array [1..N] of byte;
i, c, flag : integer;
begin
clrscr;
c := 0;
for i := 0 to N do
begin
mas[i] := 120 + random(30);
write( mas[i] : 4 );
end;
flag := $7777;
for i := 0 to N do
if (mas[i] > 128) and (mas[i] < 144) then
c := c + 1;
flag := $7777;
write( c : 10 );
end.
1.2.Лістінг фрагменту програми:
1CE5:006A C70660007777 MOV WORD PTR [0060],7777
1CE5:0070 31C0 XOR AX,AX ;(AX) = 0
1CE5:0072 A35C00 MOV [005C],AX ;(DS):[005C] = i = 0
1CE5:0075 EB04 JMP 007B ;(IP) = 007B
1CE5:0077 FF065C00 INC WORD PTR [005C] ; i++
1CE5:007B 8B3E5C00 MOV DI,[005C] ; (DI) = 0000:[005C] = i
1CE5:007F 80BD510080 CMP BYTE PTR [DI+0051],80 ;(DS):[0051] – початок масиву
1CE5:0084 7612 JBE 0098 ; mas[i]<=80h => (IP) = 0098
1CE5:0086 8B3E5C00 MOV DI,[005C] ; (DI) = i
1CE5:008A 80BD510090 CMP BYTE PTR [DI+0051],90
1CE5:008F 7307 JNB 0098 ; mas[i]>=90h => (IP) = 0098
1CE5:0091 A15E00 MOV AX,[005E] ;(AX) = (DS):[005E] = c
1CE5:0094 40 INC AX ;(AX)++
1CE5:0095 A35E00 MOV [005E],AX ; c = (AX)
1CE5:0098 833E5C000A CMP WORD PTR [005C],+0A ; перевірка лічильника
1CE5:009D 75D8 JNZ 0077 ; наступна ітерація циклу
1CE5:009F C70660007777 MOV WORD PTR [0060],7777
2.Вивчення компілятора мови С:
2.1.Текст програми мовою C:
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
#define N 10
void main()
{ clrscr();
unsigned char mas[N];
int label, n = 0;
srand(time(NULL));
for ( int i = 0; i < N ; i++ )
{ mas[i] = 120 + rand()%30;
cout << (int)mas[i] << " ";
}
label = 0xAAAA;
for ( i = 0; i < N; i++ )
if ( (mas[i] > 128) && (mas[i] < 144 ) )
n++;
label = 0xAAAA;
cout << endl << n << endl;
}
2.2.Лістінг фрагменту програми:
1CE5:449E C746F4AAAA MOV WORD PTR [BP-0C],AAAA
1CE5:44A3 33F6 XOR SI,SI ; (SI) = i = 0
1CE5:44A5 EB0E JMP 44B5 ; (IP) = 44B5
1CE5:44A7 807AF680 CMP BYTE PTR [BP+SI-0A],80
1CE5:44AB 7607 JBE 44B4 ; mas[i]<=80h => (IP) = 44B4
1CE5:44AD 807AF690 CMP BYTE PTR [BP+SI-0A],90
1CE5:44B1 7301 JNB 44B4 ; mas[i]>=90h => (IP) = 44B4
1CE5:44B3 47 INC DI ; (DI)++
1CE5:44B4 46 INC SI ; (SI)++
1CE5:44B5 83FE0A CMP SI,+0A ; перевірка лічильника
1CE5:44B8 7CED JL 44A7 ; наступна ітерація циклу
1CE5:44BA C746F4AAAA MOV WORD PTR [BP-0C],AAAA
3.Вивчення компілятора мови Assembler:
3.1.Текст програми мовою Assembler:
sts segment stack 'stack'
db 64 dup(?)
sts ends
data segment
mas db 120, 70, 129, 145, 110, 134, 140, 181, 200, 140, 99
number dw 10
c db 0
flag dw ?
data ends
code segment
assume cs:code, ds:data, ss:sts
begin:
mov ax, data
mov ds, ax
xor si, si
mov flag, 0AAAAh
mov cx, number
cycl: cmp mas[si], 128
jle m1
cmp mas[si], 144
jge m1
inc c
m1: inc si
loop cycl
mov flag, 0AAAAh
mov ah, 4Ch
int 21h
code ends
end begin
3.2.Лістінг фрагменту програми:
1CEA:0007 C7060E00AAAA MOV WORD PTR [000E],AAAA
1CEA:000D 8B0E0B00 MOV CX,[000B] ; (CX) = 0000:[000B] = number
1CEA:0011 80BC000080 CMP BYTE PTR [SI+0000],80
1CEA:0016 7E0B JLE 0023 ; mas[i]<=80h => (IP) = 0023
1CEA:0018 80BC000090 CMP BYTE PTR [SI+0000],90
1CEA:001D 7D04 JGE 0023 ; mas[i]>=90h => (IP) = 0023
1CEA:001F FE060D00 INC BYTE PTR [000D] ; c++
1CEA:0023 46 INC SI ; (SI)++
1CEA:0024 E2EB LOOP 0011 ; наступна ітерація циклу
1CEA:0026 C7060E00AAAA MOV WORD PTR [000E],AAAA
Висновки:
Ознайомившись з компіляторами мов Pascal, C та Assembler, я дійшов висновку, що найбільш ефективним є компілятор Асемблеру, бо він не вносить у код жодної зайвої інформації. Компілятор С створює найбільш важкий для зрозуміння код з причини нестандартного зберігання даних. Код, створений компілятором мови Pascal, більш зрозумілий, але він містить деякі зайві інструкції.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.