Программа считает всё как надо. Но может быть я сделал что-то крайне не правильное с точки зрения организации кода на ассемблере?
Сам код:
#include <conio.h>
#include <stdio.h>
#include <Windows.h>
int main()
{
system("chcp 1251"); //Ввод и вывод на кириллице
system("cls"); //Очистка консоли
int *a, *b, n;
printf("Введите размер матрицы: ");
scanf("%d", &n);
a = (int*)calloc(n*n, sizeof(int)); //Выделение памяти под массивы
b = (int*)calloc(n, sizeof(int));
printf("\nВведите элементы матрицы:\n");
for (int i = 0; i < n; i++) //Ввод массива A
for (int j = 0; j < n; j++)
scanf("%d", (a + n*i + j));
__asm { //Формирование массива B
mov ecx, dword ptr[n] //В ECX счетчик цикла
mov eax, dword ptr[n] //В EAX кол-во элементов строке
imul eax, 4 //Вычисление смещения
mov edx, eax //В EDX сохраняем смещение
mov eax, dword ptr[a] //В EAX адрес начала массива A
mov ebx, dword ptr[b] //В EBX адрес начала массива B
again:
push edx //Сохранить в стеке смещение
mov edx, dword ptr[eax] //В EDX элемент из диагонали матр. A
mov dword ptr[ebx], edx //Запись этого элемента в массив B
pop edx //Восстановление из стека смещения
add eax, edx //Вычисляем адрес след. элементна
add eax, 4 //на гл. диагонали матр. A
add ebx, 4 //Вычисляем адрес след. элем. матр. B
loop again /Замыкаем цикл
}
printf("\nГлавная диагональ матрицы: ");
for (int i = 0; i < n; i++) //Вывод массива B
printf("%2d ", *(b + i));
free(a); //Очистка памяти
free(b);
getch();
return 0;
}
Возможно ли как-то укоротить код вставки, или сделать вычисление более правильно?