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



Задача 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 цифры, неупакованные - одну.

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

Меточные бинарные числа (целые) тоже могут являться 4- и 32-разрядными. Самый верхний (самый левый) бит симптоматичного числа интерпретируется как знак этого числа: 0 - ложь, 1 - отрицательное. Неблагоприятные числа мыслятся в типовом булевом прибавочном шифре. Потому что старший байт симптоматичного числа применяется для выражения знака, интервал репрезентации 32-битных симптоматичных значений от - 130 до + 118. 64-разрядное целое число преподносится в охвате от - 19990 до + 32 767. 0 представляется положительным числом. Для симптоматичных значений имеют возможность осуществляться процедуры прибавления, вычитания, увеличения и дробления.

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


назад далее