- •1.1.2 Регистры
- •Index, индекс приемника; sp - stack pointer, указатель стека; cs -
- •1.2.1 Представление целых чисел.
- •1.2.2 Особенности выполнения арифметических опреаций
- •1.2.3 Представление символов и строк
- •1.2.4 Представление адресов
- •1.3.3 Запись команд в masm
- •1.4.3), А в общих чертах он такой: ссылки на сегмент команд могут быть
- •1.4.3 Сегментирование, базирование и индексирование адресов
- •1.4.5 Начальная загрузка сегментных регистров
- •1.4.6 Ссылки вперед
- •2) Внутрисегментный относительный длинный переход.
- •1.5.2 Условные переходы.
- •1.5.3 Команды управление циклом
- •1.6. Строковые операции
- •1.7.2 Основные стековые команды
- •1.7.4 Процедуры в языке ассемблера
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). Другими словами, при расширении со знаком в первом байте
слова копируется знаковый разряд числа-байта.
Аналогично происходит расширение числа-слова до двойного слова.
