В этой статье представлены некоторые известные алгоритмы, которые как смог, переработал до крошечного вида. Данные образцы оптимизированы по размеру, но не по скорости выполнения.
CRC-32
mov esi, text ; адрес начала строки
mov ecx, 6 ; длина строки
xor eax, eax ; инициализация линии задержки единицами
dec eax ; выставляем все биты в 1
loading: xor al, [esi] ; складываем по модулю 2, символ с линией
inc esi ; получаем адрес следующего символа
mov ebx, 8 ; будем сдвигать восемь бит
b8: shr eax, 1 ; сдвиг вправо на 1 бит
jnc @f ; пропустим если младший бит не выпал
xor eax, 0EDB88320h ; складываем линию с полиномом
@@: dec ebx ; счётчик битов уменьшаем на 1
jnz b8 ; повторим сдвиг битов
loop loading ; повторим действие со следующим символом
not eax ; инверсия результата
ret ; выходим
text: db "CRC-32"
CRC-64 ECMA 182
xor eax, eax ; инициализация лини задержки нулями
mov rsi, text ; адрес начала строки
mov ebx, 14 ; длина строки
mov rdx, 42F0E1EBA9EA3693h ; зеркальный полином
ld: mov ecx, 8 ; число бит в байте
bswap rax ; переворачиваем линию
xor al, byte [esi] ; складываем по модулю 2, линию и символ
inc esi ; адрес следующего символа
bswap rax ; возвращаем линию
shf: shl rax, 1 ; сдвигаем линию вправо на 1 бит
jnc @f ; младший бит выпал?
xor rax, rdx ; да, складываем полином с линией задержки
@@: loop shf ; нет, повторим сдвиг оставшихся битов
dec ebx ; уменьшаем счётчик оставшихся символов на 1
jnz ld ; повторим цикл со следующим символом
ret ; выходим, если символы закончились
text: db "CRC64_ECMA_182"
Оптимизированная гномья сортировка по возрастанию однобайтовых значений
mov esi, array ; адрес начала сортируемых однобайтовых данных
mov edi, esi ; дублируем адрес
next: inc edi ; увеличиваем адрес для следующего символа
back: mov ax, [esi] ; берём два смежных символа
cmp al, ah ; сравниваем их
cmovbe esi, edi ; если они отсортированы, будем брать следующий
jbe next ; переход, если уже отсортированы
cmp edi, last ; сравниваем текущий адрес с концом массива
jae exit ; выходим, если дошли до последнего байта
xchg al, ah ; обменяем местами 2 неотсортированных байта
mov [esi], ax ; сохраним их
dec esi ; будем шагать на один символ назад
jmp back ; повторим цикл
exit: ret ; выходим
db 0
array: db "Gnome optimized sort algorithm"
last:
Комментарии (2)
forthuser
24.11.2021 19:49+ разные ассемблеры и для разных архитектур
на rosettacode.org собраны на этой странице
forthuser
Здесь решённые некоторые алгоритмические задачи на ассемблере 8086
Здесь ещё не решённые на 8086
Но, на rosettacode.org путаница в названии ассемблерных языков для x86
есть ещё и X86_Assembly
и X86-64_Assembly
и 80386_Assembly
А, для какого ассемблера и поколения процессора x86 Ваш код и как вы проверяете его работоспособность? (предположу что начиная с 32-х битного 80386 и ассемблер, возможно, Fasm)
А, то боюсь, что публикация этой статьи-заметки будет воспринята не правильно и заминусована пока Вы её сами не скроете в чeрновиках.
Возможно Ваши решения уместно опубликовать в рамках rosettacode.org Wiki?
P.S. На форуме сайта wasm.in есть даже и такая тема Уроки от NeHe на masm64 (т.е. решения OpenGL в рамках 64-х бит ассемблерного кода)