А вот и трапы к нам пожаловали, да, кристина? Или же «кравченко иван»?
Eugene
А в чём прикол, что люди встапают, но не пишут? А потом выбывают?
Или они все "контроль тупости" не проходят?
Сколько тут реально нормальных людей, которые хоть что-то шарят?
Куча ботов да людей, которые даже читать не умеют. Реальных людей, умеющих в ассемблер не более 50, разбирающихся на уровне "hello world" ещё 50 - 100.
Danil
Vyacheslav
Danil
Eugene
Еще попытка запуска конкурса :)
#compo
Напишите код для подсчёта кол-ва битовых цепочек в rcx, результат вернуть в rax. Битовая цепочка — это непрерывная последовательность одинаковых битов (от 1 до 64 шт).
Для 0 или -1 ответ = 1.
Для 255 ответ = 2.
Для 2 (0...010b) ответ = 3.
Побеждает самый короткий (в скомпилированном виде) код.
Указывайте размер.
Кому интересно — доп.заранее: посчитать отдельно кол-во цепочек из 1 и кол-во цепочек из 0 (rax, rdx соответственно).
p.s. Доп.задание — значит «ещё одно», а не вместо основного 🙂
Danil
Eugene
А оно всё так же висит...
Yura
Eugene
Все результаты тут, их уже почти целых ноль :)
Краткость скомпиленного кода, разумеется, не гольф :)
Eugene
В следующий раз нужно сделать подсчёт кол-ва инструкций, чтобы проще было считать :))
Unknown
Всем привет, кто знает где можно подробно почитать про работу с дисками и их сегментами
Eugene
Привет, Юра.
Работа есть разная.
— Мышью в Explorer.
— Высокоуровневые WinAPI (или какая там ОС тебя интересует?)
— Читать по секторам, обращаясь к низкоуровневым API твоей ОС.
— Работа с железом на самом низком уровне (ATA, AHCI).
И под какую ОС это все?
Далее:
— Структура файловых систем, как я понял, тоже интересует (или только она). Каких именно, их много?
А вообще, обычно читают в справочниках и спецификациях, иногда в книгах. Или тебе по-русски надо?
p.s. Я спрашиваю не потому, что эксперт в этой области и сразу ссылок накидаю, а чтоб хоть понятен всем был вопрос.
2lb3oz4dr10½grOfHedgehogs
Привет, Юра.
Работа есть разная.
— Мышью в Explorer.
— Высокоуровневые WinAPI (или какая там ОС тебя интересует?)
— Читать по секторам, обращаясь к низкоуровневым API твоей ОС.
— Работа с железом на самом низком уровне (ATA, AHCI).
И под какую ОС это все?
Далее:
— Структура файловых систем, как я понял, тоже интересует (или только она). Каких именно, их много?
А вообще, обычно читают в справочниках и спецификациях, иногда в книгах. Или тебе по-русски надо?
p.s. Я спрашиваю не потому, что эксперт в этой области и сразу ссылок накидаю, а чтоб хоть понятен всем был вопрос.
Везде бы таково справочного человека.. Спасибо
Eugene
Danil
Относительно битовой цепочки, есть подобный статистический анализ для двоичной последовательности, для этого можем написать луп, пробежаться по массиву значений на регистре, сравниваем предыдущее значение с последующим, если они равны, инкрементируем иттератор и пишем в буфер его значение, сохраняет на регистре, проверяем больше ли число таких чисел чем предыдущая последовательность, если да то сохраняем данные максимальной последовательности
если числа не равны, то сбрасываем счётчик, осталось придумать, как это написать на асме, да и помимо всего нам нужно сохранять все цепочки
електр🟢нік ✙🟠рчбеч ඞ
електр🟢нік ✙🟠рчбеч ඞ
Eugene
О, наклёвывается хорошее решение :))
Вопрос только тут в том, что будет, если мы имеем число 1 или 0x8000...000 или 0x0000FFFF ?
Вместо 2 получим 3 в ответе, так что rol тут не годится.
електр🟢нік ✙🟠рчбеч ඞ
та да, все упирается в потерю одного бита
Eugene
Eugene
Тут даже не потеря, а наоборот лишний бит.
електр🟢нік ✙🟠рчбеч ඞ
Eugene
👍
Eugene
Решение от Космо (ненастоящего):
mov rax,rcx
sar rax,1
xor rax,rcx
popcnt rax,rax
inc rax
Решение красивое, аплодисменты! 👏😜
(можно на 1 байт уменьшить — ответ же не будет больше 64, но в целом более оптимальное решение вряд ли найдётся)
Eugene
@susume_tomorrow, на байт-то уменьшишь?
електр🟢нік ✙🟠рчбеч ඞ
как доберусь до компа мб
Eugene
:))
Тогда предлагаю посчитать отдельно кол-во цепочек из 1 (rax) и из 0 (rdx) 😁
Aiwan \ (•◡•) / _bot
Относительно битовой цепочки, есть подобный статистический анализ для двоичной последовательности, для этого можем написать луп, пробежаться по массиву значений на регистре, сравниваем предыдущее значение с последующим, если они равны, инкрементируем иттератор и пишем в буфер его значение, сохраняет на регистре, проверяем больше ли число таких чисел чем предыдущая последовательность, если да то сохраняем данные максимальной последовательности
если числа не равны, то сбрасываем счётчик, осталось придумать, как это написать на асме, да и помимо всего нам нужно сохранять все цепочки
include 'win64wx.inc'
.code
start:
mov rcx,01010111000010111001b
xor rax,rax
mov dx,0101h
mov rbx,63
m1:
cmp rbx,0
jl exit
bt rcx,rbx
jnc @f
mov dl,TRUE
cmp dx,0101h
jne m2
inc rax
mov dh,FALSE
jmp m2
@@:
mov dh,TRUE
cmp dx,0101h
jne m2
inc rax
mov dl,FALSE
m2:
dec rbx
jmp m1
exit:
invoke ExitProcess,0
.end start
будет полезно если проц не поддерживает SSE4.2
на размер не претендует, но все же.
имхо, можно еще оптимизировать наверное
Aiwan \ (•◡•) / _bot
в голове еще 1 алгоритм крутится вот только я его даже словами пока не могу сформулировать
Eugene
include 'win64wx.inc'
.code
start:
mov rcx,01010111000010111001b
xor rax,rax
mov dx,0101h
mov rbx,63
m1:
cmp rbx,0
jl exit
bt rcx,rbx
jnc @f
mov dl,TRUE
cmp dx,0101h
jne m2
inc rax
mov dh,FALSE
jmp m2
@@:
mov dh,TRUE
cmp dx,0101h
jne m2
inc rax
mov dl,FALSE
m2:
dec rbx
jmp m1
exit:
invoke ExitProcess,0
.end start
будет полезно если проц не поддерживает SSE4.2
на размер не претендует, но все же.
имхо, можно еще оптимизировать наверное
Зачем же так длинно? :)
mov rax,rcx
sar rax,1
xor rcx,rax
xor eax,eax
jrcxz .zero
@@:
inc eax
lea rdx,[rcx-1]
and rcx,rdx
jnz @B
.zero:
inc eax
Eugene
Ну или пару xor eax,eax и inc eax в конце заменить на mov eax,1 (если считать кол-во инструкций, а не байты)
Aiwan \ (•◡•) / _bot
Eugene
Кстати, зачем вы (Aiwan, Космо) короткие числа заносите в r-регистры, когда достаточно в e, старшие же всё равно удалятся (в т.ч. xor eax,eax / inc eax)? А они короче, ибо без REX-префикса :))
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
только через команду bsf
Eugene
Aiwan \ (•◡•) / _bot
Eugene
cmp rbx,0
jl exit
→
test ebx,ebx
jl exit
профит 2 байта :)
Eugene
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
небуду его тогда писать, чтоб не показывать свое рукожопство
Eugene
bsf + btr ?
Eugene
Так-кто нормальный вариант тоже...
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
но возможно быстрей, не надо по всей цепочки побитно пробегаться
Aiwan \ (•◡•) / _bot
ай, ладно, все, уделал
електр🟢нік ✙🟠рчбеч ඞ
Eugene
только через команду bsf
А, кстати, неплохой вариант с bsf + btr получается:
mov rax,rcx
sar rax,1
xor rcx,rax
xor eax,eax
@@: inc eax
bsf rdx,rcx
btr rcx,rdx
jc @B
Aiwan \ (•◡•) / _bot
Eugene
btr возвращает прежнее значение бита в cf
Eugene
btr = bit test and reset
Eugene
Тут и кол-во циклов будет на 1 больше, так что не надо допом + 1 делать и проверять на 0.
Aiwan \ (•◡•) / _bot
тьфу, не внимательно команду прочел
Eugene
Предлагаю покумекать по поводу кол-ва единичных и нулевых цепочек.
Принцип, по идее, тот же.
Я в голове примерно представляю, но сам ещё не пробовал :))
Aiwan \ (•◡•) / _bot
include 'win64wx.inc'
.code
start:
mov rcx,01010111000010111001b
xor rax,rax
mov dx,0101h
mov rbx,63
m1:
cmp rbx,0
jl exit
bt rcx,rbx
jnc @f
mov dl,TRUE
cmp dx,0101h
jne m2
inc rax
mov dh,FALSE
jmp m2
@@:
mov dh,TRUE
cmp dx,0101h
jne m2
inc rax
mov dl,FALSE
m2:
dec rbx
jmp m1
exit:
invoke ExitProcess,0
.end start
будет полезно если проц не поддерживает SSE4.2
на размер не претендует, но все же.
имхо, можно еще оптимизировать наверное
это код дополнить счетчиками и все
́🇷🇺
Eugene
Есть же боты типа "реши пример 13+45".
Aiwan \ (•◡•) / _bot
ан не, все правильно
include 'win64wx.inc'
.code
start:
mov rcx,011101110b
xor rax,rax
mov dx,0101h
mov rbx,63
xor r8,r8
xor r9,r9
m1:
cmp rbx,0
jl exit
bt rcx,rbx
jnc @f
mov dl,TRUE
cmp dx,0101h
jne m2
inc rax
inc r8
mov dh,FALSE
jmp m2
@@:
mov dh,TRUE
cmp dx,0101h
jne m2
inc rax
inc r9
mov dl,FALSE
m2:
dec rbx
jmp m1
exit:
invoke ExitProcess,0
.end start
r8 - 1
r9 - 0
електр🟢нік ✙🟠рчбеч ඞ
29 байт
Aiwan \ (•◡•) / _bot
mov rax,rcx
sar rax,1
xor rax,rcx
popcnt rax,rax
inc eax ;written earlier
shr eax,1 ;cf = lsb eax
mov edx,eax ;edx=eax, cf not affected
jnc .end ;if eax was even
inc eax ;eax=edx+1
shr ecx,1 ;if ecx lsb(and msb)=0 then edx must be eax+1
jc .end
xchg eax,edx
.end:
xchg eax,edx обязательно?
електр🟢нік ✙🟠рчбеч ඞ
електр🟢нік ✙🟠рчбеч ඞ
так что да
електр🟢нік ✙🟠рчбеч ඞ
да и там 1 байт
Eugene
У меня 37 байт:
mov rax,rcx
shr rax,1
not rax
and rax,rcx
popcnt rax,rax
not rcx
mov rdx,rcx
shr rdx,1
not rdx
and rdx,rcx
popcnt rdx,rdx
Eugene
Eugene
Эх, попытался модифицировать, но получилось на 3 байта больше (32 байта).
mov rax,rcx
sar rax,1
xor rax,rcx
popcnt rax,rax
inc eax ; total count
shr eax,1 ; cf = lsb of eax
mov edx,eax ; edx = eax, cf not affected
jnc .ok ; if eax was even
shr ecx,1
setnc cl
adc eax,0
add dl,cl ; if lsb (and msb) of ecx == 0 then edx = eax+1
.ok:
@susume_tomorrow 🏆😉
Yura
http://ms.roller.ru/
Eugene
Ну что, едем дальше? :))
#compo
Дано 128-битное делимое (по адресу [rcx]) и 64-битный делитель (в регистре rdx).
Вернуть частное от деления (записать 128 бит по адресу [r8]) и остаток в регистре rax.
а) Для беззнаковых чисел.
б) Для знаковых чисел.
Выигрывает тот, чей код будет занимать меньше памяти (в скомпилированном виде).
p.s. У меня есть своё решение, но интересно глянуть на другие. Хотя, код там небольшой, и скорее всего будет примерно то же самое, особенно для беззнакового :)
Max
Всем привет. Есть новичковый (возможно, тупой) вопрос. Мне кажется, тут бесконечный цикл, но я уверен, что так быть не должно. Тут каждую итерацию в счетчик залетает i*4 - 1, а так он никогда не достигнет нуля. Или я чего-то не понимаю? Может, пропустил что-то?
Max