Частина тексту файла (без зображень, графіків і формул):
Модуль на С:
#include <iostream>
using namespace std;
extern "C" int calc(int,int,int); //оголошення зовнішньої функції з параметрами
//параметри передаються через стек
extern "C" const int K=0x6c26;
int main()
{
int A,C;
int E;
int res;
cout<<"Enter numbers:"<<endl;
cout<<"A = ";
cin>>A;
cout<<"C = ";
cin>>C;
cout<<"E = ";
cin>>E;
res = calc(A,C,E);
cout<<endl<<"Result v C++ is: "<<res<<endl;
system("pause");
return 0;
}
Модуль на Асемблер:
.386
.model flat,c
.data
EXTRN C K:dword ;використання зовнішньої змінної (константи) К з модуля main.cpp
format db "Rezult v asm= %d",0
.code
printf PROTO arg1:Ptr Byte, printlist: VARARG
calc PROC
push ebp
mov ebp,esp
mov eax, dword ptr[ebp+8] ;зчитуємо параметр А в регістр eax
mov ebx, dword ptr[ebp+12] ;зчитуємо параметр C в регістр ebx
sar ebx,1 ;ділимо на 2 значення ebx (C), sar - зсув вправо для знакових чисел на вказане число бітів, знаковий біт залишається
add eax,ebx ;в регістрі eax отримаємо A+C/2
movsx ecx, byte ptr[ebp+16] ;в регістр ecx записуємо байтове значення параметра Е зі знаковим розширенням
sar ecx,3 ;ділимо на 8 (2^3) значення ecx, через побітовий зсув вправо на 3-ри біти (знаковий біт зберігається)
sub eax,ecx ;в регістрі eax - A+C/2-E/8
add eax,K ;eax=A+C/2-E/8+K згідно варіанту
;mov z,eax
push eax
invoke printf, addr format, eax
pop eax
pop ebp
ret ;значення в програму на С++ повертається в регістрі EAX
calc ENDP
END
Ви не можете залишити коментар. Для цього, будь ласка, увійдіть
або зареєструйтесь.
Ділись своїми роботами та отримуй миттєві бонуси!
Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!