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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2016, 13:28   #11
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

vadimych, мы нули считаем, а не единицы, поэтому нужна
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 24.11.2016, 13:42   #12
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Можно заинвертировать и считать единицы...
waleri вне форума Ответить с цитированием
Старый 24.11.2016, 14:09   #13
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Можно заинвертировать и считать единицы...
Что заинвертировать?
shr al,1 + adc dx,0 считает единицы.
shr al,1 + cmc + adc dx,0 считает нули.
cmc - это инвертирование флага CF, нужно для нулей, для единиц ничего инвертировать не надо.
Если речь об этом, конечно
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 24.11.2016, 14:49   #14
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Такой еще хитрый алгоритм без условных переходов есть. Не asm, но все прозрачно. Счиает единицы
Код:
var a,b,c: Byte;
...
    a:=b;                     //в b исходный байт
    c:=a and $55;
    a:=((a shr 1) and $55)+c;
    c:=a and $33;
    a:=((a shr 2) and $33)+c;
    c:=a and $0F;
    a:=((a shr 4) and $0F)+c; //результат в a
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 24.11.2016 в 14:58.
Аватар вне форума Ответить с цитированием
Старый 24.11.2016, 15:57   #15
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от 7in Посмотреть сообщение
Что заинвертировать?
AL, чтоб экономить одну инстукцию в цикле, всегда считая единицы.
waleri вне форума Ответить с цитированием
Старый 24.11.2016, 16:50   #16
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

waleri, это да!

Аватар, огонь!
Перевёл в asm:
Код:
  ; исходное число в al (если надо считать нули, пишем здесь not al)
  mov ah,al
  and ah,55h  ; ah=al and 55h
  shr al,1
  and al,55h
  add al,ah   ; al=((al shr 1) and 55h)+ah
  mov ah,al
  and ah,33h  ; ah=al and 33h
  shr al,2
  and al,33h
  add al,ah   ; al=((al shr 2) and 33h)+ah
  mov ah,al
  and ah,0Fh  ; ah=al and 0Fh
  shr al,4
  and al,0Fh
  add al,ah   ; al=((al shr 4) and 0Fh)+ah
  ; результат в al
Проверил на всех 256 числах - работает!
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 24.11.2016, 17:05   #17
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Немного оптимизировал (на 3 байта)

Код:
; Подсчёт количества единичных битов в числе
; Вход: AL = число
; Выход: AL = результат (кол-во единичных битов)
Bit1Count proc
  ;not al  ; раскомментируйте эту строку, если нужно считать нули, а не единицы
  mov ah,55h
  and ah,al  ; ah=al and 55h
  shr al,1
  and al,55h
  add al,ah   ; al=((al shr 1) and 55h)+ah
  mov ah,33h
  and ah,al  ; ah=al and 33h
  shr al,2
  and al,33h
  add al,ah   ; al=((al shr 2) and 33h)+ah
  mov ah,0Fh
  and ah,al  ; ah=al and 0Fh
  shr al,4
  and al,0Fh
  add al,ah   ; al=((al shr 4) and 0Fh)+ah
  ret
Bit1Count endp
Вот двойная процедура:
Код:
;-------------------------------------------------------------------------------
; Подсчёт количества нулевых или единичных битов в числе (2 процедуры)
; Вход: AL = число
; Выход: AL = результат (кол-во битов)
; Изменяет регистр AH
;-------------------------------------------------------------------------------
; Подсчёт количества нулевых битов в числе
Bit0Count proc
  not al  ; считаем нули, а не единицы
;-------------------------------------------------------------------------------
; Подсчёт количества единичных битов в числе
Bit1Count proc
  mov ah,55h
  and ah,al  ; ah=al and 55h
  shr al,1
  and al,55h
  add al,ah   ; al=((al shr 1) and 55h)+ah
  mov ah,33h
  and ah,al  ; ah=al and 33h
  shr al,2
  and al,33h
  add al,ah   ; al=((al shr 2) and 33h)+ah
  mov ah,0Fh
  and ah,al  ; ah=al and 0Fh
  shr al,4
  and al,0Fh
  add al,ah   ; al=((al shr 4) and 0Fh)+ah
  ret
Bit1Count endp
Bit0Count endp
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru

Последний раз редактировалось 7in; 24.11.2016 в 17:24.
7in вне форума Ответить с цитированием
Старый 24.11.2016, 17:24   #18
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

А, нули, ну тогда пардон, недосмотрел. Хотя можно всё равно без cmc.

Код:
mov cx,8
mov dl,cl
mov al,1
@@:
shr al,1
sbb dl,0
loop @b
Как-то так.
vadimych вне форума Ответить с цитированием
Старый 24.11.2016, 17:31   #19
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Кстати, в новых процессорах никак не успокоящиеся чуваки из Интел запилили инструкцию, которая считает количество единиц в операнде. Можно ее использовать и вычитать результат из 8 )
Son Of Pain вне форума Ответить с цитированием
Старый 25.11.2016, 04:56   #20
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

7in,
  1. если поискать на сайбере, то я там несколько вариантов подсчета бит приводил
    Цитата:
    Сообщение от 7in Посмотреть сообщение
    мы нули считаем, а не единицы, поэтому нужна
    подсчитать количество единиц, а потом количество_нулей = количество_байт х 8 - количество_единиц
  2. по поводу Хочу сделать универсальный "компилятор" вот готовое решение

Последний раз редактировалось Mikl___; 25.11.2016 в 07:36.
Mikl___ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal Для каждого символа текста указать его относительную частоту появления в тексте student___ Помощь студентам 52 02.05.2013 18:12
Для каждого аi найти ki количество его повторов последовательности. Yakov112 Общие вопросы C/C++ 2 06.10.2012 23:18
Проверить точное количество строк, оставляя массив в исходном состоянии alt5000 PHP 8 02.12.2011 19:38
посчитать значение по каждой статье за определенный период для каждого листа Graver Microsoft Office Excel 5 04.12.2009 01:31
Вычислить и запомнить количество отрицательных элементов каждого столбца для матрицы A(10,10) , B (15,20) bitmania Помощь студентам 3 15.10.2008 01:06