Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Команды преобразования типов




Что делать, если размеры операндов, участвующих в арифметических операциях, разные? Например, предположим, что в операции сложения один операнд является

р^—————

новом, а другой занимает двойное слово. Выше сказано, что в операции сложения отжны участвовать операнды одного формата. Если числа без знака, то выход най­ти просто. В этом случае можно на базе исходного операнда сформировать новый (формата двойного слова), старшие разряды которого просто заполнить нулями, (ложнее ситуация для чисел со знаком: как динамически, в ходе выполнения про­граммы, учесть знак операнда? Для решения подобных проблем в системе команд микропроцессора есть так называемые команды преобразования типа. Эти команды расширяют байты в слова, слова — в двойные слова и двойные слова — в учетверен­ные слова (64-разрядные значения). Команды преобразования типа особенно полез­ны при преобразовании целых со знаком, так как они автоматически заполняют стар­шие биты вновь формируемого операнда значениями знакового бита старого объекта. Эта операция приводит к целым значениям того же знака и той же величины, что и исходная, но уже в более длинном формате. Подобное преобразование называется операцией распространения знака. Существуют два вида команд преобразования типа:

1. Команды без операндов — эти команды работают с фиксированными регист­рами:

О cbw (Convert Byte to Word) — команда преобразования байта (в регистре al) в слово (в регистре ах) путем распространения значения старшего бита al на все биты регистра ah;

О cwd (Convert Word to Double) — команда преобразования слова (в регистре ах) в двойное слово (в регистрах dx:ax) путем распространения значения старшего бита ах па все биты регистра dx;

О cwde (Convert Word to Double) — команда преобразования слова (в ре­гистре ах) в двойное слово (в регистре еах) путем распространения значе­ния старшего бита ах на все биты старшей половины регистра еах;

О cdq (Convert Double Word to Quarter Word) — команда преобразования двой­ного слова (в регистре еах) в учетверенное слово (в регистрах ecbceax) путем распространения значения старшего бита еах на все биты регист­ра edx;

2. Команды movsx и movzx, относящиеся к командам обработки строк (см. урок 11). Эти команды обладают полезным свойством в контексте пнашей

проблемы:

О movsx операнд_1, операнд_2 — переслать с распространением знака. Расши­ряет 8- или 16-разрядное значение операнд_2, которое может быть регист­ром или операндом в памяти, до 16- или 32-разрядного значения в одном из регистров, используя значение знакового бита для заполнения стар­ших позиций операнд_1. Данную команду удобно использовать для подго­товки операндов со знаками к выполнению арифметических действий;

О movzx операнд_1^!, операнд_2 — переслать с расширением нулем. Расширяет 8- или 16-разрядное значение операнд_2 до 16- или 32-разрядного с очист­кой (заполнением) нулями старших позиций операнд^а. Данную команду удобно использовать для подготовки операндов без знака к выполнению арифмяписЬметических действий.

К примеру, вычислим значение у = (а + Ь}/с, где а, Ь, с — байтовые знаковые пе­ременные (листинг 8,7)..

Листинг 8.7. Вычисление простого выражения
<1>;prg_8_9.asm '

<2> masm --..,,
<3> model small • ' ' ' •'••..•"-^ ••
<4> stack 256 "..,.-,-.-
<S>.data '"•. ' ' ',. ;'

<6> a db 5 • " •• ' -•'..<-•;•,-• ;: -. - •

<7> b db 10;•,'.';-•••••.•" -...:, -..|...: "

<8> с db 2 '•.'•,,.••-..•';•,.'.. •; •.-••". •-•<• '• ' ••;;

<9> у dw 0,. - •.," •;.-,... •;... -,.-,•;.,,i; i

<1O.code •, •. ' •••'.,..,. ;....;.-. • •'. j.,..it

<11> main:;точка входа'в программу,,., -.."..

<12>...

<Z3> хог ax,ax " •' " ' •'•'''• • ' •.' *'

<14> mov al,a. '.:•,•.•...• - ':...•..••'< • '. <15> cbw

<16> movsx bx.b..,. _, •

<17> ' ' add ax.bx ' " *' '.'•' '\ ';."

<18> idiv с;в al - частное, в ah, -• bcraf'ok'

<19> exit:..•••;. • j

<20>. mov ax,4cOOh.-стандартный выход..•>.:.•• - т

<21> Int 21h.;•',.;• •,-.••.,• •;,'; I

<22> end main;конец программы ' •
В этой программе делимое для команды idiv (строка 18) готовится заранее. Так щ
как делитель имеет размер байта, то делимое должно быть словом. С учетом это- 1
го сложение осуществляется параллельно с преобразованием размера результата |
в слово (строки 14-17). Например, расширение операндов со знаком производит- 1
ся двумя разными командами — cbw и movsx. |

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных