Сумма элементов главной диагонали матрицы - Assembler

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

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

Добрый день. Дана матрица m*n. Выделить в ней наиболее подходящую квадратную матрицу и вычислить сумму элементов ее главной диагонали. Выделять наиболее подходящую квадратную матрицу сейчас не обязательно т.к.:
в такой матрице
1  2   3   4
5  6   7   8
9  10 11 12
 
и в такой
1   2   3
4   5   6
7   8   9
10 11 12
 
сумма главной диагонали в наиболее подходящей квадратной матрице будет состоять 
из элементов [0,0] + [1,1] + [2,2]
.model small
.stack 100h
.data
 
;размер матрицы
    rows    equ 3
    columns equ 4
    
    a   db  1,2,3,4
        db  5,6,7,8
        db  9,10,11,12
 
    sum dw  ?
 
.code
.486
 
    mov ax, @data
    mov ds, ax
 
;В bx будем хранить номер строки, в si - номер столбца. Вся нумерация начинается с нуля
    xor bx, bx
    xor ax, ax  ;тут будем копить результат
    mov cx, rows    ;внешний цикл будет перебирать строки
 
;начало расчета
c_external: push    cx  ;запоминаем текущее значение параметра внешнего цикла в стеке
    mov cx, columns ;внутренний цикл
    xor si, si  ;обнуляем номер столбца
 
; ************************************************************************************  
        c_internal: 
        
        cmp bx, si  ; если индекс строки = индекс столбца,
        je summ     ; то прибавляем к сумме
        jne next    ; иначе просматриваем дальше
    
        summ:
        add al, byte ptr a[bx][si] ; базовая индексная адресация со смещением 
        adc ah, 0
        
        next:
        inc si      ;переход к следующему столбцу
        
        loop c_internal
; ************************************************************************************
        
    pop cx
    add bx,columns    ;переходим к следующей строке
loop c_external
 
    mov sum, ax
 
    mov ah, 4ch
    int 21h
end
Проблема в коде выделенном комментариями. Подскажите почему эта часть кода отрабатывает 1 раз и в результат sum попадает только элемент [0,0]. Поиском пользовался, ответа не нашел.

Решение задачи: «Сумма элементов главной диагонали матрицы»

textual
Листинг программы
c_internal: 
        add al, byte ptr a[bx][si] ; базовая индексная адресация со смещением 
        adc ah, 0
        
        inc si      ;переход к следующему столбцу
        
        loop c_internal

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

Код выполняет базовую индексную адресацию со смещением для каждого элемента главной диагонали матрицы. Переменные al и ah используются для хранения суммы элементов. Переменная si используется для индексации столбцов. Список действий:

  1. Базовая индексная адресация со смещением используется для получения каждого элемента главной диагонали матрицы.
  2. Элементы складываются в al и ah.
  3. si увеличивается на 1 для перехода к следующему столбцу.
  4. Цикл повторяется до тех пор, пока все элементы главной диагонали матрицы не будут обработаны.

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

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