Міністерство освіти і науки України
Національний технічний університет “ХПІ”
Кафедра “Обчислювальної техніки та програмування”
Дисципліна
“Системне програмування”
Лабораторні робота №5
Виконала:
студентка групи КІТ-21Б
Сiпатова О.О.
Перевірив:
Межерицький С.Г.
М. Харків, 2003 рік
Мета: Ознайомлення з компіляторами. Вивчення осоливостей компіляції. Аналіз коду, отриманого в результаті компіляції.
Індивідуальне завдання:
Задан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. Висновки
При порівнянні кодів усіх трьох програм, я ще раз переконався в тому, що найефективніший код будується компілятором асемблера. Далі йде код, написаний мовою Сі, і лише потім – код програми, написаної на мові Паскаль.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.