Методическое пособие по решению задач лабораторного практикума по курсу "ЭВУ и системы" (изучение архитектуры и системы команд INTEL-совместимых микропроцессоров). Коршунов А.Д. - 8 стр.

UptoLike

Составители: 

8
операции «память-память» недопустимы, то есть нельзя указывать ссылку на ячейку
памяти одновременно и в первом и во втором операнде. Если это необходимо согласно
алгоритму решения задачи, следует использовать операцию «регистр-память», а затем
переслать (командой MOV) результат из указанного регистра в другую ячейку памяти.
Команды MUL (multiplication) и IMUL (integer multiplication), осуществляющие
умножение, более сложны в использовании. Каждая из них имеет лишь один операнд -
первый множитель. А где же указывается второй и где окажется результат? Это зависит от
того, будет ли работать команда со словом или с байтом.
Пусть в качестве единственного операнда указан регистр или ячейка размером в
байт (например, MUL CL). Тогда второй множитель (тоже байт) берётся обязательно из
регистра AL, а результат (16-разрядный, т.е. длиной в слово) окажется в регистре AX:
AX
AL
op
Если же операнд “op” взят 16-разрядным (например, MUL CX), то команда
выполнит следующее действие:
DXAX
AX
op,
то есть второй множитель, также 16-разрядный, будет автоматически взят из регистра AX,
а результат размером в двойное слово, т.е. 32-разрядный, окажется в регистровой паре,
состоящей из DX и AX.
Команда деления DIV работает следующим образом. Как и в команде MUL, здесь
указывается единственный операнд, который является делителем. Этот делитель опять же
может быть словом или байтом. Если “op” - байт, то команда выполняется как
((AH-остаток) и (AL-частное))
AX / op,
то есть делимое берётся из 16-разрядного регистра AX, 8-разрядное частное оказывается
записанным в AL, остаток такой же размерности - в AH.
Если же “op” - 16-разрядное слово, то МП выполнит команду как
((DX-остаток) и (AX-частное))
DXAX / op,
то есть 32-разрядное делимое будет взято из регистровой пары DXAX, частное окажется в
AX, остаток - в DX (оба - 16-разрядные).
Команда IDIV, в отличие от DIV, имеет ту особенность, что частное и остаток
всегда имеют одинаковые знаки. Так, при делении -47 на +3 из двух возможных
результатов (-15 с остатком -2 и -16 с остатком +1) будет получен первый результат
.
Команды инкремента INC и декремента DEC просты в использовании и вряд ли
могут привести к затруднениям: первая из них увеличивает свой единственный операнд на
единицу, вторая - уменьшает. Эти команды удобно применять, например, в цикле при
необходимости наращивания или уменьшения какого-либо счётчика, адреса и т.п.
Команда CMP (to compare - сравнивать)
служит для сравнения двух операндов
путём вычитания первого операнда из второго (op2-op1). В отличие от обычного
вычитания, полученная разность нигде не сохраняется (значения операндов остаются
неизменными); результатом команды являются только значения флагов в регистре
FLAGS. Как правило, сразу за командой CMP в программе ставится какая-нибудь из
команд условных переходов, анализирующая эти флаги.
Команды сдвига данных (Таблица 3, 17…20). Команды SHL (shift left) и SHR
(shift right) обеспечивают, в частности, быстрое удвоение чисел и деление пополам.
Существуют также команды SAL и SAR для чисел со знаком, здесь не рассматриваемые.
Для осуществления циклических сдвигов влево и вправо, с участием или без участия
флага CF используются также команды ROL (циклический сдвиг влево), ROR (то же
вправо), RCL (циклический сдвиг влево через CF) и RCR (то же вправо).
                                                                                        8
операции «память-память» недопустимы, то есть нельзя указывать ссылку на ячейку
памяти одновременно и в первом и во втором операнде. Если это необходимо согласно
алгоритму решения задачи, следует использовать операцию «регистр-память», а затем
переслать (командой MOV) результат из указанного регистра в другую ячейку памяти.
       Команды MUL (multiplication) и IMUL (integer multiplication), осуществляющие
умножение, более сложны в использовании. Каждая из них имеет лишь один операнд -
первый множитель. А где же указывается второй и где окажется результат? Это зависит от
того, будет ли работать команда со словом или с байтом.
       Пусть в качестве единственного операнда указан регистр или ячейка размером в
байт (например, MUL CL). Тогда второй множитель (тоже байт) берётся обязательно из
регистра AL, а результат (16-разрядный, т.е. длиной в слово) окажется в регистре AX:

                                   AX ← AL ∗ op
       Если же операнд “op” взят 16-разрядным (например, MUL CX), то команда
выполнит следующее действие:
                                 DXAX ← AX ∗ op,
то есть второй множитель, также 16-разрядный, будет автоматически взят из регистра AX,
а результат размером в двойное слово, т.е. 32-разрядный, окажется в регистровой паре,
состоящей из DX и AX.
       Команда деления DIV работает следующим образом. Как и в команде MUL, здесь
указывается единственный операнд, который является делителем. Этот делитель опять же
может быть словом или байтом. Если “op” - байт, то команда выполняется как

                    ((AH-остаток) и (AL-частное)) ← AX / op,
то есть делимое берётся из 16-разрядного регистра AX, 8-разрядное частное оказывается
записанным в AL, остаток такой же размерности - в AH.
       Если же “op” - 16-разрядное слово, то МП выполнит команду как

                 ((DX-остаток) и (AX-частное)) ← DXAX / op,
то есть 32-разрядное делимое будет взято из регистровой пары DXAX, частное окажется в
AX, остаток - в DX (оба - 16-разрядные).
         Команда IDIV, в отличие от DIV, имеет ту особенность, что частное и остаток
всегда имеют одинаковые знаки. Так, при делении -47 на +3 из двух возможных
результатов (-15 с остатком -2 и -16 с остатком +1) будет получен первый результат.
         Команды инкремента INC и декремента DEC просты в использовании и вряд ли
могут привести к затруднениям: первая из них увеличивает свой единственный операнд на
единицу, вторая - уменьшает. Эти команды удобно применять, например, в цикле при
необходимости наращивания или уменьшения какого-либо счётчика, адреса и т.п.
         Команда CMP (to compare - сравнивать) служит для сравнения двух операндов
путём вычитания первого операнда из второго (op2-op1). В отличие от обычного
вычитания, полученная разность нигде не сохраняется (значения операндов остаются
неизменными); результатом команды являются только значения флагов в регистре
FLAGS. Как правило, сразу за командой CMP в программе ставится какая-нибудь из
команд условных переходов, анализирующая эти флаги.
         Команды сдвига данных (Таблица 3, № 17…20). Команды SHL (shift left) и SHR
(shift right) обеспечивают, в частности, быстрое удвоение чисел и деление пополам.
Существуют также команды SAL и SAR для чисел со знаком, здесь не рассматриваемые.
Для осуществления циклических сдвигов влево и вправо, с участием или без участия
флага CF используются также команды ROL (циклический сдвиг влево), ROR (то же
вправо), RCL (циклический сдвиг влево через CF) и RCR (то же вправо).