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

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2012
Тип роботи:
Лабораторна робота
Предмет:
Системне програмування
Група:
КІ

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки, молоді та спорту України НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” / Кафедра ЕОМ Лабораторна робота №2 з курсу ”Системне програмування ” ЗМІШАНЕ ПРОГРАМУВАННЯ НА МОВАХ С ТА АСЕМБЛЕР Львів 2012 Мета: оволодіти навиками створення програм, частини яких написані різними мовами програмування Засвоїти правила взаємодії різних модулів. ТЕОРЕТИЧНІ ВІДОМОСТІ Труднощі опису зв'язку програм мовою C і асемблерних програм полягає в тому, що різні версії мови C мають різні угоди про зв'язки і для більш точної інформації варто користатися посібником з наявної версії мови C. Більшість версій мови C забезпечують передачу параметрів через стек у зворотній (у порівнянні з іншими мовами) послідовності. Звичайно доступ, наприклад, до двох параметрів, переданих через стек, здійснюється в такий спосіб: PUSH EBP MOV EBP,ESP MOV EAX,[EBP+8] MOV EDX,[EBP+12] ... POP EBP RET Деякі версії мови C розрізняють великі і малі букви, тому ім'я асемблерного модуля повинне бути представлено в тому ж символьному регістрі, який використовують для посилання C-програми. У деяких версіях мови C потрібно, щоб асемблерні програми, що змінюють регістри EDI і ESI, записували їхній вміст у стек при вході і відновлювали ці значення зі стека при виході. Ассемблерні програми повинні повертати значення, якщо це необхідно, у регістрі EAX (подвійне слово) чи в регістровій парі EDX:EAX (8 слів). Для деяких версій мови C, якщо ассемблерна програма встановлює прапор DF, те вона повинна скинути його командою CLD перед поверненням. Щоб скомпонувати разом модулі C++ і Макро асемблера, повинні бути дотримані наступні три умови: У модулях Макро Асемблера повинні використовуватися угоди про імена, прийняті в C++. C++ і Макро Асемблер повинні спільно використовувати відповідні функції й імена змінних у формі, прийнятної для C++. Для комбінування модулів у виконувану програму потрібно використовувати утіліту-компоновщик (TLINK, LINK тощо). ЗАВДАННЯ Створити дві програми. Прша програма реалізує взаємовиклики С – ASM та здійснює обчислення, заданого виразу, згідно варіанту. Програма повинна складатися з кількох модулів, передача параметрів між якими здійснюється через стек. Основний модуль – створюється мовою С. Він повинен забезпечувати: ввід даних з клавіатури; виклик підпрограми обчислення виразу; вивід на екран результату обчислення виразу. Модуль безпосередніх обчислень – здійснює всі обчислення виразу. Створюється мовою Assembler. Друга програма реалізує взаємовиклики С – ASM – С та здійснює обчислення, заданого виразу, згідно варіанту. Програма повинна складатися з кількох модулів, передача параметрів між якими здійснюється через стек. Основний модуль – створюється мовою С. Він повинен забезпечувати: ввід даних з клавіатури; виклик підпрограми обчислення виразу; Модуль безпосередніх обчислень – здійснює всі обчислення і вивід на екран результату обчислення виразу викликом стандартної функції printf() . Створюється мовою Assembler. Варіант: 14 X=A4-B1-K-D2/2+4*B1 614   Код програми: С-Assembler main.cpp    //C #include <stdio.h> #include <conio.h> //14 X=A4-B1-K-D2/2+4*B1 614 extern "C" int calc(void); extern "C" { int A=0; int B=0; int D=0; int K=1556; //Kconst = 614h = 1556dec int Y=0; }; int main() { printf("X=A4-B1-K-D2/2+4*B1 614\n"); printf("Enter your numbers:\n"); printf("A = "); scanf("%d",&A); printf("B = "); scanf("%d",&B); printf("D = "); scanf("%d",&D); calc(); printf("\nASM: Result = %d\n",Y); getch(); return 0; } calc.asm .386 .model flat,c EXTRN A:SDWORD, B:SDWORD, D:SDWORD, K:SDWORD, Y:SDWORD .data rez1 dd 0 rez2 dd 0 rez3 dd 0 .code calc PROC mov eax,A mov ebx,B sub eax,ebx mov ebx,K sub eax,ebx mov rez1,eax mov edx,0 mov eax,D mov ecx,2 div ecx mov rez2,eax mov eax,B mov ecx,4 mul ecx mov rez3,eax mov eax,rez1 mov ebx,rez2 sub eax,ebx mov ebx,rez3 add eax,ebx mov Y,eax calc ENDP ret END Код програми: С-Assembler-C main.cpp    //C #include <stdio.h> #include <conio.h> //14 X=A4-B1-K-D2/2+4*B1 614 extern "C" int calc(void); extern "C" { int A=0; int B=0; int D=0; int K=1556; //Kconst = 614h = 1556dec int Y=0; }; int main() { printf("X=A4-B1-K-D2/2+4*B1 614\n"); printf("Enter your numbers:\n"); printf("A = "); scanf("%d",&A); printf("B = "); scanf("%d",&B); printf("D = "); scanf("%d",&D); calc(); getch(); return 0; } calc.asm ;14 X=A4-B1-K-D2/2+4*B1 614 .386 .model flat,c EXTRN A:SDWORD, B:SDWORD, D:SDWORD, K:SDWORD, Y:SDWORD printf proto C :VARARG .data rez1 dd 0 rez2 dd 0 rez3 dd 0 format db "X = %d\n" .code calc PROC mov eax,A mov ebx,B sub eax,ebx mov ebx,K sub eax,ebx mov rez1,eax mov edx,0 mov eax,D mov ecx,2 div ecx mov rez2,eax mov eax,B mov ecx,4 mul ecx mov rez3,eax mov eax,rez1 mov ebx,rez2 sub eax,ebx mov ebx,rez3 add eax,ebx mov Y,eax push eax push offset format call printf add esp,8 calc ENDP ret END Висновок: я оволодів навиками створення програм, частини яких написані різними мовами програмування .Засвоїв правила взаємодії різних модулів.
Антиботан аватар за замовчуванням

25.11.2012 18:11-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!