N
N
Nikolai Shepelev2015-05-06 19:08:41
HTML
Nikolai Shepelev, 2015-05-06 19:08:41

Derivation of the diagonal of a square matrix. How to correctly on ACM + C?

The program considers everything as it should. But maybe I did something extremely wrong in terms of organizing code in assembler?
The code itself:

#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;
}

Is it possible to somehow shorten the embed code, or make the calculation more correct?

Answer the question

In order to leave comments, you need to log in

3 answer(s)
I
iBird Rose, 2018-05-21
@iiiBird

Call on image click

T
Troodi Larson, 2018-05-21
@troodi

<img onclick="$('#myModal').modal('hide')" src="">

J
jcmvbkbc, 2015-05-06
@venomkol

imul eax, 4

shl eax, 2 same. Or even
(why +4 -- see below).
push edx
...
pop edx

What for? You have a lot of registers - use them.
add eax, edx
add eax, 4

Was it weak to make edx right before the loop right away?

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question