• Быстрый Sin и Cos на встроенном ASM для Delphi

    Всем привет!

    Возникла потребность написать быстрое вычисление Sin и Cos. За основу для вычислений взял разложение по ряду Тейлора. Использую в 3D-системах (OpenGL и графическая библиотека своей разработки). К сожалению свести ряд «идеально» для Double не получается, но это компенсируется хорошим ускорением. Код написан на встроенном в Delphi XE6 ассемблере. Используется SSE2.

    Для научных вычислений не подходит, а для использования в играх вполне.
    Точности хватает, чтобы покрыть разрядность числа Single, которое используется
    для умножения на матрицу.

    В итоге:

    1. Достигнутая точность результата равна: 10.e-13
    2. Максимальное расхождение с CPU — 0.000000000000045.
    3. Скорость увеличена в сравнении с CPU в 4.75 раза.
    4. Скорость увеличена в сравнении с Math.Sin и Math.Cos в 2.6 раза.

    Для теста использовал процессор Intel Core-i7 6950X Extreme 3.0 ГГц.
    Исходный текст на Delphi встроен в комментарии к ассемблеру.
    Читать дальше →
  • The Kernel-Bridge Framework: мостик в Ring0

    Хотели ли Вы когда-нибудь заглянуть под капот операционной системы, посмотреть на внутреннее устройство её механизмов, покрутить винтики и посмотреть на открывшиеся возможности? Возможно, даже хотели поработать напрямую с железом, но считали, что драйвера — rocketscience?

    Предлагаю вместе пройтись по мостику в ядро и посмотреть, насколько глубока кроличья нора.

    Итак, представляю драйвер-фреймворк для kernel-хакинга, написанный на C++17, и призванный, по возможности, снять барьеры между ядром и юзермодом или максимально сгладить их присутствие. А также, набор юзермодных и ядерных API и обёрток для быстрой и удобной разработки в Ring0 как для новичков, так и для продвинутых программистов.

    Основные возможности:

    • Доступ к портам ввода-вывода, а также проброс инструкций in, out, cli и sti в юзермод через IOPL
    • Обёртки над системной пищалкой
    • Доступ к MSR (Model-Specific Registers)
    • Набор функций для доступа к юзермодной памяти других процессов и к памяти ядра
    • Работа с физической памятью, DMI/SMBIOS
    • Создание юзермодных и ядерных потоков, доставка APC
    • Юзермодные Ob*** и Ps***-каллбэки и фильтры файловой системы
    • Загрузка неподписанных драйверов и ядерных библиотек

    … и многое другое.
    Читать дальше →
    • +29
    • 3,6k
    • 8
  • Low-level Brainfuck

    • Tutorial
    Building a Brainfuck translator in TurboAssembler.

    To begin with, let's build the interpreter in a high-level language, for example, in Pascal.

    First of all, write a program that will output a character using the sum of + as own ascii-code.

    So, we only need the bf-commands + and .

        var
         data_mem: array[1..10] of integer;    // data array
         command_mem: string;                 // command array
         i: integer;                         // index of command array
         j: integer;                        // index of data array
        begin
         j:=1;                  
         readln(command_mem);       
         
         for i:=1 to length(command_mem) do begin   // in the cycle we process the string 
          if (command_mem[i]='+') then data_mem[j]:= data_mem[j]+1;
          if (command_mem[i]='.') then write(chr(data_mem[j]));
         end;
        end.
    

    bf-code +++++++++++++++++++++++++++++++++. will issue !
    (the ascii-code of the symbol ! is 33).

    You may ensure that the program is correct via the link.
    Читать дальше →
    • +18
    • 3,7k
    • 6
  • Загрузка ядра Linux. Часть 1

    • Перевод
    От загрузчика к ядру

    Если вы читали предыдущие статьи, то знаете о моём новом увлечении низкоуровневым программированием. Я написал несколько статей о программировании на ассемблере для x86_64 Linux и в то же время начал погружаться в исходный код ядра Linux.

    Мне очень интересно разобраться, как работают низкоуровневые штуки: как программы запускаются на моём компьютере, как они расположены в памяти, как ядро управляет процессами и памятью, как работает сетевой стек на низком уровне и многое другое. Итак, я решил написать еще одну серию статей о ядре Linux для архитектуры x86_64.

    Обратите внимание, что я не профессиональный разработчик ядра и не пишу код ядра на работе. Это всего лишь хобби. Мне просто нравятся низкоуровневые вещи и интересно в них копаться. Поэтому если заметите какую-то путаницу или появилятся вопросы/замечания, свяжитесь со мной в твиттере, по почте или просто создайте тикет. Буду благодарен.
    Читать дальше →
  • Что происходит за кулисами С#: основы работы со стеком

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

      Дисклеймер


      Прежде, чем приступить к повествованию, настоятельно рекомендую ознакомиться с первым постом про StructLayout, т.к. там разобран пример, который будет использоваться в этой статье.

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

      Также хотелось бы предупредить, что данная статья не содержит материал, который стоит применять в реальных проектах.

      Начинаем с теории


      Любой код в конечном итоге становится набором машинных комманд. Наиболее понятно их представление в виде инструкций языка Ассемблера, прямо соответсвующих одной (или нескольким) машинным инструкциям.

      Читать дальше →
      • +22
      • 7,6k
      • 9
    • CPU Design: Эзотерический язык LMCode

      • Tutorial

      Часть I
      Часть II
      Часть III
      Часть IV

      Четвёртая часть цикла посвящена созданию интерпретатора некого эзотерического языка LMCode, в основе которого лежит архитектура Little Man Computer. О Little Man Computer можно прочитать в предыдущих статьях.

      • Пусть команде INP соответствует ,
      • команде OUT соответствует .
      • команде ADD соответствует +
      • команде SUB соответствует
      • команде STA соответствует ~
      • команде LDA соответствует ^

      Напишем программу, которая загружает число из устройства ввода в аккумулятор, сохраняет число в памяти, прибавляет число из памяти к аккумулятору (удваивает число), и выводит удвоенное число в устройство вывода.

      На ассемблере LMC эта программа будет выглядеть так (начальной ячейкой пусть будет 20)

       INP
       STA 20
       ADD 20 
       OUT
      

      Читать дальше →
      • +14
      • 3,6k
      • 4
    • Бэкдоры в микрокоде ассемблерных инструкций процессоров x86

        Софту мы не доверяем уже давно, и поэтому осуществляем его аудит, проводим обратную инженерию, прогоняем в пошаговом режиме, запускаем в песочнице. Что же насчёт процессора, на котором выполняется наш софт? – Мы слепо и беззаветно доверяем этому маленькому кусочку кремния. Однако современное железо имеет те же самые проблемы, что и софт: секретную недокументированную функциональность, ошибки, уязвимости, малварь, трояны, руткиты, бэкдоры.



        ISA (Instruction Set Architecture) x86 – одна из самых долгих непрерывно изменяющихся «архитектур набора команд» в истории. Начиная с дизайна 8086, разработанного в 1976 году, ISA претерпевает постоянные изменения и обновления; сохраняя при этом обратную совместимость и поддержку исходной спецификации. За 40 лет своего взросления, архитектура ISA обросла и продолжает обрастать множеством новых режимов и наборов инструкций, каждый из которых добавляет к предшествующему дизайну, и без того перегруженному, новый слой. Из-за политики полной обратной совместимости, в современных процессорах x86 присутствуют даже те инструкции и режимы, которые на сегодняшний день уже преданы полному забвению. В результате мы имеем архитектуру процессора, которая представляет собой сложно переплетающийся лабиринт новых и антикварных технологий. Такая чрезвычайно сложная среда – порождает множество проблем с кибербезопасностью процессора. Поэтому процессоры x86 не могут претендовать на роль доверенного корня критической киберинфраструктуры.

        Читать дальше →
      • Нужно ли учить C для понимания работы компьютера?

        • Перевод
        Я часто слышал, что для понимания работы компьютера люди предлагают изучать C. Это хорошая мысль? Вы уверены? Сразу изложу выводы статьи, просто для абсолютной ясности:

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

        Я планирую написать ещё две статьи с более подробным объяснением выводов, но этого уже достаточно. Добавлю сюда ссылки, когда статьи выйдут.
        Читать дальше →
      • Два Z80 на одну машину: чем отличались 8-битные аркадные автоматы от домашних компьютеров?

        • Перевод

        Что я узнал об аркадном автомате Bomb Jack в процессе создания его эмулятора




        Недавно я написал небольшой эмулятор автомата Bomb Jack, в основном для того, чтобы разобраться, чем эти первые 8-битные аркадные автоматы отличались по конструкции от 8-битных домашних компьютеров.

        Как я узнал намного позже, встреча на летней ярмарке в моём родном городе с аркадными автоматами наподобие Bomb Jack стала одним из тех моментов, которые переменили мою судьбу. Обычным летним днём, потратив весь свой запас монет на аркадные автоматы, я возвращался домой, и голова моя была заполнена цветами и звуковыми эффектами. Я пытался понять, как работали эти игры. А затем до конца года я тратил всё своё время после школы на создание довольно блеклых копий этих аркадных игр на домашнем компьютере. Я походил на поклонника карго-культа с островов Тихого океана, желавшего создать американскую военную радиостанцию из палок.

        Сначала я думал над идеей создания эмулятора Pengo, потому что мой подростковый мозг эта игра впечатлила гораздо сильнее, чем Bomb Jack (кстати, вот моя карго-культовая версия Pengo). Но аркадное оборудование Pengo потребовало бы создания эмуляторов новых чипов для звука и видео, а для Bomb Jack оказалось достаточно уже имевшихся у меня частей (Z80 в качестве ЦП и AY-3-8910 для звука), поэтому первым я взялся за Bomb Jack.
        Читать дальше →
      • Низкоуровневый Brainfuck. Продолжение…

        • Tutorial
        Часть I
        Часть II
        Часть III

        Пишем brainfuck на TurboAssembler'e.

        Добавим вывод массива data_arr («ленту» машины Тьюринга) на экран.

        Напишем программу, выводящую на экран элементы произвольного массива посредством функции 09h прерывания 21h

        .model tiny                 ; ascii-decoder.asm
        jumps
        .data
         data_arr DB 1,0,2,0,3,0,4,0,5,0,6,0,7,'$' ; данные
        
        .code
        ORG    100h
        start:
        ;Подготовим все необходимое
          mov AX, @data          ; настраиваем сегмент данных                                       
          mov DS,AX
        ;;;;;;;;;;;;;;;;
         MOV    AH,2              ; переходим на новую строку
         MOV    DL,0Ah     
         INT    21h 
        mov dx,offset data_arr     ; указатель на массив символов
        mov ah,09h		            ; вывести строку
        int 21h        
        ;;;;;;;;;;
         MOV    AH,2       ; переходим на новую строку
         MOV    DL,0Ah     
         INT    21h        
          
         mov AX, 4c00h      ; завершение программы  
         int 21h 
        end start
        

        На экране мы увидим ascii-коды элементов массива data_arr DB 1,0,2,0,3,0,4,0,5,0,6,0,7,'$'


        Читать дальше →

      Самое читаемое