Сортировка строк матрицы в порядке возрастания характеристик (Си + ассемблерная вставка) - 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*/ );
Объяснение кода листинга программы
Код, представленный в вопросе, написан на языке ассемблера и выполняет сортировку строк матрицы в порядке возрастания характеристик. Вот список действий, которые выполняются в коде:
- Инициализация переменных
i
иj
со значениями 0. - Переход к началу цикла
LOOP1
. - Внутри цикла
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
.
- Инициализация переменной
- Выход из цикла
LOOP1
. Таким образом, данный код реализует алгоритм сортировки строк матрицы в порядке возрастания характеристик.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д