• Код C, который не будет работать в C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вот пример с двумя файлами, который компилируется и как С и как С++, но линкуется только как С. Различие между языками в наличии в С tentative definition:
    Файл a.c:
    int i;
    
    int main()
    {
        i = 1;
        return 0;
    }


    файл b.c:
    int i;
    
    int f(void)
    {
        i = 1;
        return 0;
    }


    $ gcc -std=c89 a.c b.c -o a
    $ gcc -std=c99 a.c b.c -o a
    $ gcc -std=c11 a.c b.c -o a
    $ g++ a.c b.c -o a
    /tmp/cc8AfU2T.o:(.bss+0x0): multiple definition of `i'
    /tmp/ccBOJ29v.o:(.bss+0x0): first defined here
    collect2: error: ld returned 1 exit status
    Ответ написан
    Комментировать
  • Можно ли считать константный указатель аналогом ссылки в С++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Нет, но разница более существенная, чем возможность присвоить nullptr. Константной ссылкой можно удлинить время жизни временного объекта, а указателем -- никаким нельзя.
    Например так можно:
    T f();
    ...
    const T& obj = f();
    obj.foo();

    -- объект вернувшийся из функции f не будет разрушен до выхода obj из области видимости.

    А так -- нельзя:
    T f();
    ...
    const T* const obj = &(f());
    obj->foo();

    -- этот код даже не скомпилируется, поскольку тут берётся адрес временного объекта.
    Ответ написан
    Комментировать
  • Какие правильно задать права доступа символьной ссылке?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Права ссылке менять не надо, в линуксе они всё равно не имеют значения.
    Надо проверить, что пользователь может достать оригинальный файл по оригинальному пути, т.е. что на всех каталогах он имеет x, а на самом файле -- r.
    Ответ написан
    1 комментарий
  • Какие параметры надо передать в ReadConsole?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    stdcall [ReadConsole],GENERIC_READ,Message,13,0,0

    Первым параметром надо дескриптор файла консоли передать. GENERIC_READ -- это не файловый дескриптор, это требуемый доступ к файлу, чтобы ReadConsole могла из него читать. Требуемый дескриптор можно получить вызовом GetStdHandle(STD_INPUT_HANDLE).
    И я не уверен, что lpNumberOfCharsRead может быть NULL.
    Ответ написан
    Комментировать
  • Как Настроить Прокси для Командной Строки в Linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    у меня в "~/.bashrc" прописано так:

    Это просто две функции, их кто-нибудь вызывает? После перезагрузки ~/.bashrc echo $http_proxy пишет что надо?
    Ответ написан
    9 комментариев
  • Каким инструментом можно просмотреть уже готовый diff-файл?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    В mc можно заходить в .diff как в каталог с патчами
    Ответ написан
  • Как вводится двоичное число в консоль в TASM Ассемблер?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Прочитать строку из стандартного ввода функцией 3fh, поместить в результат 0, а дальше идя по прочитанной строке слева направо сдвигать результат влево на 1 бит, а в младший бит класть 0 или 1, в зависимости от текущего символа в строке.
    Ответ написан
    Комментировать
  • Почему Diff не работает?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Если записи можно отсортировать попробуйте comm:

    comm -2 -3 <(sort a.txt) <(sort b.txt)

    Есть файл a.txt в нем 10 миллионов записей
    Есть файл b.txt в нем 100 миллионов записей
    Каждая запись с новой строки.

    Задача a.txt минус b.txt
    ...
    должно было получиться 90 миллионов записей.

    У вас или количество строк в файлах перепутано, или b.txt - a.txt. В существующей постановке не может получиться больше 10 млн. записей в результате.
    Ответ написан
    Комментировать
  • Почему при вызове функции 4ch прерывания 21h резидентный обработчик падает?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    mov dx, (start - new_int09h +0fh)/16

    А почему такой размер резервируемой памяти? Это exe или com?
    У вас есть функции, вызываемые из резидентной части, лежащие после start:
    write_data портит ds.
    Ответ написан
    3 комментария
  • Не работает деление в ассемблере. Что я сделал не так?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    mov edx, [arr16] ; заносим в edx первый элемент массива
    mov eax, [arr16+4] ; заносим в eax второй элемент массива

    Начнём с того, что в edx нужно поместить старшую часть делимого, а в eax -- младшую, а на x86 слова в память записываются младшей частью вперёд (little endian).

    Если результат деления не помещается в eax вы получите исключение #DE, а при делении числа 0x0000000100000000 (а именно его вы делите, загрузив в eax 0 а в edx 1) на 1 результат определённо в 32 бита не влезет.

    Вообще, глядя на ваши вопросы создаётся впечатление, что вы хотите реализовать на ассемблере длинную арифметику. Но длинное деление таким образом, как вы пытаетесь сделать, точно не работает. Вам надо либо побитово делить "в столбик", либо аппроксимировать каким-то рядом (либо ещё как-то, как мне не пришло в голову).
    Ответ написан
    1 комментарий
  • Почему такой странный вывод?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    А вы можете объяснить, что у вас происходит здесь:
    srav:
        repe cmps s1,s2
        mov bx,0
        dec di
        mov s3[bx],di
        inc di
        inc bx
        loop srav


    Кроме того, для вывода строки функцией 9 int21 она должна заканчиваться символом '$'.
    Ответ написан
  • Как скомпилировать gcc (Ubuntu Toolchain) с другим --prefix?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Последний шаг выполнить так (проверил в дебиане):

    PF=opt/dev-tools-4.9 dpkg-buildpackage -rfakeroot -b
    Ответ написан
    2 комментария
  • Как с помощью консольной команды удалить старые файлы?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Примерно так (для файлов):
    find -type f -atime +30 -delete

    Чтобы это работало файловая система должна поддерживать atime.
    Ответ написан
    Комментировать
  • Почему сопроцессор в тысячу раз медленнее процессора?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Кто подскажет, что я делаю не так?


    Это:
    clock_t strt = clock();
    ...
    clock_t bk1 = clock() - strt;
    ...
    clock_t bk2 = clock() - bk1;

    bk1 -- это разность абсолютных времён, т.е. продолжительность, а bk2 -- это разность абсолютного времени и продолжительности, т.е. абсолютное время.

    Ок, после исправления этого бага я вижу проблему с переполнением стека сопроцессора: fadd не сдвигает стек обратно и fld его очень быстро переполняет.

    С переполнением стека я тоже наблюдаю, что fpu работает ~ в 1000 раз медленнее чем ALU. Но если сбалансировать загрузки, операции и выгрузки так, чтобы стек не переполнялся у меня все работает со сравнимой скоростью. Подозреваю, что там случается исключение, но оно не фатальное и молча глотается ядром.

    Я тестировал следующий код (выкинул вообще всё лишнее):
    #include <stdio.h>
    #include <inttypes.h>
    #include <time.h>
    
    #define MAX_I 4000000
    
    int32_t rezult[64];
    
    void StartPR(int str)
    {
            asm volatile ("mov $4000000, %%eax\n\t"
                          "xor %%ebx, %%ebx\n\t"
                          "xor %%ecx, %%ecx\n\t"
                          "xor %%edx, %%edx\n"
    
                          "circle:\n\t"
                          "add %%eax, %%ebx\n\t"
                          "add %%eax, %%ecx\n\t"
                          "add %%eax, %%edx\n\t"
                          "dec %%eax\n\t"
                          "jnz circle\n\t" ::: "memory");
    }
    
    void StartMMX(int str)
    {
            double v = 4000000;
            asm volatile ("mov $4000000, %%eax\n\t"
                          "fldz\n\t"
    
                          "circle2:\n\t"
                          "fld %0\n\t"
                          "faddp \n\t"
                          "fld %0\n\t"
                          "faddp \n\t"
                          "fld %0\n\t"
                          "faddp \n\t"
                          "fld %0\n\t"
                          "faddp \n\t"
                          "sub $4, %%eax\n\t"
                          "jnz circle2\n\t"
                          "fstp %0" :"+m"(v):: "memory");
    }
    
    void stardThreads(int numOfThread)
    {
            printf("threads: %i", numOfThread);
            int i = 0;
            clock_t strt = clock();
            StartPR(0);
    
            clock_t strt2 = clock();
            clock_t bk1 = strt2 - strt;
    
            StartMMX(i);
            clock_t bk2 = clock() - strt2;
            printf("time block1:%i, block2:%i, tics per second:%i\n", (int32_t)bk1, (int32_t)bk2, CLOCKS_PER_SEC);
    }
    
    int main(int argc, char *argv[])
    {
            int i;
            for (i = 1; i < 9; i++)
                    stardThreads(i);
    
            return 0;
    }


    Результат:
    threads: 1time block1:6949, block2:9311, tics per second:1000000
    threads: 2time block1:4061, block2:7872, tics per second:1000000
    threads: 3time block1:3901, block2:7398, tics per second:1000000
    threads: 4time block1:3615, block2:7045, tics per second:1000000
    threads: 5time block1:3389, block2:6716, tics per second:1000000
    threads: 6time block1:3250, block2:6342, tics per second:1000000
    threads: 7time block1:3189, block2:6036, tics per second:1000000
    threads: 8time block1:3032, block2:5885, tics per second:1000000
    Ответ написан
    4 комментария
  • Как правильно словить core dump?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    1) будет ли это - ulimit -c unlimited активно для следующей сессии, и будет ли вообще работать ?

    Нет. Чтобы настроить ulimit по умолчанию -- см. man limits.conf

    2) где мне потом искать этот core. файл

    Зависит от /proc/sys/kernel/core_pattern, для вашего примера -- в текущем каталоге упавшего процесса. Вообще core_pattern -- это просто путь до файла с возможностью подстановки некоторых параметров процесса через %*.
    См. man core.
    Ответ написан
    Комментировать
  • Как вывести формулу из дизассемблерного кода?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Как вывести формулу из дизассемблерного кода

    Выписав выражения элементарных математических действий соответствующих ассемблерным командам и подставив выражения друг в друга, согласно тому, как использованы регистры и переменные в памяти.
    Например:
    mov 0x10(%ebp),%edx
    -- это "поместить в edx третий параметр функции (назовём их a (0x8(%ebp)), b (0xc(%ebp)) и c (0x10(%ebp))): edx = c"

    mov %edx,%eax
    -- "поместить в eax edx, который равен c, т.е. eax = c"

    shl $0x2,%eax
    -- сдвинуть eax на 2 влево, т.е. умножить на 4, т.е. eax = c * 4

    и т. д.

    Результат -- то что останется в eax перед возвратом.
    Ответ написан
    Комментировать
  • Скрипт (или программа) для сравнения данных в двух каталогах?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Бескостыльный метод сравнить содержимое двух каталогов -- выполнить
    find -type f -print0 | xargs -0 sha1sum | sort > result
    в этих каталогах, а потом сравнить файлы result, например командой diff.
    Ответ написан
    Комментировать
  • Системные вызовы в Linux?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Вы уверены, что понимаете, что такое "системный вызов", и чем он отличается от вызова функции system?
    Ответ написан
    6 комментариев
  • Чем ASEM51 отличается от A51?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    чем кросс-ассемблер отличается от макроассемблера?

    Макроассемблер -- это ассемблер поддерживающий макросы.
    Кросс-ассемблер -- это ассемблер, генерирующий код для процессора, архитектура которого отлична от той, на которой он сам выполняется.
    Макроассемблер может быть кросс-ассемблером.
    Ответ написан
    Комментировать
  • Странно работает rand(). В чем проблема?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    С помощью неё я формирую массив,

    Т.е. вызываешь её в цикле, т.е. вызываешь srand(static_cast(time(0))); много раз за короткое время. Продолжать?
    Вопрос: зачем ты это делаешь внутри этой функции?
    Ответ написан
    Комментировать