Сумма элементов главной диагонали матрицы - Assembler
Формулировка задачи:
Добрый день.
Дана матрица m*n. Выделить в ней наиболее подходящую квадратную матрицу и вычислить сумму элементов ее главной диагонали.
Выделять наиболее подходящую квадратную матрицу сейчас не обязательно т.к.:
Проблема в коде выделенном комментариями. Подскажите почему эта часть кода отрабатывает 1 раз и в результат sum попадает только элемент [0,0].
Поиском пользовался, ответа не нашел.
в такой матрице 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Решение задачи: «Сумма элементов главной диагонали матрицы»
textual
Листинг программы
c_internal: add al, byte ptr a[bx][si] ; базовая индексная адресация со смещением adc ah, 0 inc si ;переход к следующему столбцу loop c_internal
Объяснение кода листинга программы
Код выполняет базовую индексную адресацию со смещением для каждого элемента главной диагонали матрицы. Переменные al и ah используются для хранения суммы элементов. Переменная si используется для индексации столбцов.
Список действий:
- Базовая индексная адресация со смещением используется для получения каждого элемента главной диагонали матрицы.
- Элементы складываются в
alиah. siувеличивается на 1 для перехода к следующему столбцу.- Цикл повторяется до тех пор, пока все элементы главной диагонали матрицы не будут обработаны.