Определить и вывести, находится ли максимальный элемент матрицы на главной диагонали или нет - 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) для приостановки выполнения программы до нажатия клавиши.