Посмотрите такую версию...
Вместо адресации элементов по двум регистрам BX и SI сделал только по одному. Так проще?
Если тоже не очень, то дайте образец, как писать...
А вообще, изучайте, как надо писать на удивительном языке Ассемблера...
Чего-то мне кажется, что преподаватели не всегда прививают правильный стиль написания программ.
Их можно понять... Пока всем оболтусам втолкуешь, то тут не до красоты...
[code h=207];Дана целочисленная матрица в байтовом формате по строкам.
;Все операции обработки матрицы реализовать только циклами.
;При необходимости использовать макросы.
;Размерность 4х4. Записать в отдельный массив столбец с максимальной суммой элементов.
.model small
.stack 100h
N equ 4 ;размерность матрицы
.data
array db 1, 2, 3, 4 ;примерная матрица 4х4
db 1, 2, 3, 4
db 0, 1, 2, 3
db 2, 3, 1, 0
maxcol db N dup (?) ;массив, куда запишем столбец с максимальной суммой элементов
.code
main proc
mov ax, @DATA ;настроим сегментные регистры
mov ds, ax ;на сегмент данных
mov es, ax
xor di, di ;максимальная сумма элементов стобцов
; (в начале 0 - самое маленькое число )
xor si, si ;индекс первого элемента первого столбца
mov cx, N ;число столбцов
ColumnsLoop:
push cx ;сохраним счетчик столбцов
push si ;соохраним индекс первого элемента столбца
xor dx, dx ;сумма элементов текущего стобца
mov cx, N ;число элементов столбца (число строк)
RowsLoop: ;цикл подсчета суммы столбца
mov al, [si] ;очередной байт
mov ah, 0 ;превратим байт al в слово ax
add dx, ax ;складываем
add si, N ;на следующую строку
loop RowsLoop ;по всем элементам столбца
pop si ;восстановим индекс первого элемента столбца
cmp dx, di ;сравним найденную сумму dx с максимальной di
jbe NextColumn ;если <=, то обходим
mov di, dx ;сохраним новую максимальную сумму
mov bx, si ;и индекс начала столбца с максимальной суммой
NextColumn: ;переход на новый столбец
inc si ;начало на 1 вправо
pop cx ;восстановим счетчик столбцов
loop ColumnsLoop ;по всем столбцам
;макс сумма найдена, сохраним столбец с макс суммой
lea di, maxcol ;адрес, куда запишем
mov si, bx ;индекс столбца
mov cx, N ;количество
CopyLoop:
mov al, array[si] ;читаем
stosb ;пишем по адресу es:[di], di = di+1
add si, N ;на следующую строку
loop CopyLoop ;по всем элементам столбца
mov ax, 4c00h ;выход в ДОС
int 21h
main endp
end main
[/code]