Вывод диагонали квадратной матрицы. Как правильно на АСМ + Си?

Программа считает всё как надо. Но может быть я сделал что-то крайне не правильное с точки зрения организации кода на ассемблере?

Сам код:
#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;
}


Возможно ли как-то укоротить код вставки, или сделать вычисление более правильно?
  • Вопрос задан
  • 1060 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
imul eax, 4

shl eax, 2 же. Или даже
lea edx, dword ptr [eсx * 4 + 4]
(почему +4 -- см. ниже).

push edx
...
pop edx

Зачем? У тебя полно регистров -- используй их.

add eax, edx
add eax, 4

Слабо было перед циклом сделать edx сразу правильным?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы