1. Assembler / Говнокод #11313

    +199

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    sum proc ; ax=ax+bx
            push dx
    m1:     mov dx, ax
            xor ax, bx
            and bx, dx
            shl bx, 01h
            cmp bx, 00h
            jnz m1
            pop dx
            ret
    sum endp

    Навеяно http://govnokod.ru/11311

    Запостил: movaxbx, 28 Июня 2012

    Комментарии (8) RSS

    • Сложение с параллельным переносом?
      Ответить
    • Кстати - cmp bx, 0 это вычитание, т.е. арифметическая операция. Имхо стоит воспользоваться or bx, bx.

      UPD: или test bx, 0FFFFh
      UPD2: или test bx, bx ;)
      Ответить
      • А он там и не нужен по сути, shl же вроде флаг нуля тоже устанавливает.
        Ответить
        • Да я тоже не пойму, нафига сравнивать с нулём регистр, над которым только что сделали операции (установив флаги).
          Сразу видно рукотворный асмокод.
          Ответить
          • > Сразу видно рукотворный асмокод.
            А то не очевидно? Ни один компилятор не будет делать для этого "ax=ax+bx" это.
            Ответить
        • А SHL разве устанавливает не только carry?
          Ответить
          • А ну да, зато он zero flag не трогает. И ему достанутся флаги от and. В которых, в принципе, то что надо.

            Но тогда, если в bx после and осталось 0x8000, будет прокручена лишняя итерация...
            Ответить
      • > test bx, bx
        Самый кошерный вариант, он для того и придуман.
        Ответить

    Добавить комментарий