Максимов Н.В., Партыка Т.Л., Попов И.И. Архитектура ЭВМ и вычислительных систем (2005) (1186253), страница 74
Текст из файла (страница 74)
Кроме того,рассматриваются некоторые особенности выполнения арифметических операций.Шестнадцатеричные числа записываются с буквой h на конце,двоичные числа — с буквой b (так принято в MASM).П р е д с т а в л е н и е ц е л ы х ч и с е л . В общем случае под целоечисло можно отвести любое число байтов, однако система команд180X86 поддерживает только числа размером в байт и слово и частично поддерживает числа размером в двойное слово.
Именно этиформаты и будут рассмотрены.4.3. Режимы процессора. Система команд процессоров 180x86...379В 180X86 делается различие между целыми числами без знака(неотрицательными) и со знаком. Это объясняется тем, что в ячейках одного и того же размера можно представить больший диапазончисел без знаков, чем чисел со знаком, и если известно заранее, чтонекоторая числовая величина является неотрицательной, то выгоднее рассматривать ее как величину без знака, чем как величину сознакомЦелые числа без знака Эти числа могут быть представлены ввиде байта, слова или двойного слова — в зависимости от их размера. В виде байта представляются целые от 0 до 255 (2s - 1), в видеслова — целые от 0 до 65 535 (216 - 1), в виде двойного слова — целые от 0 до 4 294 967 295 (232 - 1) Числа записываются в двоичнойсистеме счисления, занимая все разряды ячейки.Например, число 130 записывается в виде байта ЮООООЮЬ(82h).Числа размером в слово хранятся в памяти в «перевернутом»виде- младшие (правые) 8 битов числа размещаются в первом байтеслова, а старшие 8 битов — во втором байте (в шестнадцатеричнойсистеме' две правые цифры — в первом байте, две левые цифры —во втором байте).
Например, число 130 (0082h) в виде слова хранится в памяти так:8200Однако в регистрах числа хранятся в нормальном виде:АХ0082АНALПеревернутое представление используется и при хранении впамяти целых чисел размером в двойное слово: в первом его байтеразмещаются младшие 8 битов числа, во втором байте — предыдущие 8 битов и т.
д. Например, число 12345678h хранится в памяти так:78563412Другими словами, в первом слове двойного слова размещаютсямладшие (правые) 16 битов числа, а во втором слове — старшие 16битов, причем в каждом из этих двух слов в свою очередь используется «перевернутое» представление.380Глава 4, Персональные компьютерыТакое необычное представление чисел объясняется тем, что впервых моделях 180X86 за один такт можно было считать из памятитолько один байт и что все арифметические операции над многозначными числами начинаются с действий над младшими цифрами,поэтому из памяти в первую очередь надо считывать младшие цифры, если сразу нельзя считать все цифры. Учитывая это, в первых180X86 стали размешать младшие цифры числа перед старшимицифрами, а ради преемственности такое представление чисел сохранили в последующих моделях 180X86.Конечно, «перевернутое» представление неудобно для людей,однако при использовании языка ассемблера это неудобство не чувствуется: в MASM все числа записываются в нормальном, неперевернутом виде.Целые числа со знаком.
Эти числа также представляются в видебайта, слова и двойного слова. В виде байта записываются числа от-128 до 127, в виде слова — числа от -32 768 до 32 767, а в видедвойного слова — числа от -2 147 483 648 до 2 147 483 647. При этомчисла записываются в дополнительном коде: неотрицательное числозаписывается так же, как и число без знака (т. е. в прямом коде), аотрицательное число -х (х > 0) представляется как число без знака28 - х (для байтов), 2 16 - х (для слов) или 232 - х (для двойных слов).Например, дополнительным кодом числа -6 является байт FAh(256 - 6), слово FFFAh или двойное слово FFFFFFFAh. При этомбайт Ю О О О О О О Ь (80h) трактуется как -128, а не как +128 (слово8000h понимается как -32 678), поэтому левый бит дополнительного кода всегда играет роль знакового: для неотрицательных чисел онравен «О», для отрицательных — «1».Числа со знаком размером в слово и двойное слово записываются в памяти в «перевернутом» виде (при этом знаковый бит оказывается в последнем байте ячейки).
Но в MASM эти числа, как и беззнаковые, записываются в нормальной форме.Иногда число-байт необходимо расширить до слова, т. е. получить такое же по величине число, но размером в слово. Существуетдва способа такого расширения — без знака и со знаком.
В любомслучае исходное число-байт попадает во второй (до «переворачивания») байт слова, а вот первый байт заполняется по-разному: прирасширении без знака в него записываются нулевые биты (12h превращается в 0012h), а при расширении со знаком в первый байт записываются нули, если число-байт было неотрицательным, и записывается восемь двоичных единиц в противном случае (81h перехо-4.3. Режимы процессора. Система команд процессоров 180x86...381дит в FF8lh). Другими словами, при расширении со знаком впервом байте слова копируется знаковый разряд числа-байта.Аналогично происходит расширение числа-слова до двойногослова.Арифметические операции. В 180X86 имеются команды сложенияи вычитания целых чисел размером в слово и байт.
Специальныхкоманд для сложения и вычитания двойных слов нет, эти операцииреализуются через команды сложения и вычитания слов. Сложениеи вычитание беззнаковых чисел производится по модулю 28 длябайтов и 2 1 6 для слов. Это означает, что если в результате сложенияпоявилась единица переноса, не вмещающаяся в разрядную сетку,то она отбрасывается.
Например, при сложении байтов 128 и 130получается число 258 (ЮОООООЮЬ), поэтому левая двоичная единица отбрасывается и остается число 2 (10Ь), которое является результатом сложения.Ошибка здесь не фиксируется, но в флаг переноса CF заносится«1» (если переноса не было, в CF заносится «О»). Установить такоеискажение суммы можно только последующим анализом флага CF.Искажение результата происходит и при вычитании из меньшего числа большего.
И здесь не фиксируется ошибка, однако первому числу дается «заем единицы» (в случае байтов это число увеличивается на 256, для слов — на 2'6), после чего и производится вычитание. Например, вычитание байтов 2 и 3 сводится к вычитаниючисел 256 + 2 = 258 и 3, в результате чего получается неправильнаяразность — 255 (а не -1).
Для того чтобы можно было обнаружитьтакую ситуацию, флаг переноса CF переключается на «1» (если «заема» не было, в CF записывается «О»).Сложение и вычитание целых чисел со знаком производится потем же алгоритмам, что и для чисел без знака (в этом одно из достоинств дополнительного кода): числа со знаком рассматриваются каксоответствующие числа без знака, производится операция над этими беззнаковыми числами и полученный результат интерпретируется как число со знаком. Например, сложение байтовых чисел 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 .
Зато здесь возможна иная382Глава 4. Персональные компьютерынеприятность: модуль суммы (ее мантисса) может превзойти допустимую границу и «залезть» в знаковый разряд, испортив его.Например, при сложении байтовых чисел 127 и 2 получается величина 129 ( l O O O O l O O l b ) , представляющая дополнительный кодчисла -127 (256- 129).Хотя результат здесь получился и неправильным, процессор нефиксирует ошибку, но зато заносит «1» в флаг переполнения OF(если «переполнения мантиссы» не было, в OF записывается «О»).Анализируя затем этот флаг, можно «поймать» такую ошибку.Таким образом, сложение (вычитание) знаковых и чисел беззнака производится по одному и тому же алгоритму.
При этом180X86 «не знает», какие числа (со знаком или без) он складывает; влюбом случае он складывает их как числа без знака и в любом случае формирует флаги CF и OF. Как интерпретировать слагаемые исумму, на какой из этих флагов обращать внимание — личное делоавтора программы.Что касается умножения и деления знаковых и чисел без знака,то они выполняются по разным алгоритмам, разными машиннымикомандами.
Однако и у этих операций есть ряд особенностей. Приумножении байтов (слов) первый сомножитель обязан находиться врегистре AL (АХ), результатом же умножения является слово (двойное слово), которое заносится в регистр АХ (регистры DX и АХ). Темсамым при умножении сохраняются все цифры произведения.
Приделении байтов (слов) первый операнд (делимое) должен быть словом (двойным словом) и обязан находиться в регистре АХ (регистрахDX и АХ). Результатом деления являются две величины размером вбайт (слово) — неполное частное (div) и остаток от деления (mod);неполное частное записывается в регистр AL (АХ), а остаток — в регистр АН (DX).Представление символов и строк. На символ отводится один байтпамяти, в который записывается код символа — целое от 0 до 255.В 180X86 используется система кодировки ASCII (American StandardCode for Information Interchange).
Она не предусматривает кодоврусских букв (кириллицы), поэтому в РФ применяется некоторыйвариант этой системы с кириллицей (обычно это альтернативнаякодировка ГОСТа).Некоторые особенности этих систем кодировки:• код пробела меньше кода любой буквы, цифры и вообще любого графически представимого символа;• коды цифр упорядочены по величине цифр и не содержатпропусков, т. е.
из неравенства код(«0») < код( С) < код(«9»)следует, что С — цифра;4.3. Режимы процессора. Система команд процессоров 180x86...383• коды прописных латинских букв упорядочены согласно алфавиту и не содержат пропусков; аналогично со строчными латинскими буквами;• (в альтернативной кодировке ГОСТа) коды кириллицы (какпрописных, так и строчных) упорядочены согласно алфавиту,но между ними есть коды других символовСтрока (последовательность символов) размещается в соседнихбайтах памяти (в неперевернутом виде): код первого символа строкизаписывается в первом байте, код второго символа — во второмбайте и т. п. Адресом строки считается адрес ее первого байта.В 180X86 строкой считается также и последовательность слов(обычно это последовательность целых чисел).