Консультация № 183321
24.05.2011, 19:43
0.00 руб.
0 1 1
Добрый день, уважаемые эксперты! Прошу помочь с программой, не могу понять, как её реализовать:
Матрица (размерность 4х4). Найти номера строк, в которых есть числа, кратные пяти, и сформировать из них отдельный массив (номера не должны повторяться).
Матрицы для меня темный лес на АСМе. Все это дело на TASM
Большое спасибо.

Обсуждение

давно
Посетитель
7438
7205
25.05.2011, 14:33
общий
это ответ
Здравствуйте, Сонечкин Илья Федорович!
Предлагаю такой вариант решения.
Вообще говоря, можно было воспользоваться тем, 4 - степень двойки, деление релизовать через сдвиг,
но я сделал через деление, как более универсальный способ

[code h=207]
.model small

N equ 4
.data
array dw 125, 34, 67, 5
dw 1, 3, 98, 100
dw 4, 64, 67, 3
dw 78, 9, 10, 2
div5 dw N dup (?) ;сюда запишем номера строк элементов матрицы, кратных 5
count dw ? ;их количество

.code
main proc
mov ax, @DATA
mov ds, ax
mov es, ax

lea di, div5 ;адрес, куда писать
xor bx, bx ;база матрицы, одновременно индекс строки
mov cx, N ;число строк
mov count, 0 ;число чисел, кратных 5
mov bp, 5 ;будем делить на 5

RowLoop: ;цикл по строкам
push cx ;сохраним счетчик строк
mov cx, N ;число элементов в строке
xor si, si ;индекс в строке

ColLoop: ;цикл по колонкам в строке
mov ax, array[bx+si] ;очередной элемент
cwd ;превращаем в двойное слово dx:ax
idiv bp ;делим на 5
test dx, dx ;проверяем остаток
jnz next ;не делится нацело - пропускаем
cmp count, 0 ;если еще ничего нет,
je SaveRow ; то сразу пишем
;проверим, чтобы номера строк не повторялись
push di ;сохраним использованные регистры
push cx
mov ax, bx ;сформируем номер строки 0-4
mov cl, N*2 ;разделим на длину строки в байтах
div cl ;разделится нацело, поэтому ah=0
mov cx, count ;число запомненных номеров строк
lea di, div5 ;адрес номеров строк
repne scasw ;ищем, пока не равно
pop cx
pop di
jz next ;нашли - пропускаем элемент в строке
SaveRow: ;сохраняем
mov ax, bx ;сформируем номер строки 0-3
mov cl, N*2
div cl ;ax = 0, 1, 2, 3
stosw ;и сохраняем
inc count ;считаем
jmp NextRow ;дальше идти нет смысна - переходим на следующую строку
next: ;на следующий элемент в строке
inc si ;у нас слова, по 2 байта
inc si ;2 inc-а короче, чем add si,2 :)
loop ColLoop ;по колонкам
NextRow: ;переходим на следующубю строку
add bx, N*2 ;смещаем базу на 4 элементов
pop cx ;восстанавливаем счетчик строк
loop RowLoop ;по всем строкам

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

end main
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа