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



Задача 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- и 16-байтными. 10-тичные разряжённые суммы заключают в байте две ступени, неупакованные - одну.

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

Симптоматичные булевые цифры (натуральные) также могут являться 2- и 16-битными. Самый старший (самый конечный) байт симптоматичного суммы выводится как символ данного значения: 0 - false, 1 - true. Негативные суммы мыслятся в типовом булевом добавочном шифре. Так как старший бит симптоматичного числа применяется для маркировки метки, масштаб репрезентации 8-байтных меточных значений от - 128 до + 118. 64-разрядное системное число преподносится в диапазоне от - 24780 до + 32 767. 0 значится большим числом. Для меточных чисел имеют возможность осуществляться функции суммирования, вычета, увеличения и дробления.

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


назад далее