Консультация № 183617
14.06.2011, 14:34
53.35 руб.
0 5 1
Здравствуйте, уважаемые эксперты! Прошу вас помочь в написании программы:
Дана целочисленная матрица в байтовом формате по строкам. Все операции обработки матрицы реализовать только циклами. При необходимости использовать макросы.
Размерность 4х4. Записать в отдельный массив столбец с максимальной суммой элементов.

Задача для TASM, model small.
Прошу как можно подробнее расписать комментарии к программе. Заранее благодарен.

Обсуждение

давно
Посетитель
7438
7205
14.06.2011, 14:38
общий
Здравствуйте.
Сразу несколько вопросов:
1) матрицу вводим или создаем в теле программы?
2) что-то выводить на экран надо или достаточно только сформировать массив? Смотреть будете в отладчике.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
14.06.2011, 16:32
общий
это ответ
Здравствуйте, oktan!

Вот Вам программа. Ничего не вводится и не выводится.
Исходная матрица чисел со знаком задана в сегменте данных.
Результирующий массив будете смотреть в отладчике...

Будут вопросы, пишите в мини-форуме.

[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 si, si ;индекс столбца
mov di, -32767 ;максимальная сумма элементов стобцов
; (в начале - самое маленькое число )
mov cx, N ;число слолбцов
ColumnsLoop:
push cx ;сохраним счетчик столбцов
xor dx, dx ;сумма элементов текущего стобца
xor bx, bx ;база строки матрицы (0, 4, 8, 12)
mov cx, N ;число элементов столбца (число строк)
RowsLoop: ;цикл подсчета суммы столбца
mov al, array[bx+si]; очередной байт
cbw ;превратим знаковый байт al в знаковое слово ax
add dx, ax ;складываем
add bx, N ;на следующую строку
loop RowsLoop ;по всем элементам столбца

cmp dx, di ;сравним найденную сумму dx с максимальной di
jle NextColumn ;если <=, то обходим
mov di, dx ;сохраним новую максимальную сумму
mov bp, si ;и индекс столбца с максимальной суммой
NextColumn: ;переход на новый столбец
inc si ;индекс нового столбца
pop cx ;восстановим счетчик столбцов
loop ColumnsLoop ;по всем столбцам

;макс сумма найдена, сохраним столбец с макс суммой
lea di, maxcol ;адрес, куда запишем
xor bx, bx ;база строки
mov si, bp ;индекс столбца
mov cx, N ;количество
CopyLoop:
mov al, array[bx+si];читаем
stosb ;пишем по адресу es:[di], di = di+1
add bx, N ;на следующую строку
loop CopyLoop ;по всем элементам столбца

mov ax, 4c00h ;выход в ДОС
int 21h

main endp

end main
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
16.06.2011, 17:53
общий
Адресаты:
Добрый день, Игорь Витальевич.
Отвечаю:
1) Матрицу объявляем в начале программы.
2) Только сформировать массив.

Игорь Витальевич, хотел бы вас попросить упростить программу. Написанно слишком профессионально (не сочтите за наглость).
давно
Посетитель
7438
7205
16.06.2011, 20:19
общий
Посмотрите такую версию...
Вместо адресации элементов по двум регистрам 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]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
17.06.2011, 00:13
общий
Адресаты:
Правда ваша Только не всегда то, что преподают в ВУЗе, нужно человеку сейчас или в будущем.
Форма ответа