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

Главная/

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

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

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

результата  происходит и при вычитание из меньшего числа большего.  И здесь не фиксируется ошибка,  однако первому числу дается "заем единицы"  (в случае байтов  это число увеличивается на 256,  для

слов - на 2^16), после чего и производится вычитание.  Например, вычи­тание байтов 2 и 3 сводится к вычитанию чисел 256+2=258 и 3, в резуль­тате чего  получается  неправильная  разность 255 (а не -1).  Для того чтобы можно было обнаружить такую ситуацию,  в флаг переноса CF  зано­сится 1 (если заема не было, в CF записывается 0).

    Сложение и вычитание  знаковых целых чисел  производится по тем же алгоритмам, что и для беззнаковых чисел (в этом одно из достоинств до­полнительного кода):  знаковые числа рассматриваются как соответствую­щие беззнаковые числа, произодится операция над этими беззнаковыми чи­слами и полученный результат интерпретируется как знаковое число. Нап­ример,  сложение байтовых чисел 1 и -2 происходит так:  берутся их до­полнительные коды  1 и  (256-2)=254,  вычисляется  сумма  этих величин 1+254=255 и она трактуется как знаковое число -1 (255=256-1). Если при таком сложении возникла единица переноса, то она, как обычно, отбрасы­вается, а флаг CF получает значение 1.  Однако в данном случае это от­сечение не представляет интерес - результат операции будет правильным, например: 3+(-2) => 3+254(mod 256) = 257(mod 256) = 1. Зато здесь воз­можна иная неприятность:  модуль суммы  (ее мантисса)  может превзойти допустимую границу и "залезть" в знаковый разряд, испортив его. Напри­мер,  при сложении байтовых чисел  127 и 2  получается величина  129 = =   100001001b, представляющая дополнительный код числа -127 (=256-129).

Хотя результат здесь получился и неправильным,  процессор не фиксирует ошибку, но зато заносит 1 в флаг переполнения OF  (если  "переполнения мантиссы" не было,  в OF записывается 0).  Анализируя затем этот флаг, можно "поймать" такую ошибку.

    Таким образом,  сложение (вычитание) знаковых и беззнаковых чисел производится  по одному и тому же алгоритму.  При этом  ПК не "знает", какие числа (со знаком или без) он складывает; в любом случае он скла­дывает их как беззнаковые числа  и в любом случае формирует флаги CF и OF.  А  вот  как интерпретировать слагаемые и сумму,  на какой из этих флагов обращать внимание - это личное дело автора программы.

    Что касается умножения и деления знаковых и беззнаковых чисел,  то они выполняются по разным алгоритмам, разными машинными командами. Од­нако  и  у этих операций есть ряд особенностей.  При умножении  байтов (слов)  первый сомножитель  обязан находиться в регистре AL (AX),  ре­зультатом же умножения  является слово (двойное слово),  которое зано­сится в регистр AX (регистры DX и AX).  Тем самым при умножении сохра­няются все цифры произведения.  При делении байтов (слов)  первый опе­ранд (делимое) должен быть словом (двойным словом) и обязан находиться в регистре AX  (регистрах DX и AX).  Результатом деления  являются две величины размером в байт (слово) - неполное частное (div) и остаток от деления (mod);  неполное частное записывается в регистр AL (AX), а ос­таток - в регистр AH (DX).

         1.2.3 Представление символов и строк

    На символ отводится один байт памяти,  в который записывается  код символа - целое от 0 до 255. В ПК используется система кодировки ASCII (American Standard Code for Information Interchange).  Она, естествен­но, не содержит кодов русских букв, поэтому в нашей стране применяется некоторый вариант этой системы с русскими буквами  (обычно это альтер­нативная кодировка ГОСТа).

    Некоторые особенности этих систем кодировки:

- код пробела  меньше кода любой буквы, цифры и вообще любого графи-

чески представимого символа;

- коды цифр  упорядочены по величине цифр и  не содержат  пропусков,

т.е. из неравенства код('0')<=код(c)<=код('9') следует, что c - цифра; - коды больших латинских букв упорядочены согласно алфавиту и не со-

держат пропусков; аналогично с малыми латинскими буквами;

  - (в альтернативной кодировке ГОСТа) коды русских букв (как больших, так и малых)  упорядочены согласно алфавиту,  но между ними  есть коды других символов.

    Строка (последовательность символов) размещается в соседних байтах памяти (в неперевернутом виде): код первого символа строки записывает­ся в первом байте, код второго символа - во втором байте и т.п.  Адре­сом строки считается адрес ее первого байта.

    В ПК строкой считается также и последовательность слов (обычно это

последовательность целых чисел).  Элементы таких строк располагаются в последовательных ячейках памяти,  но каждый элемент представлен в "пе­ревернутом" виде.

         1.2.4 Представление адресов

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

    Дело в том, что в ПК термином "адрес" обозначают разные вещи. Час­то под адресом понимается 16-битовое смещение (offset) - адрес ячейки, отсчитанный от начала сегмента (области) памяти,  которому принадлежит эта ячейка. В этом случае под адрес отводится слово памяти, причем ад­рес записывается в "перевернутом" виде (как и числа-слова вообще).

    В другом случае под "адресом" понимается 20-битовый абсолютный ад­рес некоторой ячейки памяти. В силу ряда причин в ПК такой адрес зада­ется не как 20-битовое число, а как пара "сегмент:смещение", где "сег­мент" (segment) - это первые 16 битов начального адреса сегмента памя­ти, которому принадлежит ячейка,  а "смещение" - 16-битовый адрес этой ячейки,  отсчитанный  от  начала  данного  сегмента  памяти  (величина 16*сегмент+смещение  даетабсолютный адрес ячейки).  Такая пара записы­вается в виде двойного слова,  причем (как и для чисел)  в "переверну­том" виде: в первом слове размещается смещение, а во втором - сегмент, причем каждое из этих слов  в свою очередь  представлено в "переверну­том" виде. Например, пара 1234h:5678h будет записана так:

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

           | 78 | 56 | 34 | 12 |

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

             смещение  сегмент

         1.2.5 Директивы определения данных

    Для того чтобы в программе на MASM  зарезервировать  ячейки памяти под константы и переменные, необходимо воспользоваться директивами оп­ределения данных - с названиями DB (описывает данные размером в байт), DW (размером в слово) и DD (размером в двойное слово). (Директивы, или команды ассемблеру, - это предложения программы, которыми ее автор со­общает какую-то информацию ассемблеру или просит что-то сделать допол­нительно, помимо перевода символьных команд на машинный язык.)

    В простейшем случае в директиве DB,  DW  или  DD  описывается одна константа,  которой дается имя для последующих ссылок на нее.  По этой директиве ассемблер формирует машинное представление константы (в час­тности, если надо, "переворачивает" ее) и записывает в очередную ячей­ку памяти. Адрес этой ячейки становится значением имени: все вхождения имени в программу ассемблер будет заменять на этот адрес.  Имена, ука­занные в директивах DB, DW и DD, называются именами переменных  (в от­личие от меток - имен команд).

    В MASM числа записываются в нормальном (неперевернутом) виде в cи­стемах счисления с основанием 10, 16, 8 или 2.  Десятичные числа запи­сываются как обычно, за шестнадцатиричным числом ставится буква h (ес­ли число начинается с "цифры" A, B, ..., F,  то вначале обязателен 0), за восьмиричным

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


Copyright © 2005—2007 «RefStore.Ru»