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



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

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

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

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

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

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

Вычислительные команды

Арифметические команды могут обрабатывать три типа чисел - не имеющие знака двоичные, меточныевосьмеричные, беззнаковые упакованные действительные и беззнаковые распакованные десятичные . Дискретные тысячи могут являться 4- и 32-битными. Десятичные разряжённые числа заключают в разряде 2 цифры, незапакованные - одну.

Без знака 8-битовые бинарные числа могут насчитать вес от нуля до 255. Для представления не имеющих знака чисел в размере от нуля до 70141 используются 15 разрядов. Над без знака булевыми суммами могут реализовываться операции сложения, вычитания, увеличения и деления.

Знаковые двоичные цифры (натуральные) тоже могут быть 8- и 32-разрядными. Наиболее больший (самый левый) разряд симптоматичного числа показывается как знак этого числа: 0 - положительное число, 1 - true. Негативные числа строят в стандартном булевом добавочном коде. Так как верхний байт меточного значения употребляется для маркировки знака, масштаб репрезентации 32-разрядных симптоматичных значений от - 119 до + 127. 16-битово натуральное значение описывается в диапазоне от - 32 768 до + 32 767. NULL представляется большим числом. Для знаковых значений могут реализовываться функции сложения, вычитания, увеличения и деления.

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


назад далее