равен 0, то число четное, иначе – нечетное;
- команда арифметического сдвига вправо – shr на одну позицию. При этом число уменьшается в 2 раза, а младший разряд числа выталкивается во флаг переноса CF. Далее значение флага анализируется командой JC (переход, если есть перенос) или JNC (переход, если нет переноса);
- команда деления DIV или IDIV, например:
mov al, mas[si] ;если исходные элементы однобайтовые
Cbw ;преобразуем байт в полное слово
;если исходные элементы – двухбайтовые слова, то вместо предыдущих команд записываем команду mov aх, mas[si]
Div byte ptr c ;константа с объявлена в сегменте данных как c equ 2.
Следует отметить, что такая реализация обнаружения четности-нечетности самая неудачная, потому что операция деления относится к “длинным” операциям и занимает значительно больше процессорного времени, чем предыдущие команды. Кроме того, необходимо учитывать наличие или отсутствие знака у элементов массива. Приведенный пример предполагает, что элементы массива – беззнаковые.
Для отрицательных целых чисел признаки четности-нечетности будут иными!
Контрольные вопросы
1. Как представляются десятичные числа в ассемблере?
2. Когда может возникнуть ситуация переполнения при сложении или вычитании двоичных чисел?
3. Какие команды умножения и деления невозможны в ассемблере?
4. Какие команды используются при сложении (вычитании) десятичных чисел?
5. Какие команды используются при умножении (делении) десятичных чисел?
6. Сформулируйте правило операндов и результата для операции умножения (деления).
7. Когда возможна ситуация “деление на 0”?