Вивчення роботи компіляторів мов Паскаль, Сі та асемблера

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

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

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

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

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

Дисципліна

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

Лабораторні робота №5

“Вивчення роботи компіляторів мов Паскаль, Сі та асемблера”

Виконала:

студентка групи КІТ-21Б

Сiпатова О.О.

Перевірив:

Межерицький С.Г.

            М. Харків, 2003 рік

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

Тема: “Вивчення роботи компіляторів мов Паскаль, Сі та асемблера”

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

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

Заданi масиви А i В по N=25 елементiв (констант типу WORD).

Визначити суму i кiлькiсть елементiв Ai, що задовольнять умовi Ai > Bi.

Завдання вирішити на всіх трьох мовах програмування, а потім за допомогою системного відладчика порівняти ефективність кодів.

1.  Тексти програм

1)  Асемблер

data segment

 A dw 0,16,17,26,35,13,5,28,8,34,41,10,47,46,22,33,27,5,

      6,23,28,43,8,34,46

 B dw 0,1,10,9,47,22,34,2,40,38,47,21,41,40,30,29,36,20,

      33,24,17,13,21,8,32

 S dw 0

 K dw 0

data ends

code segment

assume ds:data,cs:code

m: mov ax,data

mov ds,ax

xor ax,ax

mov bx,ax

mov cx,25

mov si,ax

mov di,ax

m0:mov ax,A[si]

   mov bx,B[di]

   mov dx,ax

   cmp ax,bx

   jb m1

   add S,dx

   add K,1

m1:add si,2

   add di,2

   loop m0

   mov ah,4ch

   int 21h

code ends

end m

2)  Паскаль

uses crt;

const a:array[1..25] of integer =(0,16,17,26,35,13,5,28,8,34,41,10,

17,46,22,33,27,5,6,23,28,43,8,34,46);

const b:array[1..25] of integer =(0,1,10,9,47,22,34,2,40,38,47,21,

41,40,30,29,36,20,33,24,17,13,21,8,32);

var i,j:integer;

    k,s:integer;

begin

  clrscr;

  k:=0;s:=0;

  for i:=1 to 25 do

    write(a[i]:3);

  writeln;writeln;

  for i:=1 to 25 do

    write(b[i]:3);

  writeln;

  j:=$5555;

  for i:=1 to 25 do

     if a[i]>b[i] then

       begin

         inc(k);

         s:=s+a[i];

       end;

  j:=$5555;

  writeln('Количество : ',k);

  writeln('Сумма : ',s)

end.

3)  Сі

#include<iostream.h>

#include<conio.h>

#include<stdio.h>

#include<stdlib.h>

main()

{

 int a[25]={0,16,17,26,35,13,5,28,8,34,11,10,17,46,22,33,27,5,6,23,28,43,8,34,46};

 int b[25]={0,1,10,9,47,22,34,2,40,38,47,21,41,40,30,29,36,20,33,24,17,13,21,8,32};

  for (int i=0;i<25;i++)

  {

   cout<<a[i]<<"   ";

  }

  cout<<endl<<endl;

  for ( i=0;i<25;i++)

  {

   cout<<b[i]<<"   ";

  }

  int k=0;

  int s=0;

  cout<<endl;

  int j=0x5555;

  for(i=0;i<25;i++)

   if(a[i]>b[i])

     {k++;s+=a[i];}

  j=0x5555;

  cout<<"Количество : "<<k<<endl<<"Сумма : "<<s;

  return 0;

}

2.  Лістинги програм

1)  Асемблер

16A3:0010 8B840200      MOV AX,[SI+0002]       в АХ элемент массива А                   

16A3:0014 8B9D3400      MOV BX,[DI+0034]       в ВХ элемент массива В                    

16A3:0018 8BD0          MOV DX,AX              сохранение элемента массива А                   

16A3:001A 3BC3          CMP AX,BX              сравнение элементов массивов                   

16A3:001C 7209          JB  0027               переход если АХ<ВХ          

16A3:001E 01066600      ADD [0066],DX          если больше то суммируем          

16A3:0022 8306680001    ADD WORD PTR [0068],+01     и считаем количество          

16A3:0027 83C602        ADD SI,+02           переход на следующий элемент  А           

16A3:002A 83C702        ADD DI,+02           переход на следующий элемент  В          

16A3:002D E2E1          LOOP      0010       пока СХ неравен 0          

2)  Паскаль

169E:00DB 55            PUSH BP                                 

169E:00DC 55            PUSH BP                                

169E:00DD C706B6000100  MOV  WORD PTR [00B6],0001  i:=1            

169E:00E3 EB04          JMP  00E9                              

169E:00E5 FF06B600      INC  WORD PTR [00B6]       i:=i+1            

169E:00E9 8B3EB600      MOV  DI,[00B6]                         

169E:00ED D1E7          SHL  DI,1                              

169E:00EF 8B850000      MOV  AX,[DI+0000]                      

169E:00F3 8B3EB600      MOV  DI,[00B6]                         

169E:00F7 D1E7          SHL  DI,1                              

169E:00F9 3B853200      CMP  AX,[DI+0032]           a[i]>b[i]           

169E:00FD 7E14          JLE  0113                               

169E:00FF FF06BA00      INC  WORD PTR [00BA]        inc(k)           

169E:0103 A1BC00        MOV  AX,[00BC]                         

169E:0106 8B3EB600      MOV  DI,[00B6]                         

169E:010A D1E7          SHL  DI,1                               

169E:010C 03850000      ADD  AX,[DI+0000]          } s:=s+a[i]           

169E:0110 A3BC00        MOV  [00BC],AX             }            

169E:0113 833EB60019    CMP  WORD PTR [00B6],+19   i=25            

169E:0118 75CB          JNZ  00E5                  если i неравно 25 по продолжение цикла               

169E:011A C706B8005555  MOV  WORD PTR [00B8],5555              

3)  Сі

169E:036B 55            PUSH  BP                                

169E:036C 55            PUSH  BP                                 

169E:036D 33F6          XOR   SI,SI                 i=0             

169E:036F EB28          JMP   0399                              

169E:0371 8BDE          MOV   BX,SI                             

169E:0373 D1E3          SHL   BX,1                               

169E:0375 8D46CA        LEA   AX,[BP-36]                        

169E:0378 03D8          ADD   BX,AX                             

169E:037A 8B07          MOV   AX,[BX]                           

169E:037C 8BDE          MOV   BX,SI                              

169E:037E D1E3          SHL   BX,1                              

169E:0380 8D5698        LEA   DX,[BP-68]                        

169E:0383 03DA          ADD   BX,DX                             

169E:0385 3B07          CMP   AX,[BX]                         }if (a[i]>b[i])

169E:0387 7E0F          JLE   0398            } если АХ<ВХ то переход }           

169E:0389 47            INC   DI                   подсчитывается количество К++            

169E:038A 8BDE          MOV   BX,SI                              

169E:038C D1E3          SHL   BX,1                              

169E:038E 8D46CA        LEA   AX,[BP-36]           }             

169E:0391 03D8          ADD   BX,AX                }  s+=a[i]           

169E:0393 8B07          MOV   AX,[BX]              }             

169E:0395 0146FE        ADD   [BP-02],AX           }             

169E:0398 46            INC   SI                    i++   } for (i=0;i<25;i++)        

169E:0399 83FE19        CMP   SI,+19                i<25  }                  

169E:039C 7CD3          JL    0371              если i<25 по продолжение цикла            

169E:039E C746FC5555    MOV   WORD PTR [BP-04],5555             

3.  Висновки

При порівнянні кодів усіх трьох програм, я ще раз переконався в тому, що найефективніший код будується компілятором асемблера. Далі йде код, написаний мовою Сі, і лише потім – код програми, написаної на мові Паскаль.

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

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