Змішане програмування на мовах C та Асемблер

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

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

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

Рік:
2016
Тип роботи:
Лабораторна робота
Предмет:
Системне програмування та операційні системи

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

Міністерство освіти і науки Національний університет “Львівська політехніка” Кафедра ЕОМ / Звіт з лабораторної роботи № 2 з дисципліни: “Системне програмування” на тему: “Змішане програмування на мовах C та Асемблер” Мета лабораторної роботи Оволодіти навичками створення програм, частини яких написані різними мовами програмування. Засвоїти правила взаємодії між програними модулями різних мов програмування. Теоретичні відомості Труднощі опису зв’язку програм написаних мовою C і асемблерних програм полягає в тому, що різні версії мови C мають різні угоди з виклику функцій та передавання їм параметрів. Для більш точної інформації варто користатися посібником з наявної версії мови C. Індивідуальне завдання 1. Створити дві програми. Перша програма реалізує взаємовиклики С – ASM та здійснює обчислення, заданого виразу, згідно варіанту (Табл. 2.3). Програма повинна складатися з кількох модулів, передача параметрів між якими здійснюється через стек. Константа передається через спільну пам’ять. Основний модуль – створюється мовою С. Він повинен забезпечувати: • ввід даних з клавіатури; • виклик підпрограми обчислення виразу; • вивід на екран результату обчислення виразу. Модуль безпосередніх обчислень – здійснює всі обчислення виразу. Створюється мовою Assembler. 2. Друга програма реалізує взаємовиклики С – ASM – С та здійснює обчислення, заданого виразу, згідно варіанту. Програма повинна складатися з кількох модулів, передача параметрів між якими здійснюється через стек. Основний модуль – створюється мовою С. Він повинен забезпечувати: • ввід даних з клавіатури; • виклик підпрограми обчислення виразу; Модуль безпосередніх обчислень – здійснює всі обчислення і вивід на екран результату обчислення виразу викликом стандартної функції printf() . Створюється мовою Assembler. 29. X=K-B1*4+D2-F2/2 12A0C029  А, В, С, D, E, F - знакові цілі числа, довжиною в байтах, згідно з індексом, значення константи К подано у 16-му форматі. Код програми Перша програма (C – Asm) main.cpp #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <conio.h> extern "C" int calc(int, int, int); extern "C" const int K = 0x12A0C029; void main() { printf("X = %d - B * 4 + D - F / 2\n\nB = [-128; 127]\nD = [-32768; 32767]\nF = [-32768; 32767]\n\n", K); int B, D, F; do { printf("B = "); scanf("%d", &B); } while (B < -128 || B > 127); do { printf("D = "); scanf("%d", &D); } while (D < -32768 || D > 32767); do { printf("F = "); scanf("%d", &F); } while (F < -32768 || F > 32767); printf("\nC: X = %d\nAsm: X = %d\n", K - B * 4 + D - F / 2, calc(B, D, F)); _getch(); } calc.asm .686 .model flat, c .data extrn K : dword .code calc proc push ebp mov ebp, esp mov al, byte ptr [ebp+8] cbw cwde sal eax, 2 ; eax = B * 4 mov edx, K sub edx, eax ; edx = K - B * 4 mov ax, word ptr [ebp+12] cwde add eax, edx mov ebx, eax ; ebx = K - B * 4 + D mov ax, word ptr [ebp+16] cwde cdq mov ecx, 2 idiv ecx ; eax = F / 2 sub ebx, eax mov eax, ebx ; eax = K - B * 4 + D - F / 2 pop ebp ret calc endp end Друга програма (C – Asm – C) main.cpp #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <conio.h> extern "C" void calc(int, int, int); extern "C" const int K = 0x12A0C029; void main() { printf("X = %d - B * 4 + D - F / 2\n\nB = [-128; 127]\nD = [-32768; 32767]\nF = [-32768; 32767]\n\n", K); int B, D, F; do { printf("B = "); scanf("%d", &B); } while (B < -128 || B > 127); do { printf("D = "); scanf("%d", &D); } while (D < -32768 || D > 32767); do { printf("F = "); scanf("%d", &F); } while (F < -32768 || F > 32767); printf("\nC: X = %d\n", K - B * 4 + D - F / 2); calc(B, D, F); _getch(); } calc.asm .686 .model flat, c .data result db "Asm: X = %d", 13, 10, 0 extrn K : dword .code extrn printf : proc calc proc push ebp mov ebp, esp mov al, byte ptr [ebp+8] cbw cwde sal eax, 2 ; eax = B * 4 mov edx, K sub edx, eax ; edx = K - B * 4 mov ax, word ptr [ebp+12] cwde add eax, edx mov ebx, eax ; ebx = K - B * 4 + D mov ax, word ptr [ebp+16] cwde cdq mov ecx, 2 idiv ecx ; eax = F / 2 sub ebx, eax ; ebx = K - B * 4 + D - F / 2 pop ebp push ebx push offset result call printf add esp, 8 ret calc endp end Результат виконання програми / / / / Висновок Я оволодів навичками створення програм, частини яких написані різними мовами програмування та засвоїв правила взаємодії між програними модулями різних мов програмування.
Антиботан аватар за замовчуванням

07.05.2017 14:05-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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