Виконав:
студент групи АП-30б
Шпіка П. М.
Перевірив:
Межерицький С. Г.
1. Тема роботи: Вивчення роботи компіляторів мов Pascal, C і Assembler.
2. Мета роботи: Ознайомлення з компіляторами. Вивчення особливостей компіляції. Аналіз коду, отриманого в результаті компіляції.
3. Постановка задачі: Відповідно до індивідуального завдання написати три програми:
1) - мовою Pascal (файл lrsp1pas.pas)
2) - мовою C (файл lrsp1c.c)
3) - мовою Assembler (файл lrsp1asm.asm)
Провести компіляцію кожного файлу й одержати файли, що завантажуються, lrsp1pas.exe, lrsp1c.exe, lrsp1asm.exe. Використовуючи відладчик debug.exe, одержати лістинги машинних кодів програм і провести аналіз цих кодів.
4. Текст завдання (варіант 19): Задан масив А з N=30 елементів (констант типу WORD). Визначити кількість елементів масиву А, для яких біти 3 і 11 співпадають.
5. Тексти програм:
1) lrsp1asm.asm
stek segment stack
db 128 dup (?)
stek ends
data segment
a dw 1,2,3,4,5,6,7,8,2048,2056
i dw ?
a1 dw ?
a2 dw ?
c dw 0
m1 db "Total found $"
m2 db " numbers",10,13,'$'
data ends
code segment
assume cs:code,ds:data,ss:stek
main:
mov ax,data
mov ds,ax
mov ax,stek
mov ss,ax
mov cx,10
mov si,offset a
repeat:
push cx
mov ax,a[si]
mov a1,ax
mov a2,ax
mov cl,3
shr a1,cl
mov cl,11
shr a2,cl
mov bx,a1
mov dx,a2
xor bx,dx
and bx,1
cmp bx,1
je next
inc c
next:
add si,2
pop cx
loop repeat
mov ah,9h
mov dx,offset m1
int 21h
mov ah,2h
mov dx,c
add dx,30h
int 21h
mov ah,9h
mov dx,offset m2
int 21h
mov ah,4ch
int 21h
code ends
end main
2) lrsp1c.c
#include<stdio.h>
int main()
{
int s=0x5555,
a[10]={1,2,3,4,5,6,7,8,2048,2056},
i,a1,a2,c=0;
s=0x5555;
s=0x5555;
for(i=0;i<10;i++)
{
s=0x5555;
a1=a[i];
s=0x5555;
a2=a[i];
s=0x5555;
a1=a1>>3;
s=0x5555;
a2=a2>>11;
s=0x5555;
if( !((a1^a2)&0x1) )
c++;
}
s=0x5555;
printf("Total found %d numbers\n",c);
s=0x5555;
s=0x5555;
return 0;
}
3) lrsp1pas.pas
uses crt;
var a:array[0..9] of integer;
i,a1,a2,c,s:integer;
begin
s:=$5555;
s:=$5555;
c:=0;
a[0]:=1;
a[1]:=2;
a[2]:=3;
a[3]:=4;
a[4]:=5;
a[5]:=6;
a[6]:=7;
a[7]:=8;
a[8]:=2048;
a[9]:=2056;
s:=$5555;
for i:=0 to 9 do
begin
s:=$5555;
a1:=a[i];
a2:=a[i];
a1:=a1 div 8;
a1:=a1*32768;
a2:=a2 div 2048;
a2:=a2*32768;
s:=$5555;
if a1=a2
then c:=c+1;
end;
s:=$5555;
writeln('Total found ',c,' numbers');
s:=$5555;
s:=$5555;
end.
6. Лістинги машинних кодів з докладними коментарями.
1) lrsp1asm.lst
22E8:0000 B8E422 MOV AX,22E4
22E8:0003 8ED8 MOV DS,AX
22E8:0005 B8DC22 MOV AX,22DC
22E8:0008 8ED0 MOV SS,AX
22E8:000A B90A00 MOV CX,000A
22E8:000D BE0000 MOV SI,0000
22E8:0010 51 PUSH CX
22E8:0011 8B840000 MOV AX,[SI+0000]
22E8:0015 A31600 MOV [0016],AX
22E8:0018 A31800 MOV [0018],AX
22E8:001B B103 MOV CL,03
22E8:001D D32E1600 SHR WORD PTR [0016],CL
22E8:0021 B10B MOV CL,0B
22E8:0023 D32E1800 SHR WORD PTR [0018],CL
22E8:0027 8B1E1600 MOV BX,[0016]
22E8:002B 8B161800 MOV DX,[0018]
22E8:002F 33DA XOR BX,DX
22E8:0031 83E301 AND BX,+01
22E8:0034 83FB01 CMP BX,+01
22E8:0037 7404 JZ 003D
22E8:0039 FF061A00 INC WORD PTR [001A]
22E8:003D 83C602 ADD SI,+02
22E8:0040 59 POP CX
22E8:0041 E2CD LOOP 0010
22E8:0043 B409 MOV AH,09
22E8:0045 BA1C00 MOV DX,001C
22E8:0048 CD21 INT 21
22E8:004A B402 MOV AH,02
22E8:004C 8B161A00 MOV DX,[001A]
22E8:0050 83C230 ADD DX,+30
22E8:0053 CD21 INT 21
22E8:0055 B409 MOV AH,09
22E8:0057 BA2900 MOV DX,0029
22E8:005A CD21 INT 21
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.