Частина тексту файла (без зображень, графіків і формул):
Модуль на С:
#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