Определить и вывести, находится ли максимальный элемент матрицы на главной диагонали или нет - Assembler
Формулировка задачи:
Ввести размеры ( n, m ) двумерного массива типа int. Сгенерировать
или ввести матрицу n*m. Определить и вывести, находится ли
максимальный элемент на главной диагонали или нет.
Помогите пожалуйста.
Решение задачи: «Определить и вывести, находится ли максимальный элемент матрицы на главной диагонали или нет»
textual
Листинг программы
#include <iostream> #include <stdio.h> #include <stdlib.h> void main() { int A[100][100],m,n; int r=0; scanf("%d", &n); scanf("%d", &m); for(int i=0;i<n;i++) for(int j=0;j<m;j++) A[i][j]=rand()%10; __asm { lea esi,A; xor ecx,ecx; mov eax,[esi]; xor edx,edx; } lp2: __asm{ xor ebx,ebx; } lp1: __asm { cmp [esi+ebx*4],eax; jle m1 mov eax,[esi+ebx*4]; mov ch,bl; mov cl,dl; } m1: __asm{ inc ebx; cmp ebx,n; jb lp1 add esi,400; inc edx; cmp edx,m; jb lp2 cmp ch,cl; setz byte ptr r; } if(r) printf("da\n"); else printf("net\n"); system("pause"); }
Объяснение кода листинга программы
- Объявлены переменные:
- A[100][100] - двумерный массив 100x100;
- m, n - переменные для хранения количества строк и столбцов матрицы соответственно;
- r - флаг, хранящий информацию о том, находится ли максимальный элемент на главной диагонали;
- r - флаг, хранящий информацию о том, находится ли максимальный элемент на главной диагонали;
- i, j - индексы для обхода матрицы.
- Заполнение матрицы случайными числами от 0 до 9.
- Начинается выполнение кода на ассемблере:
- lea esi,A - указатель на начало матрицы A;
- xor ecx,ecx - инициализация счётчика;
- mov eax,[esi] - загрузка первого элемента матрицы в eax;
- xor edx,edx - инициализация счётчика для проверки главной диагонали;
- goto lp2 - переход к следующей части кода.
- Первая часть кода (lp1) выполняет сравнение текущего элемента матрицы с первым элементом и сохраняет результат в r.
- Если текущий элемент больше первого, то:
- inc ebx - увеличение индекса для перехода к следующему элементу;
- cmp ebx,n - проверка выхода за границы матрицы;
- jb lp1 - если выход за границы, то возврат к началу цикла;
- mov ch,bl - сохранение в ch и bl значений dl и bl (для проверки на равенство);
- mov cl,dl - сохранение в cl значения dl (для проверки на равенство).
- Если текущий элемент меньше или равен первому, то:
- add esi,400 - увеличение указателя на 400 (размер элемента матрицы);
- inc edx - увеличение счётчика для проверки главной диагонали;
- cmp edx,m - проверка выхода за границы матрицы;
- jb lp2 - если выход за границы, то возврат к началу цикла;
- cmp ch,cl - проверка на равенство dl и cl;
- setz byte ptr r - установка значения r в зависимости от результата сравнения (1 - если dl и cl равны, 0 - если не равны).
- После завершения выполнения кода на ассемблере выполняется проверка значения r и выводится соответствующее сообщение.
- Выполняется функция system(
pause
) для приостановки выполнения программы до нажатия клавиши.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д