Пример: Глобальная сеть INTERNET
Я ищу:
На главную  |  Добавить в избранное  

Главная/

Программирование, базы данных. /

Язык макроассемблера IBM PC

←предыдущая следующая→
1 2 3 4 5 6 7 8 9 10 11 ... 

parity flag) - флаг четности.  Равен 1, если результат очеред­ной команды  содержит  четное количество двоичных единиц.  Учитывается обычно только при операциях ввода-вывода.

    AF (auxiliary carry flag) - флаг дополнительного переноса.  Фикси­рует особенности выполнения операций над двоично-десятичными числами.

Флаги состояний:

    DF (direction flag)  - флаг направления. Устанавливает направление просмотра строк в строковых командах:  при DF=0 строки просматриваются "вперед" (от начала к концу), при DF=1 -  в обратном направлении.

    IF (interrupt flag) - флаг прерываний. При IF=0 процессор переста­ет реагировать на поступающие к нему прерывания,  при IF=1  блокировка прерываний снимается.

    TF (trap flag) - флаг трассировки.  При TF=1 после выполнения каж­дой команды процессор делает прерывание (с номером 1),  чем можно вос­пользоваться при отладке программы для ее трассировки.

1.2. ПРЕДСТАВЛЕНИЕ ДАННЫХ. АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ

    Здесь  рассматривается машинное представление целых чисел, строк и адресов.  Представление двоично-десятичных чисел,  используемых доста­точно редко, не рассматривается. Что касается вещественных чисел, то в ПК нет команд вещественной арифметики (операции над этими числами реа­лизуются программным путем или выполняются сопроцессором) и потому нет стандартного представления вещественных чисел.  Кроме того, рассматри­ваются некоторые особенности выполнения арифметических операций.

Шестнадцатиричные числа записываются с буквой h на конце, двоичные

числа - с буквой b (так принято в MASM).

         1.2.1 Представление целых чисел.

    В общем случае  под целое число  можно отвести любое число байтов, однако  система команд ПК  поддерживает только числа размером в байт и слово и частично поддерживает  числа размером в двойное слово.  Именно эти форматы и будут рассмотрены.

    В ПК  делается различие между целыми числами без знака  (неотрица­тельными) и со знаком. Это объясняется тем, что в ячейках одного и то­го же размера можно представить  больший диапазон  беззнаковых  чисел, чем неотрицательных знаковых чисел, и если известно заранее, что неко­торая числовая величина является неотрицательной, то выгоднее рассмат­ривать ее как беззнаковую, чем как знаковую.

         Целые числа без знака.

    Эти числа могут быть представлены в виде байта, слова или двойного слова - в зависимости от их размера. В виде байта представляются целые от 0 до 255 (=2^8-1),  в виде слова - целые от 0 до 65535 (=2^16-1), в виде двойного слова - целые от 0 до 4 294 967 295 (=2^32-1). Числа за­писываются в двоичной системе счисления,  занимая  все разряды ячейки. Например, число 130 записывается в виде байта 10000010b (82h).

    Числа  размером в слово  хранятся в памяти  в "перевернутом" виде: младщие (правые) 8 битов числа  размещаются  в первом байте  слова,  а старшие 8 битов  -  во втором байте  (в 16-ричной системе:  две правые цифры  - в первом байте, две левые цифры - во втором байте). Например, число 130 (=0082h) в виде слова хранится в памяти так:

                 -----------

                 | 82 | 00 |


                 -----------

(Отметим, однако, что в регистрах числа хранятся в нормальном виде: -----------

             AX  | 00 | 82 |


                 -----------

                   AH   AL     )

    "Перевернутое" представление  используется и при хранении в памяти целых чисел размером в двойное слово:  в первом его байте  размещаются младшие 8 битов числа, во втором байте - предыдущие 8 битов и т.д. На­пример, число 12345678h хранится в памяти так:

              ---------------------


| 78 | 56 | 34 | 12 | ---------------------

Другими словами,  в первом слове  двойного слова  размещаются  младшие (правые) 16 битов числа, а во втором слове - старшие 16 битов,  причем в каждом из этих двух слов  в свою очередь используется "перевернутое" представление.

    Такое необычное представление чисел объясняется тем,  что в первых моделях ПК  за раз можно было считать из памяти только один байт и что все арифметические операции  над  многозначными числами  начинаются  с действий над младшими цифрами, поэтому из памяти в первую очередь надо считывать младшие цифры, если сразу нельзя считать все цифры. Учитывая это,  в первых ПК и стали размещать младшие цифры числа перед старшими цифрамми, а ради преемственности такое представление чисел сохранили в последующих моделях ПК.

    Конечно,  "перевернутое" представление неудобно для людей,  однако при использовании  языка ассемблера  это неудобство не чувствуется:  в MASM все числа записываются в нормальном, неперевернутом виде (см. ни­же).

         Целые числа со знаком.

    Эти числа также представляются в виде байта, слова и двойного сло­ва.  В виде байта  записываются числа от -128 до 127,  в виде слова  ­числа  от  -32768  до  32767,  а  в виде  двойного слова  -  числа  от -2147483648 до 2147483647.  При этом числа записываются в дополнитель­ном коде: неотрицательное число записывается так же, как и беззнаковое число (т.е. в прямом коде), а отрицательное число -x (x>0) представля­ется беззнаковым числом 2^8-x (для  байтов),  2^16-x  (для  слов)  или 2^32-x (для двойных слов). Например, дополнительным кодом числа -6 яв­ляется байт FAh (=256-6), слово FFFAh или двойное слово FFFFFFFAh. При этом  байт  10000000b (=80h) трактуется как -128, а не как +128 (слово 8000h понимается как -32678),  поэтому левый бит  дополнительного кода всегда  играет роль  знакового:  для неотрицательных чисел он равен 0, для отрицательных - 1.

    Знаковые числа размером в слово и двойное слово записываются в па­мяти в "перевернутом" виде (при этом  знаковый бит  оказывается в пос­леднем байте ячейки).  Но в MASM эти числа, как и беззнаковые, записы­ваются в нормальной форме.

    Иногда число-байт необходимо расширить до слова,  т.е. нужно полу­чить такое же по величине число,  но размером в слово.  Существует два способа такого расширения - без знака и со знаком.  В любом случае ис­ходное число-байт попадает во второй (до "переворачивания")  байт сло­ва, а вот первый байт заполняется по-разному: при расширении без знака в него записываются нулевые биты  (12h -> 0012h),  а при расширении со знаком в первый байт записываются нули, если число-байт было неотрица­тельным, и записывается восемь двоичных единиц в противном случае (81h ->  FF81h).  Другими словами,  при расширении со знаком в первом байте слова копируется знаковый разряд числа-байта.

Аналогично происходит расширение числа-слова до двойного слова.

1.2.2 Особенности выполнения арифметических опреаций

    В ПК  имеются команды сложения и вычитания целых чисел  размером в слово и байт. Специальных команд для сложения и вычитания двойных слов нет, эти операции реализуются через команды сложения и вычитания слов.

Сложение и вычитание беззнаковаых чисел производится по модулю 2^8

для байтов и 2^16 для слов. Это означает, что если в результате сложе­ния появилась единица переноса,  не вмещающаяся в разрядную сетку,  то она отбрасывается.  Например, при сложении байтов 128 и 130 получается число 258 = 100000010b, поэтому левая двоичная единица отбрасывается и остается число 2 = 10b,  которое  и  объявляется результатом сложения. Ошибка здесь не фиксируется, но в флаг переноса CF записывается 1 (ес­ли переноса не было, в CF заносится 0). "Поймать" такое искажение сум­мы можно только последующим анализом флага CF.

    Искажение результата 

←предыдущая следующая→
1 2 3 4 5 6 7 8 9 10 11 ... 


Copyright © 2005—2007 «RefStore.Ru»