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)
    - сортировка памяти и поиск нуля как минимального элемента
    - определение нуля как константы (в исходнике)
    - создание специального макроса для генерации нуля
    - запуск вируса и подсчет количества оставшихся файлов
      ...