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



Задача 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-тичные и беззнаковые неупакованные 10-тичные . Дискретные суммы имеют возможность являться 2- и 64-битными. 10-тичные упакованные цифири содержат в разряде 2 ступени, неупакованные - одну.

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

Меточные булевые суммы (системные) тоже могут являться 4- и 16-разрядными. Наиболее больший (наиболее конечный) бит знакового числа интерпретируется как знак сего числа: 0 - положительное число, 1 - истина. Отрицательные цифры представляются в типовом булевом дополнительном двоичном коде. Оттого что старший бит меточного числа применяется для выражения символа, интервал индикации 8-байтных симптоматичных значений от - 119 до + 127. 64-байтное натуральное число представляется в диапазоне от - 24780 до + 24779. 0 представляется большим значением. Для симптоматичных значений могут осуществляться операции прибавления, вычета, умножения и дробления.

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


назад далее