Вопрос № 183311: Здравствуйте, уважаемые эксперты! Прошу Вас помочь в написании этой программы: Дана двухбайтовая двоичная строка. Найти в ней все сочетания из трех единиц (сочетание 11111 считать за три повторения). Задача для TASM, model small. Как ...
Вопрос № 183321: Добрый день, уважаемые эксперты! Прошу помочь с программой, не могу понять, как её реализовать: Матрица (размерность 4х4). Найти номера строк, в которых есть числа, кратные пяти, и сформировать из них отдельный массив (номера не должны повторятьс...
Вопрос № 183311:
Здравствуйте, уважаемые эксперты! Прошу Вас помочь в написании этой программы: Дана двухбайтовая двоичная строка. Найти в ней все сочетания из трех единиц (сочетание 11111 считать за три повторения). Задача для TASM, model small. Как я понимаю, можно двигать младший бит в CF. Но не могу понять как настроить счетчики. Заранее спасибо.
Отвечает Airyashov (Студент) :
Здравствуйте, Валитов Ринат Харисович! вариант решения
Код :
.model small ; модель пямяти для программы типа EXE
stack 100h ; сегмент стека
data ; сегмент данных
Sbit dw 1111011100011111b ; битовая строка
code ; сегмент кода
start: ; точка входа в программу
mov ax,@data; инициализация семента данных
mov ds,ax
xor cx,cx ; cx=0 тут считаем кол-во групп
mov dx,Sbit ; данные, загрузим битовую строку в регистр
mov ax, 111b ; ax=группа которую ищем
next:
mov bx,dx ; поместить строку во временный регистр
and bx,ax ; сдклать логическое И с группой
cmp bx,ax ; сравнить группу и результат предыдущей операции
jne @net_sovp ; если не совпадают переход
inc cx ; иначе, увеличить счетчик
net_sovp:
shl ax,1 ; сдвинуть группу на разряд влево
jnc @next ; проверяем, все ли групы прошли, нет продолжить цикл
; кол-во групп в cx
mov ax,4c00h ; номер функции DOS и параметр, завершить программу, код ошибки 0
int 21h ; вызов DOS
end @start ; точка входа
Ответ отправил: Airyashov (Студент)
Ответ отправлен: 25.05.2011, 13:50
Номер ответа: 267371 Россия, Казань Адрес: Казань ICQ # 317748666
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 267371
на номер 1151 (Россия) |
Еще номера »
Вопрос № 183321:
Добрый день, уважаемые эксперты! Прошу помочь с программой, не могу понять, как её реализовать: Матрица (размерность 4х4). Найти номера строк, в которых есть числа, кратные пяти, и сформировать из них отдельный массив (номера не должны повторяться). Матрицы для меня темный лес на АСМе. Все это дело на TASM Большое спасибо.
Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Сонечкин Илья Федорович! Предлагаю такой вариант решения. Вообще говоря, можно было воспользоваться тем, 4 - степень двойки, деление релизовать через сдвиг, но я сделал через деление, как более универсальный способ
Код :
.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
----- Люби своего ближнего, как самого себя
Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 25.05.2011, 14:33
Номер ответа: 267373 Украина, Кировоград Тел.: +380957525051 ICQ # 234137952 Mail.ru-агент: igorlyskov@mail.ru
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 267373
на номер 1151 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.