ВУЗ:
Составители:
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 (то же вправо).
Страницы
- « первая
- ‹ предыдущая
- …
- 6
- 7
- 8
- 9
- 10
- …
- следующая ›
- последняя »
