Вивчення роботи компіляторів мов Pascal, C та Assembler

Страницы работы

Содержание работы

Міністерство Освіти і Науки України

Національний Технічний Університет

“Харківський Політехнічний Інститут”

Кафедра обчислювальної техніки та програмування

Лабораторна робота № 1

по курсу “Системне програмування”

на тему:

“Вивчення роботи компіляторів мов Pascal, C та Assembler

Виконав:

студент групи КІТ-11А

Ткаченко С. М.

Харків 2003

Мета роботи:

   Ознайомлення з компіляторами. Вивчення особливостей компіляції. Аналіз коду, отриманого в результаті компіляції.

Індивідуальне завдання:

   Маємо масив 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, більш зрозумілий, але він містить деякі зайві інструкції.   

Похожие материалы

Информация о работе