• FASM Что не так с процедурой?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Что не так с процедурой?

    stdcall test_proc, 11
    …
    proc test_proc, ms
    …
    mov rbx, qword ptr ms


    ABI вызова не совпадает с ABI процедуры: 64-битный stdcall передаёт первый параметр в rcx, а test_proc ожидает его на стеке, в чём легко убедиться пропустив результат через objdump:

    403004:       48 c7 c1 0b 00 00 00    mov    $0xb,%rcx
    40300b:       e8 19 00 00 00          callq  0x403029
    …
    40307b:       48 8b 5d 10             mov    0x10(%rbp),%rbx
    Ответ написан
    Комментировать
  • Почему программа вообще заходит в цикл и почему тут же завершается при присваивании?

    Ответ для C++
    Не указав инициализатора при объявлении переменной num, вы используете default initialization. Почему? Смотрим по ссылке:
    Default initialization is performed in three situations:
    1) when a variable with automatic, static, or thread-local storage duration is declared with no initializer;

    Это как раз ваш случай.

    Далее:
    The effects of default initialization are:
    ......
    otherwise, no initialization is performed: the objects with automatic storage duration (and their subobjects) contain indeterminate values.

    Итого, согласно третьему описанному случаю, ваша переменная num содержит неопределённое значение (indeterminate value).

    Читаем далее:
    Use of an indeterminate value obtained by default-initializing a non-class variable of any type is undefined behavior (in particular, it may be a trap representation), except in the following cases:
    ...

    Ваш случай не попадает под исключения, следовательно вы схлопотали undefined behavior.

    Что такое undefined behavior? Это значит, что компилятор что хочет, то и генерирует на выходе:
    Compilers are not required to diagnose undefined behavior (although many simple situations are diagnosed), and the compiled program is not required to do anything meaningful.

    Вывод: не делать так, чтобы в программе был undefined behavior.

    Ответ для C
    Не указав инициализатора при объявлении переменной num, вы используете implicit initialization. Смотрим по ссылке:
    If an initializer is not provided:
    - objects with automatic storage duration are initialized to indeterminate values (which may be trap representations)
    ...

    Это как раз ваш случай.

    Читаем далее:
    If an indeterminate value is used as an argument to any standard library call, the behavior is undefined. Otherwise, the result of any expression involving indeterminate values is an indeterminate value (e.g. int n;, n may not compare equal to itself and it may appear to change its value on subsequent reads)

    Итого, у вас либо неопределённое поведение, либо неопределённое значение выражения, если там используется num. Значение в num может даже самопроизвольно меняться между операциями чтения из этой переменной.

    Вывод: не делать так, чтобы в программе встречалось использование indeterminate values.
    Ответ написан
    3 комментария
  • Нашел приватный мессенджер Prival, стоит ли пользоваться, надежен ли?

    @Sergei7774
    Автор темы прав. Эти серверные мессенджеры, которые заполонили интернет все читаются (вышел закон) и нужно от них уходить. Сам сижу на бессерверных Bitmessage и Тox
    Упоротые и страшные, как черти, но куда надёжнее чем обычная почта. К стати мою почту уже ломали, последний раз пароль украли. Ушёл от темы. Prival этот посмотрел сайт. Очень забавный сайт, сказать ничего не могу про ЭТО
    На мой взгляд хороший мессенджер Bitmessage хотя очень страшен и неудобен. Это смесь бульдога с носорогом, то есть почты как в программном виде. Имён там нет одни какие-то цифры, вобщем ни о чём. Тяжела работа хакера ))
    Ответ написан
    Комментировать
  • Реально ли поменять bluetooth пароль на китайском приемнике?

    15432
    @15432
    Системный программист ^_^
    Разобрать, определить модель микроконтроллера, найти программатор под него, считать прошивку, провести реверс-инжиниринг и найти, где там пароль, поменять его, залить обратно программатором.

    За пару месяцев для вас вполне реально.
    Ответ написан
    3 комментария
  • Как получают отрицательные значения напряжения?

    @nehrung
    Не забывайте кликать кнопку "Отметить решением"!
    Элементарно, Ватсон. Вот три способа:
    1. Если в схеме есть источник отрицательного напряжения больше 4 вольт - запитать от него трёхвыводный стаб (например, LT3094 с диодом в ножке управления) и получить на выходе -4 в.
    2. Если есть источник переменного напряжения с трансформатором на выходе, то сделать как нарисовано тут: i?id=7ccfc9056b4ed0ce9782d42168de737c-5905783-images-thumbs&n=13&exp=1 Но верхние диод с конденсатором убрать (они для отрицательного напряжения не нужны).
    3. Если есть такой же источник, но без трансформатора, то соорудить удвоитель, как нарисовано тут:i?id=38e9132ce2395a4b6af3ed651c299f76-sr&n=13&exp=1Здесь тоже есть лишняя деталь - один из конденсаторов, С2 или С3.
    Вижу, вас мой ответ не устроил. Но, как говорится. о чём спрошено, на то и отвечено.
    Ответ написан
    Комментировать
  • Почему время выполнения следующих SIMD инструкций такое?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Я не нашёл ничего почитать, но нашёл рекомендацию использовать llvm-mca, и для вариантов кода использующих SSE/AVX она дала мне показатели производительности которые совпали с наблюдаемыми на практике. Cоответственно, при желании можно почитать исходники llvm-mca (и добраться до модели пайплайна где-то в недрах llvm).

    Почему пятый вариант не выполняется в 4 раза быстрее, чем первый?

    Потому что скорость выполнения связана со сложностью опкодов. Так, выполнение vmulpd в пятом варианте занимает 4 такта и полностью перекрывается с остальными инструкциями цикла, так что даже нет смысла делать его короче, меняя add+cmp+jne на sub+jne.
    Ответ написан
    2 комментария
  • Как веб студии продвигают свои услуги?

    @d-sem
    Качественная работа, сарафанное радио, откаты, родственные связи.
    Ответ написан
    Комментировать
  • Как происходит присваивание матриц?

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    почему это происходит?

    Потому что:
    a = [1,2,3,5,6]
    b = a
    print(id(a))
    print(id(b))
    # 1552394418184
    # 1552394418184

    и A, и B - ссылаются после присваивания на один и тот же объект.

    что делать чтобы такого не было


    b = a.copy()
    print(id(a))
    print(id(b))
    # 1552394980744
    # 1552395031496

    теперь это два разных объекта
    Ответ написан
    1 комментарий
  • Поясните пожалуйста bash скрипт?

    @RayHex
    1. https://tldp.org/LDP/abs/html/process-sub.html
    2. bash это интерпритатор, вы всегда можете вставить куски выражения, и посмотреть что они выдают, например:
    echo <(ls -1 .)
    /dev/fd/63

    3. Ваш код мягко говоря дурно пахнет, а по сути он вообще кривой и будет сбоить на файлах со спецсимволами или даже пробелами. Можно сделать проще и правильнее:
    shopt -s nullglob
    for f in my_temp_dir/*; do
        echo "$f"
    done

    nullglob нужен для случаев когда файлов совсем не будет, без него подставится строка со *, и это может вызвать ошибку в вашем коде.
    Ответ написан
    Комментировать
  • Какой процент комментариев на хабре проходит модерацию?

    Protos
    @Protos
    Спрашивай - отвечу
    К моим статьям максимум 1/20 комментариев падает мне же на модерацию. Что касается комментариев которые и до одобрения мной не доходят не знаю. Мои же комментарии вроде бы все публикуются
    Ответ написан
    Комментировать
  • Как это быстро сделать?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Надо решить как можно больше аналитически.
    a + a + a = ...a
    Это возможно только при a = 0 или a = 5.
    k + k + k = ...k при a = 0 или k + k + k + 1 = ...k при a = 5
    Эта система имеет решение только при a = 0 и k = 5.
    s - это перенос из младшего разряда. Значит s ∈ {1, 2}.
    e + 0 + e = ...0 или e + 0 + e + 1 = ...0 или e + 0 + e + 2 = ...0
    Такое возможно только при e ∈ {0, 4, 5, 9}. Но 0 и 5 уже заняты. Значит e ∈ {4, 9}.
    Получаем
    int a = 0;
    int k = 5;
    for (int s = 1; s <= 2; s++) {
      for (int e = 4; e <= 9; e += 5) {
        ...Тут все остальные буквы.

    Такой анализ даст сокращение полного перебора в 2500 раз.
    Затем, можно сказать, что d > b > r, соответственно записать циклы как
    ...
        for (int d = 3; d <= 9; d++) {
          for (int b = 2; b < d; b++) {
            for (int r = 1; r < b; r++) {
              ...

    Это сократит перебор ещё почти в 12 раз (с 1000 циклов до 84)
    Для p, с учётом, что из младшего разряда переносится 1, а в старший должна уйти 2, можно записать условие
    d + b + p + 1 >= 20 => p >= 19 - d - b
    Значит получим цикл
    ...
              for (int p = 19 - d - b; p <= 9; p++) {
                ...

    z можно вообще не оборачивать в цикл, а вычислять как z = (d + b + p + 1) % 10.
    Это уменьшит перебор ещё в 10 раз.
    Ну и, как правило, в таких задачах есть условие, что разным буквам соответствуют разные цифры. Стоит добавить проверку там, где это необходимо.
    Суммарно перебор сократится более, чем в 300000 раз.
    Решение на PHP

    <?php
    $a = 0;
    $k = 5;
    $count = 0;
    for ($s = 1; $s <= 2; $s++) {
      for ($e = 4; $e <= 9; $e += 5) {
        for ($d = 3; $d <= 9; $d++) {
          if ($d == 5 || $d == $e) {
            continue;
          }
          for ($b = 2; $b < $d; $b++) {
            if ($b == 5 || $b == $s || $b == $e) {
              continue;
            }
            for ($r = 1; $r < $b; $r++) {
              if ($r == 5 || $r == $s || $r == $e) {
                continue;
              }
              for ($p = 19 - $d - $b; $p <= 9; $p++) {
                if ($p == 5 || $p == $s || $p == $e || 
                    $p == $d || $p == $b || $p == $r) {
                  continue;
                }
                $z = ($d + $b + $p + 1) % 10;
                if ($z == 0 || $z == 5 || $z == $s || 
                    $z == $e || $z == $d || $z == $b || 
                    $z == $r || $z == $p) {
                  continue;
                }
                $count += 1;
                $dedka = $d * 10100 + $e * 1000 + 50;
                $babka = $b * 10100 + 50;
                $repka = $r * 10000 + $e * 1000 + $p * 100 + 50;
                $skazka = $s * 100000 + $z * 100 + 50050;
                if ($dedka + $babka + $repka == $skazka) {
                  print " {$dedka}\n+{$babka}\n+{$repka}\n======\n{$skazka}\n";
                }
              }
            }
          }
        }
      }
    }
    print "count = {$count}\n";
    /*
     94950
    +80850
    +74350
    ======
    250150
    count = 17
    */


    Фактически, проверка основного условия выполнилась только 17 раз вместо 1000000000 в вашем случае.

    P.S. Да, и s можно тоже не перебирать, а вычислять. Тогда будет ещё быстрее, основная проверка выполнится 11 раз.
    Ответ написан
    Комментировать
  • Какой процент комментариев на хабре проходит модерацию?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Тебе кажется.

    Если у тебя нет полноценных прав на комментирование, то твои комментарии должны быть одобрены хотя бы автором статьи. А если автору лень или если он не читает комментарии, то и одобрения нет. Ну и одобрение может прилететь не сегодня и не завтра, а через неделю, всё это время комментарий будет висеть "на модерации".

    ПРЕмодерацию проходит очень небольшой процент комментариев. Примерно 1%. Сужу по комментариям к моим статьям.
    Ответ написан
    Комментировать
  • Как элегантно и переносимо определить instance Storable?

    wiz
    @wiz
    Ортодоксальный хаскелит
    Можно взять derive-storable и вывести через Generic.
    Ответ написан
    Комментировать
  • Какой фактический размер у типа Int на платформе GHC, Windows 64?

    @AlexSku
    не буду отвечать из-за модератора
    У меня maxBound ::Int чётко 2^31 (т.е 4 байта, старший бит - знак)
    Ответ написан
    1 комментарий
  • Можно ли из уравнения квадратной кривой Безье выразить значение параметра t?

    @alexalexes
    Можно.
    Для трех точек кривая Безье описывается как:
    P = (1−t)^2*P1 + 2(1−t)*t*P2 + t^2*P3
    Для координат X уравнение примет вид:
    X = (1−t)^2*X1 + 2(1−t)*t*X2 + t^2*X3.
    X - эта координата на кривой Безье, и X1, X2, X3 - это координаты X опорных точек.
    Очевидно, что X будет перебираться в области min(X1,X2,X3) до max(X1,X2,X3), но не факт что каждый X даст точку (или сразу две точки) на кривой Безье.
    Получается, что X1,X2,X3 - вы задаете сами, а X перебираете исходя из условия выше.
    Осталось разобраться, как найти t.
    Перепишем уравнение, чтобы известные координаты стали константами квадратного уравнения.
    X = X1 - 2*X1 + X1*t^2 + 2*X2*t - 2* X2 * t^2 + t^2*X3
    X = (X1 - 2*X2 + X3) * t^2 + 2 * (X2 - X1) * t + X1
    Получается квадратное уравнение:
    (X1 - 2*X2 + X3) * t^2 + 2 * (X2 - X1) * t + X1 - X = 0
    Коэф, которого:
    a = X1 - 2*X2 + X3
    b = 2 * (X2 - X1)
    c = X1 - X
    Решаете его, получаете 2 решения.
    Если есть решение с t в отрезке от 0 до 1, значит точка определена на кривой Безье (могут быть оба решения входить в отрезок 0,1 - это две разные точки!).
    Зная t, можно найти Y координату:
    Y = (1−t)^2*Y1 + 2(1−t)*t*Y2 + t^2*Y3
    Если решение уравнения не входит в данный отрезок, либо нет решения с действительным числом (дискриминант оказался отрицательным), то на данной координате X нет точки на кривой Безье.
    PS: Скорее всего вы найдете Y близкие к целочисленным значениям с некоторой погрешностью, можно округлять к ближайшему целому.
    Ответ написан
    Комментировать
  • Как лучше разместить в оперативной памяти массив комплексных чисел с точки зрения производительности?

    wataru
    @wataru
    Разработчик на С++, экс-олимпиадник.
    Если вы хотите быть дружественными к кэшу, то нужна локальность доступа к данным.

    Поэтому лучше в одном массиве чередовать реальную и мнимую части. Или, еще лучше - завести структуру с двумя полями и хранить массив из них. Тут в памяти расстановка данных будет такая же, но код будет читаем и логичен.
    Ответ написан
    Комментировать
  • Влияют ли строгие рамки режима рабочего дня на продуктивность у удаленщика?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    На компьютер установлен трекер, отслеживающий твою работа над проектом.

    Слежка за сотрудниками — это самый действенный способ включить негативный отбор и получить коллектив из абсолютно бесполезных, а то и вредных людей, ведь не уволятся только те, кто вообще никому больше не нужен.

    Работа подразумевает ежедневное участие в проекте по 8 часов.

    То есть руководство ориентировано не на результат, а на процесс. Однако, любой интеллектуальный труд в целом и программирование в частности работает иначе, чем копание траншей.
    Ответ написан
  • Как повторить эксперимент с двумя щелями в жизни?

    @rPman
    Расстояние между щелями должно быть сравнимы в несколько длин волн используемого света, в вики указана формула расчета на каком расстояни должен быть экран, и какие будут расстояния между линиями на экране в зависимости от расстояния между щелями
    Например, если две щели разделены на 0,5 мм (d) и освещены лазером с длиной волны 0,6мкм (λ), то на расстоянии 1м (z) расстояние между полосами составит 1,2 мм.

    Использовать фонарик тут не получится, нужен когерентный свет одной частоты, т.е. лазер

    p.s. Опыт_Юнга
    Опыт Юнга с двумя щелями повторить вне лаборатории непросто, так как непросто изготовить подходящей ширины щели. Однако с успехом можно воспроизвести самыми простыми средствами опыт интерференции от двух малых отверстий, суть происходящих при этом физических явлений не изменяется.

    Постановка опыта такова: в фольге от шоколадки следует самой тонкой швейной (лучше бисерной) новой иглой проделать два чрезвычайно тонких отверстия как можно ближе друг к другу. Не следует пропускать иглу насквозь, нужно лишь наколоть отверстия самым кончиком. Далее в хорошо затемнённой комнате осветить место проколов мощным источником света. Удобно воспользоваться лазерной указкой, так как её свет монохроматичен. На экране, расположенном в 0,5—1 метре удаётся наблюдать дифракционную картину и интерференционные полосы.
    Ответ написан
    2 комментария