Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/34: Рейтинг темы: голосов - 34, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 6

Подсчитать количество единичных битов в массиве чисел (для Х86)

20.01.2016, 10:58. Показов 6752. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый! Очень тяжело освоить ассемблер, но сдавать как-то нужно. Если арифметическими опреациями разобралась, то эта задача поставила в тупик. Помогите, пожалуйста кто понимает (пишу в С++ с ассемблерной вставкой).

Задача.
Задан массив из 10 произвольных чисел (десятичных)
Найти количество единичных битов в этом массиве чисел.

Спасибо. Буду благодарна и за советы и за помощь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.01.2016, 10:58
Ответы с готовыми решениями:

В каждом элементе массива А[10] подсчитать количество единичных битов среди разрядов с номерами от 3 до 6
В каждом элементе массива А подсчитать количество единичных битов среди разрядов с номерами от 3 до 6. Размещайте сообщения на русском...

Подсчитать количество единичных битов в числе произвольной размерности (вставка на Assembler в Pascal)
Помогите написать программу Подсчитать количество единичных битов в числе произвольной размерности, представленном в виде массива...

Написать функцию, которая для заданного x посчитает количество единичных битов в этом числе.
Написать функцию, которая для заданного x посчитает количество единичных битов в этом числе. Проблема состоит в том, что все время...

8
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6206 / 2441 / 402
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
20.01.2016, 11:04
..почитай про "команды работы с битами": SHL/ROL и т.п.
Берёш байт и выталкиваешь в нём биты. Если вытолкнулся 1, то увеличиваешь счётчик.., и так со-всеми байтами массива
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
20.01.2016, 11:12
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
a dw 1,2,3,4,5,6,7
...
mov cx,6
xor bx,bx
for:
 mov ax,[a+cx*2] ;Берем очередной элемент
 push cx ;Готовим цикл прохода по его битам
 mov cx,16
 for2:
  test ax,1 ;сравниваем очередной бит элемента с единицей
  jne next ;Если ноль - обходим инкремент кол-ва битов
   inc bx ;иначе увеличиваем счетчик битов в ВХ на 1
  next:
  shr ax,1; Сдвигаем биты вправо, чтоб добраться до следующего бита
 loop for2
 pop cx ;Возвращаемся к следующему элементу
loop for
..
Тут выводим на экран число из ВХ - в нем будет кол-во единичных битов
С коленки, но думаю сам смысл верный
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
20.01.2016, 11:24
Hikari-тян,
проще нужно
Assembler
1
2
3
4
5
6
7
lodsw
push cx
mov cx,16
@@: shr ax,1
adc bx,0
loop @b
pop cx
3
3410 / 1829 / 489
Регистрация: 28.02.2015
Сообщений: 3,696
20.01.2016, 11:36
Assembler
1
2
3
4
5
6
7
8
9
10
    mov cx,10
    lea si,mass
    cld
    xor bx,bx
@@01:   lodsw
@@02:   shr ax,1
    adc bx,0
    or  ax,ax
    jnz @002
    loop    @@01
Добавлено через 7 минут
Цитата Сообщение от Hikari Посмотреть сообщение
С коленки

mov ax,[a+cx*2]
bx, bp, si и di и без маштабирования.
3
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
20.01.2016, 11:46
можно использовать команду POPCNT r, r/m* — (Return the Count of Number of Bits Set to 1)
Подсчет числа единичных битов. Три варианта инструкции: для 16, 32 и 64-х битных регистров
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
20.01.2016, 11:52
Цитата Сообщение от Mikl___ Посмотреть сообщение
проще нужно
Аригато, семпай
Я не оч. по ассемблеру. Так... по мелочам...
Цитата Сообщение от Constantin Cat Посмотреть сообщение
bx, bp, si и di и без маштабирования.
Согласно, просто не сразу в голову пришло lods использовать.
0
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 6
20.01.2016, 12:10  [ТС]
Спасибо всем, огромное!!!
Пойду разбираться
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
21.01.2016, 13:51
  1. можно немного ускорить процесс вычисления
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    mov edx,N - количество двойных слов в массиве
        lea esi,mass
        xor ebx,ebx
    @1:   lodsd    
        bsr ecx,eax <-- ищем старший ненулевой бит
        jz @3 <-- если eax=0 переходим к следующему элементу
        not ecx
        add cl,33
        shl eax,cl <-- пропускаем ненужные разряды
    @2:adc ebx,0
       shl eax,1
        jnz @2
    @3:   sub edx,1
        jnz    @1
  2. еще один вариант подсчета единичных битов
    Assembler
    1
    2
    3
    4
    5
    6
    7
    
       xor ebx,ebx <-- счетчик
       or eax,eax
       jz exit
    @@: inc ebx
       lea ecx,[eax-1]
       and eax,ecx <-- в регистре EAX циклически сбрасывается крайний справа единичный бит (проверьте сами)
       jnz @b
  3. пусть имеется массив table с 256 подсчитанными заранее числом единиц в байте, тогда
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    .data
    table db 0,1,1,2,1,2,2,2,3,1,2,2,...,7,8
    count db 0
    .code
    mov ebx,offset table
    ...
    @@: lodsb
           xlat
           add count,al
           loop @b
  4. еще один вариант
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    .data
    ...
    count dd 0
    ...
    .code
    ...
         lodsd
         mov ebx,eax
         or eax,eax
         jz exit
         shr eax,1
    @@:sub ebx,eax
         shr eax,1
         jnz @b
    exit: add count,ebx
         ...
  5. и еще один вариант
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
       mov ebx,8040201h
        mov edi,11111111h
            xor eax,eax
    .....
            lodsb        ;в 32 разрядах регистра только 8 младших 
        mul ebx    ;создаем четыре копии байта каждый со сдвигом в 1 разряд
        shrd eax,edx,3  ;удаляем ненужные биты
        and eax,edi;выделяем каждый четвертый бит
        mul edi;сложение
        shr eax,28;результат в еах
            add count,eax
  6. еще один способ
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
            lodsd
        mov ebx,eax
        shr ebx,1
        and ebx,77777777h;n=(х >> 1) & 0x77777777 Подсчет битов
        sub eax,ebx      ;x=x-n                   в 4-х битовых
            shr ebx,1          ;                       полях
        and ebx,77777777h;n=(n >> 1) & 0x77777777
        sub eax,ebx      ;x=x-n
            shr ebx,1
        and ebx,77777777h;n=(n >> 1) & 0x77777777
        sub eax,ebx      ;x=x-n
        mov ebx,eax
        shr ebx,4
        add eax,ebx
        and eax,0F0F0F0Fh;x=(x+(x >> 4))& 0xF0F0F0F вычисление сумм
        imul eax,1010101h;x=x * 0x1010101           сложение байтов
        shr eax,24
            add count,eax
идеи для 2-6 способов взяты из книги Генри Уоррена "Алгоритмические трюки для программистов"
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.01.2016, 13:51
Помогаю со студенческими работами здесь

Написать функцию, которая для заданного числа Х вычисляет количество единичных битов в этом числе
Написать функцию, которая для заданного числа Х вычисляет количество единичных битов в этом числе, используя побитовые операции и функции...

Количество единичных битов
Название Размерность Тип D 16 вход C 5 выход На входе D двоичное...

Сосчитать количество единичных битов в АХ
помогите решить.... Сосчитать количество единичных битов в АХ. Результат поместить в ВХ.

Функции. побитовые операции. Написать функцию, которая для заданного целого числа Х вычисляет количество единичных битов в этом числе
Здравствуйте, уважаемые мастера программирования. Нуждаюсь в вашей помощи. Написать функцию, которая для заданного целого числа Х...

Определить количество единичных битов в числе
Дано натуральное число меньше 256. Посчитать количество его единичных битов. Например, если дано число 9, запись которого в двоичной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru