Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 курс / Лекции / Лекция 24 - Интерфейс с языками высокого уровня.ppt
Скачиваний:
42
Добавлен:
18.02.2023
Размер:
238.59 Кб
Скачать

Пример 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