- •Лекция 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