Stack Overflow на русском Asked on December 26, 2021
нужно передать с кода С++ в ассемблерную процедуру динамический массив, не подскажите как это можно сделать?
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>
#include <conio.h>
using namespace std;
void Input(int** arr, size_t size)//функция заполнения массива с входными параметрами: массив и ограничение
{
srand(time(NULL)); // "инициализация" генератора случайных чисел
for (int i = 0; i < size; i++) {
arr[i] = new int[size];
for (int j = 0; j < size; j++)
cin >> arr[i][j];
}
}
void Output(int** arr, size_t size)//функция вывода массива в консоль
{
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++)
cout << setw(5) << arr[i][j];
cout << endl;//переход на следующую строку
}
}
extern "C" void asm_proc(int* a, int); // описание прототипа ASM-подпрограммы
int main()
{
setlocale(LC_ALL, "russian");
cout << "Задание: Если сумма элементов первой строки = сумме элементов первого столбца, " << endl << "обмнять элементы первой строки с элементами первого столбца " << endl << endl;
/*ЗАДАЁМ ЧИСЛО ЯЧЕЕК ВО ВРЕМЯ РАБОТЫ ПРОГРАММЫ*/
size_t size;
cout << "Введите размерность квадратной матрицы: ";
cin >> size;
/*ДАЁМ ПРОГРАММЕ ПАМЯТЬ*/
int** a = new int* [size];//Создание строк
cout << "Введите исходный массив: " << endl;
Input(a,size);
cout << "Исходный массив: " << endl;
Output(a,size);
asm_proc(&a[0][0], size);
cout << "Массив после оброботки: " << endl;
Output(a,size);
system("pause");
return 0;
}
.386
.model flat, c
public asm_proc
.data
summ dd 0
.code
asm_proc proc
push ebp
mov ebp, esp
mov edi, [ebp + 8]
mov ecx, [ebp + 12]
mov esi, [edi]
@add_summ:
lodsd
add [summ], eax
loop @add_summ
mov esi, [ebp + 8]
mov ecx, [ebp + 12]
mov ebx, ecx
shl ebx, 2
@sub_summ:
mov eax, [esi]
sub [summ], eax
add esi, ebx
loop @sub_summ
; проверка равенства строк через разность суммы
cmp summ, 0
jne @exit
mov esi, [ebp + 8]
mov edi, [ebp + 8]
mov ecx, [ebp + 12]
;делаем обмен
@swap:
push [edi]
push [esi]
pop [edi]
pop [esi]
add esi, 4
add edi, ebx
loop @swap
@exit:
leave
retn
asm_proc endp
end
Как верно заметил avp в комментариях, точно так же, как в любую функцию, написанную на C/C++. В каком регистре будет передан адрес начала массива зависит от того, в какой системе вы программируете (так называемые "соглашения о связях" (они же "calling conventions")).
Обычно у компилятора есть ключ, который позволяет вывести результат компиляции в виде исходного кода на ассемблере (в gcc/g++ это -S, результат будет в .s файле).
Компилируете с -S и смотрите в каких регистрах передаются параметры, в каком возвращается результат функции. Весьма рекомендую, вообще, для изучения ассемблера.
Answered by jokerbot on December 26, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP