Надежда слабая, но есть ли тут люди, разбирающиеся в Ассемблере?

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


Вот что получилось,переходы считает (выводит 9), но не считает переходы между байтами (например 10101010b,11111111b первый заканчивается на 0, а второй начинается с 1, это должно считаться, т.е должно быть 13). Как исправить, подскажите пожалуйста.


Assembler

data segment

mass db 10101010b,11111111b,0101010b, 11111111b, 10101010b, 11111111b,11111111b, 11111111b, 11111111b

data ends

code segment

assume cs: code, dsata

START: mov ax, data

mov ds, ax

xor ax,ax

lea bx, mass

mov cx, 9


beg: mov al, [bx]

push cx

mov cx,8


pr:shl al,1

jc no

test al, 10000000b

jz no

inc dl


no:

loop pr

pop cx

inc bx

loop beg


xor ax, ax

mov ax, 4c00h ; ??? ?????????? 0

Int 21h ; ????? ? DOS

code ends

end START

Автор поста оценил этот комментарий
Если "в лоб", то все просто: 1) для каждого участка массива считаем как я писал (с проверкой на мою погрешность); 2) между парами считаем переходы между старшим и младшим битами и добавляем к результату (опять же надо проверить). Вообще, самый простой способ, с учётом известных входных данных-просто самому посчитать и просто дропнуть на экран)
раскрыть ветку (1)
Автор поста оценил этот комментарий

а как реализовать проверку перехода между младшими и старшими битами? и возможно ли добавить в мой код эту проверку? может, какую то другую переменную использовать для запоминания последнего? зависла над этим

показать ответы
Автор поста оценил этот комментарий
Я про архитеуктуру и говорил) там можно проще намного: 1) берём два 128б регистра и xor каждый на себя; 2) в каждый кладем наш массив; 3) один шифтим влево; 4) xor на регистры; 5) биткаунт (sse4.2) даёт количество переходов. Тут может я на единичку ошибусь, но вроде так,-в маршрутке талант проседает((
раскрыть ветку (1)
Автор поста оценил этот комментарий

16 разрядные регистры((

показать ответы
Автор поста оценил этот комментарий

опять же не указана архитектура, один из вариантов, который пришел сразу в голову, переходим в 64 битный защищенный режим, там доступны регистры размерностью 128 бит, загоняем весь массив в него и считаем переходы, можно как у ТС, можно пару счетчиков отличающихся на 1, сдвигаемся в нужное место (1<<n) и (1<<n-1), где n нужные места и делаем xor, если 1 то преход, профит :)

раскрыть ветку (1)
Автор поста оценил этот комментарий

простите, что не уточнила, процессор i8086

1
Автор поста оценил этот комментарий

Для минусов