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

Дан массив из 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
Автор поста оценил этот комментарий

эмм, архитектура? алгоритм где? кстати, кто мешает накатать на с++ и дизассемблировать?

раскрыть ветку (23)
Автор поста оценил этот комментарий
Какого размера регистры доступны?
раскрыть ветку (22)
Автор поста оценил этот комментарий
Не тому ответил ( А так, смахивает на 16 битный DOS, популярный в институтах. Эххх... Сколько я уже не видел int в ассемблере
раскрыть ветку (21)
Автор поста оценил этот комментарий

смотря что нужно сделать ТС, если он(она? я так и не понял) хочет обрабатывать массив байт, при желании можно будет подобрать набор SIMD инструкций делающих всю работу за 10-20 тактов (буквально)

раскрыть ветку (20)
Автор поста оценил этот комментарий
Абсолютно согласен что от достпной/разрешенной к использованию ISA зависит полностью. Только, полагаю, что задание было сделать "в лоб" как то( Для векторных операций я такой команды не вспомню,- есть такая?
раскрыть ветку (19)
Автор поста оценил этот комментарий

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

раскрыть ветку (18)
Автор поста оценил этот комментарий
Блин, только заметил, на кой ляд какой то защищённый режим? Ты про какую ОС и в каком режиме загрузки? RT с блокировками кэшей, обычное и не патченное?
раскрыть ветку (8)
Автор поста оценил этот комментарий

хм, ассемблер для меня хобби, не более, я самоучка. перерыл литературу и не нашел, где в реальном режиме можно получить доступ к xmm регистрам? только в защищенном. сможет ли tasm под дос скомпилировать текст с xmm регистрами?


про х86-64 наверное я погорячился, можно и на третьем пеньке к первым восьми xmm регистрам получить доступ, а это уже SSE набор команд, если не ошибаюсь.

раскрыть ветку (5)
Автор поста оценил этот комментарий
Оф топ, дос + тасм: друг это 16б херня)) Надо использовать полностью способности камня, а не эмулятора их теперешнего) Есть много интересного на эту тему
раскрыть ветку (3)
Автор поста оценил этот комментарий

gcc под linux? в частности GAS?

раскрыть ветку (2)
Автор поста оценил этот комментарий
GCC- компилятор, включающий многие стадии от сорца до бинарника. Он отличный в пользовании 🤗
раскрыть ветку (1)
Автор поста оценил этот комментарий
Если процессор имеет такие регистры и у него есть сопутствующий набор инструкций,то смело вперёд. Для начала я бы посоветовал пользоваться интринсиками - аналог асм блоков, точный гайд и объяснения на софтвейр интел ком (Гугл точный адрес подскажет). В целом-пользуй профилирование Аля vtune, Advisor- много полезного. Там и в маскированных 512б операциях начнёшь разбираться. А в целом-молодец (без иронии), уже с симдом (векторными регистрами, считай от части знаком). Ну и опен форумы, конечно)
Автор поста оценил этот комментарий

слушай, а ты не дружишь с USB Audio Class 1.0 на ARM процессорах? всю голову сломал, не могу одолеть 24 битный режим вывода звука, в 16 бит всё норм

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

ты гений, тебе надо видео кодеки писать. что бы на слабеньких процах гоняло. отличное решение

раскрыть ветку (1)
Автор поста оценил этот комментарий
Тут о производительности то кто говорил? Решение, конечно, "говно", но минимально написанное) А так, надо учитывать ахренеть как много, для перформанса, когда на асме пишешь, вплоть до размера пайплайна (особенно на атомах)
Автор поста оценил этот комментарий

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

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

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

раскрыть ветку (1)
Автор поста оценил этот комментарий
В один регистр загружаем одну часть массива, делаем шифт до старшего бита (чтобы стал младшим значащим). В другой-соседнюю часть и шифт на малдший бит по той же схеме. Дальше xor) Я сегодня шибко добрый (хотя бы за такой пост) и если найдешь как мне в личку написать, то я тебе завтра код пришлю-безвозместно, конечно же.
Автор поста оценил этот комментарий

Mov dl,0

Mov ah,0

beg:

mov al, [bx]

push cx

mov cx,8

pr:

Mov di,ax

And di,180h

Cmp di,80h

Jnz no

Inc dl

no:

Shl ax,1

loop pr

pop cx

inc bx

Loop beg

В ah младшем бите можнохранить предыдущий бит

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

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

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку