­
А вот и трапы к нам пожаловали, да, кристина? Или же «кравченко иван»?
Eugene
А в чём прикол, что люди встапают, но не пишут? А потом выбывают? Или они все "контроль тупости" не проходят? Сколько тут реально нормальных людей, которые хоть что-то шарят?
­
Куча ботов да людей, которые даже читать не умеют. Реальных людей, умеющих в ассемблер не более 50, разбирающихся на уровне "hello world" ещё 50 - 100.
Eugene
Еще попытка запуска конкурса :) #compo Напишите код для подсчёта кол-ва битовых цепочек в rcx, результат вернуть в rax. Битовая цепочка — это непрерывная последовательность одинаковых битов (от 1 до 64 шт). Для 0 или -1 ответ = 1. Для 255 ответ = 2. Для 2 (0...010b) ответ = 3. Побеждает самый короткий (в скомпилированном виде) код. Указывайте размер. Кому интересно — доп.заранее: посчитать отдельно кол-во цепочек из 1 и кол-во цепочек из 0 (rax, rdx соответственно). p.s. Доп.задание — значит «ещё одно», а не вместо основного 🙂
Danil
Ты награду придумал? :-)
Да и на интерес пойдет
Eugene
Ты награду придумал? :-)
Да, кто победит, тот молодец 👏
­
А оно всё так же висит...
Eugene
Все результаты тут, их уже почти целых ноль :) Краткость скомпиленного кода, разумеется, не гольф :)
Eugene
В следующий раз нужно сделать подсчёт кол-ва инструкций, чтобы проще было считать :))
Unknown
Всем привет, кто знает где можно подробно почитать про работу с дисками и их сегментами
Eugene
Привет, Юра. Работа есть разная. — Мышью в Explorer. — Высокоуровневые WinAPI (или какая там ОС тебя интересует?) — Читать по секторам, обращаясь к низкоуровневым API твоей ОС. — Работа с железом на самом низком уровне (ATA, AHCI). И под какую ОС это все? Далее: — Структура файловых систем, как я понял, тоже интересует (или только она). Каких именно, их много? А вообще, обычно читают в справочниках и спецификациях, иногда в книгах. Или тебе по-русски надо? p.s. Я спрашиваю не потому, что эксперт в этой области и сразу ссылок накидаю, а чтоб хоть понятен всем был вопрос.
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
Ну или пару xor eax,eax и inc eax в конце заменить на mov eax,1 (если считать кол-во инструкций, а не байты)
Aiwan \ (•◡•) / _bot
Зачем же так длинно? :) 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
Кстати, зачем вы (Aiwan, Космо) короткие числа заносите в r-регистры, когда достаточно в e, старшие же всё равно удалятся (в т.ч. xor eax,eax / inc eax)? А они короче, ибо без REX-префикса :))
Eugene
у меня с логическими тяжело, поэтому пишу как понимаю смысл
Это стандартный алгоритм подсчёта битов: cout = 0; while(n) { n &= (n-1); ++count; }
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
только через команду bsf
Aiwan \ (•◡•) / _bot
А где там bsf ?
там это где?
Eugene
cmp rbx,0 jl exit → test ebx,ebx jl exit профит 2 байта :)
Eugene
Aiwan \ (•◡•) / _bot
небуду его тогда писать, чтоб не показывать свое рукожопство
Eugene
bsf + btr ?
Eugene
Так-кто нормальный вариант тоже...
Aiwan \ (•◡•) / _bot
Aiwan \ (•◡•) / _bot
Так-кто нормальный вариант тоже...
в моем исполнении он будет длинным
Aiwan \ (•◡•) / _bot
но возможно быстрей, не надо по всей цепочки побитно пробегаться
Aiwan \ (•◡•) / _bot
ай, ладно, все, уделал
електр🟢нік ✙🟠рчбеч ඞ
@susume_tomorrow, на байт-то уменьшишь?
наконец-то допер, inc eax вместо rax
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
Eugene
btr возвращает прежнее значение бита в cf
Eugene
btr = bit test and reset
Eugene
Тут и кол-во циклов будет на 1 больше, так что не надо допом + 1 делать и проверять на 0.
Aiwan \ (•◡•) / _bot
тьфу, не внимательно команду прочел
Eugene
Предлагаю покумекать по поводу кол-ва единичных и нулевых цепочек. Принцип, по идее, тот же. Я в голове примерно представляю, но сам ещё не пробовал :))
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
Aiwan \ (•◡•) / _bot
надо что-то типа такого на вход сюда. чтобы таких, как я отсеять
ну да, типа если шарит то запускать сюда, а если студент не знающий то пусть остается во флуде и там все спрашивает
електр🟢нік ✙🟠рчбеч ඞ
:)) Тогда предлагаю посчитать отдельно кол-во цепочек из 1 (rax) и из 0 (rdx) 😁
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:
електр🟢нік ✙🟠рчбеч ඞ
29 байт
електр🟢нік ✙🟠рчбеч ඞ
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
Aiwan \ (•◡•) / _bot
да и там 1 байт
А ты знаешь историю 1 байта?))
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