Консультация № 183311
24.05.2011, 14:07
0.00 руб.
0 3 1
Здравствуйте, уважаемые эксперты! Прошу Вас помочь в написании этой программы:
Дана двухбайтовая двоичная строка. Найти в ней все сочетания из трех единиц (сочетание 11111 считать за три повторения).
Задача для TASM, model small.
Как я понимаю, можно двигать младший бит в CF. Но не могу понять как настроить счетчики.
Заранее спасибо.

Обсуждение

Неизвестный
25.05.2011, 10:38
общий
25.05.2011, 10:40
проще смещать группу из трех бит в регистре
как-то так
Код:
xor cx,cx		;cx=0 тут считаем кол-во групп
mov dx,ваше слово ;данные
mov ax, 111b ;группа которую ищем

next:

mov bx,dx ;поместить во временный регистр
and bx,ax ;логическое И с группой
cmp bx,ax ;сравнить группу и результат операции предыдущей
jne net_sovp ;если не совпадают переход
inc cx ;увеличить счетчик

net_sovp:
shl ax,1 ;сдвинуть группу на разряд влево
cmp ax,1100000000000000b;проверяем, все ли групы прошли
jne next ;Нет продолжить цикл


давно
Старший Модератор
31795
6196
25.05.2011, 10:41
общий
Дана двухбайтовая двоичная строка.

т.е. это слово?
Но не могу понять как настроить счетчики.

А зачем их настраивать?
AX=любое число
BX=0000'0000'0000'0111

приблизительно так:
mov cx,14
@@01:
push ax
and ax,bx
xor ax,bx
;
ZF=1 - совпадение
;
pop ax
shl bx,1
loop @@01
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
25.05.2011, 13:50
общий
это ответ
Здравствуйте, Валитов Ринат Харисович!
вариант решения
Код:
.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 ; точка входа
Форма ответа