                             21 СПОСОБ ОБНУЛИТЬ РЕГИСТР
                             ~~~~~~~~~~~~~~~~~~~~~~~~~~

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

    1. Обнуление MOV-ом

       mov r, 0

    2. Заменяем MOV на эквивалентные ему PUSH и POP

       push <something-equal-to-0>
       pop  r

    3. Самый хакерский способ: вычитаем регистр сам из себя.

       sub r, r

    4. Ксорим (тоже неплохой способ... но... как-то не то...)
       Попутно (c) на название картины: "арвихакер, ксорящий ворды в уме"

       xor r, r

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

       and r, 0

    6. Более хитро: умножим на 0.

       imul r, 0

    7. Сдвиг (не путать со спрыгом).
       X1+X2 в сумме больше/равно размера регистра в битах,
       по отдельности меньше. Меньше потому, что берется по модулю.

       shr/shl/sal r, X1    ; X1<=31, X2<=31, X1+X2>=32
       shr/shl/sal r, X2    ;

    8. Более извратный сдвиг.

       clc
       rcr/rcl, X1
       clc
       rcr/rcl, X2

    9. Не совсем честный способ, но...

       or reg, -1
       inc/not reg

    10. Обнулим (E)CX. (хотя так можно и охуеть)

        loop $

    11. Обнулим EDX.

        shr eax,1
        cdq

    11. Обнулим AL. (AH=AL,AL=0)

        aam 1

    12. Обнулим AH

        aad 0

    13. Опять AL

        clc
        setalc    ; opcode: 0xD6

    14. Более хитро: прочитаем 0 из порта (например порт 81h)

        mov dx, <some-port-number>
        in  al, dx

    15. Опять AL

        stc
        setnc al

    16. А тут кто-нибудь в доку полезет. 5 раз bsf либо bsr.

        bsf r, r
        bsf r, r
        bsf r, r
        bsf r, r
        bsf r, r

    17. Воспользуемся нулевым дескриптором из GDT

        sgdt [esp-6]
        mov r, [esp-4]
        mov r, [r]

    18. Считаем ноль из сегмента FS (PE файл)

        mov r, fs:[10h] ; константа по вкусу, был бы ноль

    19. Цикл (повторюсь: здесь главное не охуеть)

        inc/dec r    ; это несколько долго
        jnz     $-1

    20. Вызовем какую-нить функцию с кривыми параметрами (вернется NULL в EAX)

        call    GetCurrentObject

    21. Используем сопроцессор

        fldz
        fistp   dword ptr [esp-4]
        mov     eax, [esp-4]

    22, 23, 24, ...

        Предлагаются также следующие варианты обнуления регистра:
        - сканирование цепочки обработчкиков SEH до победного нуля
        - сканирование цепочки хендлов файлов до нуля
          (для этого надо сначала положить в регистр хендл открытого файла
           нулевого кольца, а перед этим перейти в ноль и открыть этот файл)
        - считывание нуля из случайного файла
          (потребуется генератор случайных чисел)
        - вычисление синуса от Pi * n (умножать командой FMUL)
        - сортировка памяти и поиск нуля как минимального элемента
        - определение нуля как константы (в исходнике)
        - создание специального макроса для генерации нуля
        - запуск вируса и подсчет количества оставшихся файлов
          ...