TransWikia.com

Как динамически выделить память под массив в ассемблере?

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

One Answer

Как верно заметил avp в комментариях, точно так же, как в любую функцию, написанную на C/C++. В каком регистре будет передан адрес начала массива зависит от того, в какой системе вы программируете (так называемые "соглашения о связях" (они же "calling conventions")).

Обычно у компилятора есть ключ, который позволяет вывести результат компиляции в виде исходного кода на ассемблере (в gcc/g++ это -S, результат будет в .s файле).

Компилируете с -S и смотрите в каких регистрах передаются параметры, в каком возвращается результат функции. Весьма рекомендую, вообще, для изучения ассемблера.

Answered by jokerbot on December 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP