Сортировка строк матрицы в порядке возрастания характеристик (Си + ассемблерная вставка) - Assembler

Узнай цену своей работы

Формулировка задачи:

Написать программу на языке СИ, которая в двумерном массиве сортирует строки в порядке возрастания их характеристик(в данном случае, характеристикой строки массива является сумма четных, положительных элементов). Необходимо в ассемблерной вставке сделать подсчет характеристик строки Этот кусок
for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
        {
            if (x[i][j] > 0 && x[i][j] % 2 == 0)
                x[i][N] = x[i][N] + x[i][j];
        }
    }
#include <stdio.h>
#include <stdlib.h>
#define N 4
 
void main(void)
{
    int x[N][N+1];
    int i, j, k;
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
        {
            x[i][j] = 1 + rand() % 5;
            x[i][N] = 0;
            printf(" %d ", x[i][j]);
        }
        printf("\n");
    }

    printf("\n");
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N; j++)
        {
            if (x[i][j] > 0 && x[i][j] % 2 == 0)
                x[i][N] = x[i][N] + x[i][j];
        }
    }
 
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N + 1; j++)
        {
            printf(" %d ", x[i][j]);
        }
        printf("\n");
    }
 
    printf("\n");
    for (k = 0; k < N; k++)
    {
            for (i = 0; i < N-1; i++)
            {
 
                if (x[i+1][N] > x[i][N])
                {
                    for (j = 0; j < N+1; j++)
                    {
                        int a = x[i][j];
                        x[i][j] = x[i + 1][j];
                        x[i + 1][j] = a;
                    }
                }
            }
    }
 
    for (i = 0; i < N; i++)
    {
        for (j = 0; j < N+1; j++)
        {
            printf(" %d ", x[i][j]);
        }
        printf("\n");
    }
}

Решение задачи: «Сортировка строк матрицы в порядке возрастания характеристик (Си + ассемблерная вставка)»

textual
Листинг программы
  asm (
    "xor %%ebx, %%ebx\n"         //i=0;
  "LOOP1:\n\t"                   //do {
    "xor %%edx, %%edx\n"         //j=0;
  "LOOP2:\n\t"                   //do {
    "mov %%ebx, %%eax\n\t"       //index = 5*i+j;
    "sal $2, %%eax\n\t"          //<<=2;
    "add %%ebx, %%eax\n\t"       //+=i; 
    "add %%edx, %%eax\n\t"       //+=j;
    "sal $2, %%eax\n\t"          //*=sizeof(int)
    "mov (%%eax,%[x]), %%eax\n\t"//el = x[i][j]; 
    //
    "test %%eax, %%eax\n\t"      //if (el<=0)
    "jle J\n\t"                  //continue;
    "and $1, %%eax\n\t"          //el=%2;
    "test %%eax, %%eax\n\t"      //if (s==0)
    "jne J\n\t"                  //continue;
    // x[i][N] = x[i][N] + x[i][j];
    "\n"
  "J:\n\t"
    "inc %%edx\n\t"              //j++;
    "cmp $4, %%edx\n\t"          //} while (j!=4);
    "jne LOOP2\n\t"
    "inc %%ebx\n\t"              //i++;
    "cmp $4, %%ebx\n\t"          //} while (i!=4);
    "jne LOOP1"
    : [x] "=rm"(x)
    : "r"(x)
    : "eax", "ebx"/*i*/, "edx"/*j*/
  );

Объяснение кода листинга программы

Код, представленный в вопросе, написан на языке ассемблера и выполняет сортировку строк матрицы в порядке возрастания характеристик. Вот список действий, которые выполняются в коде:

  1. Инициализация переменных i и j со значениями 0.
  2. Переход к началу цикла LOOP1.
  3. Внутри цикла LOOP1:
    • Инициализация переменной j со значением 0.
    • Переход к началу цикла LOOP2.
    • Внутри цикла LOOP2:
      • Вычисление индекса элемента матрицы, к которому осуществляется доступ, как сумма 5*i и j.
      • Увеличение индекса элемента матрицы на 2.
      • Сравнение полученного элемента матрицы с нулем. Если он меньше или равен нулю, то происходит переход к следующей итерации цикла LOOP2.
      • Если полученный элемент матрицы не равен нулю, то выполняется следующее действие:
      • Переменная s устанавливается равной 0.
      • Если s не равно 0, то выполняется следующее действие:
        • Элемент матрицы x[i][N] увеличивается на сумму x[i][N] и x[i][j].
      • Увеличение переменной j на 1.
      • Проверка условия j < 4. Если оно истинно, то происходит переход к следующей итерации цикла LOOP2.
      • Увеличение переменной i на 1.
      • Проверка условия i < 4. Если оно истинно, то происходит переход к следующей итерации цикла LOOP1.
  4. Выход из цикла LOOP1. Таким образом, данный код реализует алгоритм сортировки строк матрицы в порядке возрастания характеристик.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы