- •Лекция 24
 - •Необходимость сочетания языков высокого и низкого
 - •Проблемы использования
 - •Правила
 - •Соглашения о вызове процедур
 - •Соглашения о вызове процедур
 - •Способы использования Ассемблерных вставок
 - •Ассемблерные вставки
 - •Ассемблерные вставки
 - •Ассемблерные вставки
 - •Пример 1
 - •Реализация (вариант 1)
 - •Реализация (вариант 2)
 - •Реализация (вариант 3)
 - •Цикл тестирования
 - •Пример 2
 - •Ассемблерные модули
 - •Ассемблерные модули
 - •Пример 3
 - •Пример 3 – модуль на Ассемблере в Pelles C
 - •Пример 3 – Основная программа в PellesC
 - •Пример 3 – модуль на Ассемблере в Visual Studio
 - •Настройка компилятора в Visual Studio 2010
 - •Пример 4
 - •Пример 5
 - •;Вызываемая функция file2.asm
 
Пример 3 – модуль на Ассемблере в Pelles C
.model flat
public SumPositive  | 
	
  | 
	
  | 
||
.code  | 
	
  | 
	
  | 
	
  | 
	
  | 
SumPositive proc  | 
	
  | 
	
  | 
	
  | 
|
  | 
	push  | 
	ebp  | 
	
  | 
	;Настройка базы  | 
  | 
	mov  | 
	ebp, esp  | 
	
  | 
	
  | 
  | 
	mov  | 
	esi, [ebp+8]  | 
	
  | 
	;В esi записываем адрес массива  | 
  | 
	mov  | 
	ecx, [ebp+12]  | 
	;В ecx записываем размер массива  | 
|
  | 
	xor  | 
	edx, edx  | 
	
  | 
	;Инициализируем сумму  | 
Loop01:  | 
	lodsd  | 
	
  | 
	;Загружаем в eax элемент массива  | 
|
  | 
	or  | 
	eax, eax  | 
	;Устанавливаем флаги  | 
|
  | 
	js  | 
	next01  | 
	;Переход если число отрицательное  | 
|
  | 
	add  | 
	edx, eax  | 
	;Суммируем положительные числа  | 
|
Next01:  | 
	loop  | 
	loop01  | 
	;Цикл по всем элементам массива  | 
|
  | 
	mov  | 
	eax, edx  | 
	;Записываем сумму в eax  | 
|
  | 
	pop  | 
	ebp  | 
	;Восстановление базы  | 
|
  | 
	ret  | 
	
  | 
	
  | 
	
  | 
SumPositive endp end
Пример 3 – Основная программа в PellesC
#include <stdio.h>
int SumPositive(int *,int);
int main(int argc, char *argv[])
{
int arr[] = {12,34,-45,23,-47,67}, num = 6; int value = SumPositive(arr,num); printf("%d\n",value);
return 0;
}
Вывод:
136
Пример 3 – модуль на Ассемблере в Visual Studio
.model flat, C public SumPositive
.code  | 
	
  | 
SumPositive proc  | 
|
push  | 
	ebp  | 
mov  | 
	ebp, esp  | 
mov  | 
	esi, [ebp+8]  | 
mov  | 
	ecx, [ebp+12]  | 
xor  | 
	edx, edx  | 
loop01:  | 
	
  | 
lodsd  | 
	eax, eax  | 
or  | 
|
js  | 
	next01  | 
add  | 
	edx, eax  | 
next01:  | 
	loop01  | 
loop  | 
|
mov  | 
	eax, edx  | 
pop  | 
	ebp  | 
ret  | 
	
  | 
SumPositive endp end
//!!!Файл с расширением .c!!!
#include <stdio.h>
int SumPositive(int *,int);
int main(int argc, char *argv[])
{
int arr[] = {12,34,-45,23,-47,67}, num = 6;
int value = SumPositive(arr,num); printf("%d\n",value);
return 0;
}
Настройка компилятора в Visual Studio 2010
https://habrahabr.ru/post/252647/
https://habrahabr.ru/post/111275/
https://msdn.microsoft.com/ru-ru/library/45yd4tzz.aspx
http://prog-cpp.ru/asm-c/
Пример 4
Даны целые числа а и b. Вычислить выражение: a + 5 b.
#include <stdio.h> #include <windows.h> #include <tchar.h>
void main()
{
char s[20]; int a, b, sum;
printf("Введите a: ", s); scanf("%d",&a); printf("Введите b: ",s); scanf("%d",&b);
_asm
{
mov eax, a; mov ecx, 5
m: add eax, b  | 
	
  | 
	
  | 
	
  | 
|
loop m  | 
	
  | 
	
  | 
	
  | 
	
  | 
mov sum, eax  | 
	
  | 
	
  | 
	
  | 
|
}  | 
	
  | 
	
  | 
	
  | 
	
  | 
printf("\n  | 
	%d  | 
	+  | 
	5*%d  | 
	=  | 
%d",a,b,sum);  | 
	
  | 
	
  | 
	
  | 
	
  | 
getchar();  | 
	
  | 
	getchar();  | 
||
}  | 
	
  | 
	
  | 
	
  | 
	
  | 
Пример 5
Умножить на 2 первый элемент массива (нумерация элементов ведется с 0).
#include <iostream>  | 
	//Вызывающая программа file1.cpp  | 
	
  | 
using namespace std;  | 
	
  | 
|
extern "C" int MAS_FUNC (int *, int);  | 
	
  | 
|
int main() {  | 
	
  | 
	
  | 
int *mas, n, k;  | 
	
  | 
	
  | 
cout << "Введите размер массива: ";  | 
	
  | 
|
cin >> n;  | 
	
  | 
	
  | 
mas = new int[n];  | 
	
  | 
	
  | 
cout << "Введите элементы массива: " << endl;  | 
	
  | 
|
for(int i=0; i<n;  | 
	i++) { cout << "mas[" << i <<"]= ";  | 
	cin >>  | 
mas[i]; }  | 
	
  | 
	
  | 
k = MAS_FUNC(mas, n);
cout << mas[1] << "*2= " << k; cin.get();
return 0;
}
;Вызываемая функция file2.asm
.586
.MODEL FLAT, C
.CODE
MAS_FUNC PROC C mas:dword, n:dword
mov esi,mas
mov eax, [esi+4] shl eax, 1
ret
MAS_FUNC ENDP
END
