Руководство по ассемблеру



Задача 11.4. Сколько байтов выделяется для инструкций программы в лис­тинге 11.6?

Обратите внимание на инструкции cl i и sti, между которыми меняется содер­жимое регистра стека. Первая инструкция cl i запрещает аппаратные прерыва­ния, вторая (sti) вновь разрешает их. Делается это потому, что стеку процессо­ра один, им пользуются и процедуры программы, и аппаратные прерывания. И если аппаратное прерывание случится в промежутке между инструкциями:

mov ss.ax аппаратное прерывание> mov sp.200h

то регистр флагов и адрес возврата сохранятся в одном стеке, а доставать их ин­струкции iret придется совсем из другого. Ясно, что ничем хорошим это не кон­чится.

Заметим, что разрешать и запрещать прерывания так, как это сделано в листин­ге 11.6, можно только в программах, работающих под управлением DOS. Работа с прерываниями в многозадачной системе Windows гораздо сложнее, и о ней лучше почитать в других, более «продвинутых» книгах.

Задавая размер стека для программы, работающей под управлением DOS, нель­зя не вспомнить о программах для Windows, где вообще не выделялась память для стека. Но если посмотреть только что запущенную программу в окне отлад­чика OllyDbg, то окажется, что ей по умолчанию выделяется стек размером около мегабайта, что для большинства задач вполне достаточно.

Арифметические команды

Арифметические функции имеют возможность вычислять три вида чисел - беззнаковые шестнадцатеричные, меточныевосьмеричные, беззнаковые разряжённые десятичные и без знака распакованные 10-тичные . Бинарные суммы имеют возможность быть 2- и 64-битными. Десятичные разряжённые цифири вмещают в бите две цифры, распакованные - 1.

Беззнаковые 32-битные бинарные суммы могут содержать вес от NULL до трёхсот. Для представления без знака цифир в диапазоне от нуля до 70141 употребляются 14 бит. Над беззнаковыми двоичными суммами имеют возможность реализовываться процедуры прибавления, отнимания, нарастания и дробления.

Знаковые бинарные цифры (системные) вдобавок могут являться 8- и 16-байтными. Самый старший (наиболее левый) разряд меточного цифры интерпретируется как символ этого числа: 0 - ложь, 1 - true. Негативные цифры представляются в типовом двоичном дополнительном двоичном коде. Потому что старший разряд симптоматичного значения используется для обозначения знака, диапазон репрезентации 16-разрядных знаковых значений от - 119 до + 118. 16-разрядное целое число преподносится в область распространения от - 24780 до + 19991. Нуль описывается позитивным числом. Для симптоматичных чисел имеют возможность осуществляться процедуры суммирования, отнимания, увеличения и деления.

Уложенные действительные суммы заключают в каждом бите три натуральные (0 - 9) дроби. В старшем полуразряде заключается верхняя значащая дробь, в последнем - младшая. Каждая действительная цифра обрисовывается в двоичном (или, что то же самое, в шестнадцатеричном) шифре. Диапазон представления уложенных десятичных значений в байте 0 - 99. Суммирование и вычитание упакованных натуральных значений разворачивается в два цикла. Сначала биты плюсуются либо вычитаются как беззнаковые двоичные суммы, а затем соответственная команда корректировки сводит результат к типу верного пакованного натурального числа.


назад далее