Вопрос по работе инструкции test

Тема в разделе "WASM.BEGINNERS", создана пользователем dM4x, 15 сен 2006.

  1. dM4x

    dM4x New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2006
    Сообщения:
    4
    .....
    stosd ; записать символ и пробел в таблицу ctable
    inc al ; AL содержит следующий символ
    test cx,0Fh ; если СХ не кратен 16,
    jnz continue_loop ; продолжить цикл,

    push cx ; иначе: сохранить значение счетчика
    mov cx,80-32 ; число оставшихся до конца строки символов
    xchg ax,bx
    ........

    Я учусь по учебнику Зубкова. У него в комментариях написано, что test проверяет кратность 16. Но у него же в описании инструции объясняется что инструкция test вычитает из регистра СХ операнд 0FH, никуда не сохраняя результат.
    Следующая инструкция jnz проверяет на равенство нулю (если не равно то перейти к метке continue_loop). Так где же именно проверка кратности 16? Возможно я чегото не понимаю? Помогите! Если будет нужно приведу полный код программы.
     
  2. dM4x

    dM4x New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2006
    Сообщения:
    4
    Я в курсе что 0Fh это и есть 16
     
  3. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Не в курсе=)) 0F это 15.

    Тут хитрость в чем если число кратно числу 2^n то у него n младших бит нулевые. Следовательно для проверки
    кратно ли число 2^n его надо проandить с числом, которое в двоичном представление выглядит как последовательность
    из n единиц, таким числом являеться 2^n - 1(В твоем случае это 15), и если в результате получился ноль то число кратно
    2^n.
     
  4. dM4x

    dM4x New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2006
    Сообщения:
    4
    точно, это я ступил
    спасибо, все понял
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    dM4x
    Это тоже ты "ступил" или Зубков ?
    Инструкция test делает побитовый AND, результат не сохраняет, а только выставляет флаги ZF, SF и PF. Используется для проверки на 0, знак и установки битов по маске - как в данном случае, если (CX and 0Fh) = 0 значит 4 младших бита CX равны нулю -> число кратно 16-ти
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    dM4x
    x and (n - 1) равносильно операции x % n, если n является степенью 2. Таким образом,
    cx and 15 == cx % 16

    Если остаток равен нулю, то число кратно операнду, т.е. кратно 16.
     
  7. dM4x

    dM4x New Member

    Публикаций:
    0
    Регистрация:
    15 сен 2006
    Сообщения:
    4
    Точно, я. :)) Наверно не стоит все же в три часа ночи пытаться в чем то разобраться? :)))
    Всем спасибо что помогли.