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

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

  1. Объявлены переменные:
    • A[100][100] - двумерный массив 100x100;
    • m, n - переменные для хранения количества строк и столбцов матрицы соответственно;
    • r - флаг, хранящий информацию о том, находится ли максимальный элемент на главной диагонали;
    • r - флаг, хранящий информацию о том, находится ли максимальный элемент на главной диагонали;
    • i, j - индексы для обхода матрицы.
  2. Заполнение матрицы случайными числами от 0 до 9.
  3. Начинается выполнение кода на ассемблере:
    • lea esi,A - указатель на начало матрицы A;
    • xor ecx,ecx - инициализация счётчика;
    • mov eax,[esi] - загрузка первого элемента матрицы в eax;
    • xor edx,edx - инициализация счётчика для проверки главной диагонали;
    • goto lp2 - переход к следующей части кода.
  4. Первая часть кода (lp1) выполняет сравнение текущего элемента матрицы с первым элементом и сохраняет результат в r.
  5. Если текущий элемент больше первого, то:
    • inc ebx - увеличение индекса для перехода к следующему элементу;
    • cmp ebx,n - проверка выхода за границы матрицы;
    • jb lp1 - если выход за границы, то возврат к началу цикла;
    • mov ch,bl - сохранение в ch и bl значений dl и bl (для проверки на равенство);
    • mov cl,dl - сохранение в cl значения dl (для проверки на равенство).
  6. Если текущий элемент меньше или равен первому, то:
    • 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 - если не равны).
  7. После завершения выполнения кода на ассемблере выполняется проверка значения r и выводится соответствующее сообщение.
  8. Выполняется функция system(pause) для приостановки выполнения программы до нажатия клавиши.

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


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

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

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