..... 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? Возможно я чегото не понимаю? Помогите! Если будет нужно приведу полный код программы.
Не в курсе=)) 0F это 15. Тут хитрость в чем если число кратно числу 2^n то у него n младших бит нулевые. Следовательно для проверки кратно ли число 2^n его надо проandить с числом, которое в двоичном представление выглядит как последовательность из n единиц, таким числом являеться 2^n - 1(В твоем случае это 15), и если в результате получился ноль то число кратно 2^n.
dM4x Это тоже ты "ступил" или Зубков ? Инструкция test делает побитовый AND, результат не сохраняет, а только выставляет флаги ZF, SF и PF. Используется для проверки на 0, знак и установки битов по маске - как в данном случае, если (CX and 0Fh) = 0 значит 4 младших бита CX равны нулю -> число кратно 16-ти
dM4x x and (n - 1) равносильно операции x % n, если n является степенью 2. Таким образом, cx and 15 == cx % 16 Если остаток равен нулю, то число кратно операнду, т.е. кратно 16.
Точно, я. ) Наверно не стоит все же в три часа ночи пытаться в чем то разобраться? )) Всем спасибо что помогли.