Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2011, 00:32   #1
dino-4udo
 
Регистрация: 15.02.2011
Сообщений: 6
По умолчанию Дано масив из 6 байт. Посчитать число 2х единиц, что расположены между нулями.

Ребят, помогите пожалуйста! не получается...

Дано массив из 6 байт. Рассматривая его, как массив с 48 бит, посчитать число 2х единиц, что расположены между нулями.
dino-4udo вне форума Ответить с цитированием
Старый 16.02.2011, 01:29   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

хм.. ну вот массив из 48 бит:

PHP код:
0100.0010.0110.0010.0100.0011.0100.1010.0100.0010.0101.0010 
и какой должен быть ответ?
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 16.02.2011, 05:30   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

veniside наверное требуется найти две единицы идущие подряд окруженные нулями, в твоем случае это только две пары 9 и 10 разряды и 22 и 23 разряды считая слева от 0 разряда
Mikl___ вне форума Ответить с цитированием
Старый 16.02.2011, 10:43   #4
dino-4udo
 
Регистрация: 15.02.2011
Сообщений: 6
По умолчанию

Цитата:
veniside наверное требуется найти две единицы идущие подряд окруженные нулями, в твоем случае это только две пары 9 и 10 разряды и 22 и 23 разряды считая слева от 0 разряда
да, именно так.
dino-4udo вне форума Ответить с цитированием
Старый 16.02.2011, 12:12   #5
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Или быть может под '2х' понимается число двоичных единиц, а не сдвоенных?
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 16.02.2011, 12:16   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> да, именно так.

Тогда вот пример на басме. Просто крутим весь наш массив вправо и смотрим, а нет ли 6 (= 0110) в младших битах.

На выходе edx будет содержать "число 2х единиц, что расположены между нулями".

Код:
  asm
     jmp   @start
     //
     // this must be in data segment!
     @bitarray: db 01000010b, 01100010b, 01000011b, 01001010b, 01000010b, 01010010b

  @start:
     sub  edx, edx   // count
     mov  ebx, 48  // number of bits

  @loopmain:
     // see if we got 0110 in last byte
     mov  al, byte ptr @bitarray[5]
     and  al, 0Fh
     cmp  al, 06
     jnz  @skip

     inc  edx  // increase counter

  @skip:
     // shift whole array to righ through carry by 1 bit
     lea  esi, @bitarray
     lea  edi, @bitarray
     mov  ecx, 6
     clc
  @loopshift:
     lodsb
     rcr  al, 1
     stosb
     loop @loopshift

     // do this 48 times (6 * 8 = 48)
     dec  ebx
     jnz  @loopmain

  end;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 16.02.2011, 15:08   #7
dino-4udo
 
Регистрация: 15.02.2011
Сообщений: 6
По умолчанию

спасибо большое... буду разбираться...
dino-4udo вне форума Ответить с цитированием
Старый 16.02.2011, 15:34   #8
dino-4udo
 
Регистрация: 15.02.2011
Сообщений: 6
По умолчанию

А если использывать команды сканирования бит bsf или bsr, если находим единичный бит смотрим, что за ним (с помощью команду test или логические сдвиги shr/shl), если единица и следом за ней ноль -- увеличиваем счетчик, иначе двигаем к следующей единице????
dino-4udo вне форума Ответить с цитированием
Старый 16.02.2011, 16:17   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Да, можно и так, конечно. Там только неудобно будет работать с битами на границах байт (слов), когда цепочка 0110 начинается в одном байте, а заканчивается в другом.

Есть ещё команда bt, если пересчитывать индекс бита в смещение, можно на её основе всё проверить. Особенно в 64-битном режиме, где все ваши 48 бит влезут в одну команду проверки.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 16.02.2011, 19:08   #10
dino-4udo
 
Регистрация: 15.02.2011
Сообщений: 6
По умолчанию

Код:
  asm
     jmp   @start
     //
     // this must be in data segment!
     @bitarray: db 01000010b, 01100010b, 01000011b, 01001010b, 01000010b, 01010010b

  @start:
     sub  edx, edx   // count
     mov  ebx, 48  // number of bits

  @loopmain:
     // see if we got 0110 in last byte
     mov  al, byte ptr @bitarray[5]
     and  al, 0Fh
     cmp  al, 06
     jnz  @skip

     inc  edx  // increase counter

  @skip:
     // shift whole array to righ through carry by 1 bit
     lea  esi, @bitarray
     lea  edi, @bitarray
     mov  ecx, 6
     clc
  @loopshift:
     lodsb
     rcr  al, 1
     stosb
     loop @loopshift

     // do this 48 times (6 * 8 = 48)
     dec  ebx
     jnz  @loopmain

  end;
а в DEBUG это реально сделать? а то там, на сколько я знаю нет меток перехода???
dino-4udo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти байт максимальным количестов единиц и байт с максмальным количеством нулей и разность (ассемблер) Beren42 Помощь студентам 0 15.12.2010 20:32
Найти байтс наибольшим числом единиц и найти байт с наибольшим чилом нулей. Найти разность число единиц м Beren42 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 14.12.2010 17:44
Assembler (массив, разм-ю 9 байт, проверка наличия 3х единиц в коде эл-та) Exelence Помощь студентам 1 05.12.2010 20:05
Дано натуральное число. Верно ли, что в этом числе нет цифры А. А задается с клавиатуры. Женечка92 Помощь студентам 9 03.04.2010 16:06
Не считает сумму между нулями nark25 Общие вопросы C/C++ 6 19.04.2009 19:02