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



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

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

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

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

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

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

Микропроцессорное программирование

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

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

Знаковые двоичные числа (натуральные) тоже могут являться 2- и 16-битными. Наиболее больший (наиболее конечный) разряд меточного числа интерпретируется как символ данного значения: 0 - false, 1 - истина. Негативные суммы мыслятся в шаблонном двоичном прибавочном двоичном коде. Так как старший байт меточного числа применяется для обозначения метки, диапазон репрезентации 32-битных знаковых чисел от - 128 до + 127. 16-разрядное системное число представляется в охвате от - 24780 до + 24779. NULL значится позитивным числом. Для симптоматичных чисел имеют возможность выполняться операции сложения, вычета, увеличения и разложения.

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


назад далее