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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.

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

ЛАБОРАТОРНАЯ РАБОТА № 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.

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

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

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

Уважаемые коллеги! Предлагаем вам разработку программного обеспечения под ключ.

Опытные программисты сделают для вас мобильное приложение, нейронную сеть, систему искусственного интеллекта, SaaS-сервис, производственную систему, внедрят или разработают ERP/CRM, запустят стартап.

Сферы - промышленность, ритейл, производственные компании, стартапы, финансы и другие направления.

Языки программирования: Java, PHP, Ruby, C++, .NET, Python, Go, Kotlin, Swift, React Native, Flutter и многие другие.

Всегда на связи. Соблюдаем сроки. Предложим адекватную конкурентную цену.

Заходите к нам на сайт и пишите, с удовольствием вам во всем поможем.