ВУЗ:
Составители:
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
- …
- следующая ›
- последняя »