Изучение работы компиляторов языков Pascal, Cи, Assembler

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

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

ЛАБОРАТОРНАЯ РАБОТА № 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  в памяти

Рассмотрев код из листинга Си, можно заметить, что он реализован лучше, чем в Паскале, так как под переменную i  здесь используется не память, а регистр, что повышает  скорость выполнения  данного кода, однако он в три раза больше по размеру чем  код на ассемблере.

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.

Следовательно, самым быстрым и экономичным из предложенных к рассмотрению кодов, является код ассемблера.

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

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