Пусть регистр bx содержит значение 903а какое значение он примет после выполнения команды sarbc 2

Обновлено: 10.05.2024

Цель работы: изучить форматы и правила работы с командами сложения и вычитания микропроцессора i8086.

Оборудование: IBM - совместимый персональный компьютер, работающий под управлением операционной системы, совместимой с MS-DOS®.

Краткие теоретические сведения.

1. Форматы арифметических данных
2. Команды сложения
3. Команды вычитания
4. Команда обращения знака
5. Команды расширения знака

Коррекция результата сложения для представления в кодах ASCII и в упакованном десятичном формате (команды AAA и DAA).
Как уже упоминалось, при выполнении сложения микропроцессор 8x86 рассматривает операнды как двоичные числа. Что же произойдет, если они будут двоично-десятичными кодами чисел (кратко десятичными или BCD-числа¬ми)? Разберемся в этом на примере. При сложении упакованных BCD-чисел 26 и 55 микропроцессор 8x86 выполнит следующее двоичное сложение:

00100110 (BCD-число 26)
+01010101 (BCD-число 55)
01111011 (??)
Вместо правильного значения (BCD-число 81) мы получим результат, у которого старшая цифра 7, а младшая - шестнадцатеричная цифра В. Означает ли это, что нельзя складывать десятичные числа? Нет, это означает лишь то, что результат должен быть скорректирован для представления в десятичной форме.
Коррекция результата сложения десятичных чисел осуществляется командами ААА (ASCII adjust for addition - скорректировать результат сложения для представ¬ления в кодах ASCII) и DAA (Decimal adjust for addition - скорректировать сложе¬ние для представления в десятичной форме). В них не требуется наличия операн¬да: предполагается, что корректируемое значение находится в регистре AL.
Команда ААА преобразует содержимое регистра AL в правильную неупакован¬ную десятичную цифру в младших четырех битах регистра AL (и заполняет нуля¬ми старшие четыре бита). Она используется в следующем контексте:

ADD AL,BL ;Сложить неупакованные числа, находящиеся в AL и BL
ААА ; и преобразовать результат в неупакованное число
Если результат превышает 9, то команда ААА добавляет 1 к содержимому регист¬ра АН (чтобы учесть избыточную цифру) и полагает флаг CF равным 1; в против¬ном случае она обнуляет флаг CF. Кроме того, команда ААА изменяет состояние флага AF и оставляет значения флагов PF, ZF, SF и OF неопределенными. Но так как в данном случае только флаг CF имеет смысл, то считайте значения остальных флагов уничтоженными.
Команда DAA преобразует содержимое регистра AL в две правильные упако¬ванные десятичные цифры. Она используется в следующем контексте:

ADD AL,BL ;Сложить упакованные BCD-числа в AL и BL
DAA ; и преобразовать результат в упакованное число
Если результат превышает предельное значение для упакованных BCD-чисел (99), то команда DAA добавляет 1 к содержимому регистра АН и полагает флаг CF равным 1. Кроме того, команда DAA изменяет состояния флагов PF, AF, ZF и CF и оставляет значение флага OF неопределенным. Но так как в данном случае только флаг CF имеет смысл, то считайте остальные пять флагов уничтоженными.

0000 1010 (10)
+1111 1001 (-7)
0000 0011 (Ответ: 3)
Эврика! Мы получили правильный ответ!
Так как микропроцессор 8x86 выполняет дополнение до двух автоматически, то Вам эта операция понадобится в редких случаях. Позже в этом разделе мы рассмотрим команду NEG, посредством которой можно выполнить дополнение до двух, если оно когда-либо Вам понадобится.

Команда вычитания SUB и вычитания с заемом SBB.
Команды SUB (substract - вычесть) и SBB (substract with borrow - вычесть с заемом) аналогичны соответственно командам сложения ADD и ADC, только при вычитании флаг переноса CF действует как признак заема. Команда SUB вычитает операнд-источник из операнда-приемника и возвращает результат в операнд-приемник, т.е.

приемник = приемник — источник

Команда SBB делает то же самое, но дополнительно вычитает значение флага переноса CF:
приемник = приемник - источник - перенос
Как и в случае сложения, команды вычитания выполняют две отдельные функ¬ции. Первая команда SUB вычитает числа размером в байт или слово, а также младшие биты чисел повышенной точности. Другая команда SBB вычитает старшие биты чисел повышенной точности. Например, команда
SUB AХ,СХ
вычитает содержимое регистра СХ из содержимого регистра АХ и возвращает результат в регистр АХ.
Если размеры операндов превышают 16 битов, то пользуйтесь последователь¬ностью команд вида
SUB AX,BX ;Вычесть младшие 16 битов,
SBB BX,DX ; а затем — старшие 16 битов
Здесь мы вычитаем 32-битовое число, помещенное в регистры СХ и DX, из 32-бито¬вого числа, помещенного в регистры АХ и ВХ. При вычитании содержимого регист¬ра DX из содержимого регистра ВХ команда SBB учитывает возможность заема при выполнении первого вычитания.
Можно вычитать из содержимого регистра содержимое ячейки памяти (и наоборот) или вычитать из содержимого регистра либо ячейки памяти непосредст¬венное значение. Ниже приведены примеры допустимых команд:
SUB AХ,MEM_WORD ; Вычесть из регистра содержимое ячейки памяти
SUB MEM_WORD[BX],AХ ; или наоборот
SUB AL,10 ; Вычесть константу из регистра
SUB MEM_BYTE,OFH ; или из ячейки памяти
Нельзя непосредственно вычесть значение одной ячейки из другой или использо¬вать непосредственное значение как приемник.
Команды SUB и SBB могут воздействовать на шесть флагов следующим обра¬зом:
Флаг переноса CF равен 1, если требуется заем; в противном случае он равен 0.
Флаг четности PF равен 1, если результат вычитания имеет четное число битов со значением 1; в противном случае он равен 0.
Вспомогательный флаг переноса AF равен 1, если результат вычитания десятич¬ных чисел требует коррекции; в противном случае он равен 0.
Флаг нуля ZF равен 1, если результат равен 0; в противном случае он равен 0.
Флаг знака SF равен 1, если результат отрицателен (старший бит равен 1); в противном случае он равен 0.
Флаг переполнения OF равен 1, если при вычитании чисел, имеющих разные знаки, результат превышает диапазон значений приемника в обратном коде, а сам приемник изменяет знак; в противном случае флаг OF равен 0.
Флаги SF и OF имеют смысл только при вычитании чисел со знаком, а флаг AF – только при вычитании десятичных чисел.

Коррекция результата вычитания для представления в кодах ASCII и в упакованном десятичном формате (команды AAS и DAS).
При вычитании, как и при сложении, микропроцессор 8x86 рассматри¬вает операнды как двоичные числа. Поэтому вычитание чисел, представленных в двоично-десятичном коде (BCD-чисел), может привести к неправильным результа¬там. Предположим, например, что надо вычесть BCD-число 26 из BCD-числа 55. Микропроцессор 8x86 выполнит двоичное вычитание следующим образом: допол¬нит до двух двоично-десятичное представление числа 26, а затем выполнит сложе¬ние:
0101 0101 (BCD-число 55)
+ 1101 1010 (дополнение до двух BCD-числа 26)
1 0010 1111 (??).
Вместо правильного значения (BCD-числа 29) мы получили результат, у которого старшая цифра 2, младшая цифра - шестнадцатеричная цифра F, и при этом бит переноса равен 1. Конечно, этот результат требует коррекции.
Коррекция результата вычитания двух десятичных чисел осуществляется командами AAS (ASCII adjust for substraction - скорректировать вычитание для представления в кодах ASCII) и DAS (Decimal adjust for substraction - скорректиро¬вать вычитание для представления в десятичной форме). При их исполнении предполагается, что корректируемое число находится в регистре AL.
Команда AAS преобразует содержимое регистра AL в правильную неупакован¬ную десятичную цифру в младших четырех битах регистра AL (и обнуляет старшие четыре бита). Она используется в следующем контексте:
SUB AL,BL ; Вычесть BCD-число (содержимое BL) из AL
AAS ; и преобразовать результат в неупакованное число
Если результат превышает 9, то команда AAS вычитает 1 из содержимого регистра АН и полагает флаг CF равным 1, в противном случае она обнуляет флаг CF. Кроме того, команда AAS изменяет состояние флага AF и оставляет значения флагов PF, ZF, SF и OF неопределенными. Но так как в данном случае только флаг CF имеет смысл, то считайте значения остальных флагов уничтоженными.
Команда DAS преобразует содержимое регистра AL в две правильные упако¬ванные десятичные цифры. Она используется в следующем контексте:
SUB AL,BL ;Вычесть упакованное BCD-число(содержимое) BL из AL
DAS ; и преобразовать результат в упакованное число
Если результат превышает предельное значение для упакованных BCD-чисел (99), то команда DAS вычитает 1 из содержимого регистра АН и полагает флаг CF равным 1; в противном случае она обнуляет флаг CF. Кроме того, команда DAS изменяет состояния флагов PF, AF, ZF и SF, а значение флага OF оставляет неопре¬деленным. Но так как в данном случае только флаг CF имеет смысл, то считайте остальные упомянутые флаги уничтоженными.

Команда уменьшения содержимого приемника на единицу DEC
Команда DEC (decrement - уменьшить) вычитает 1 из содержимого регистра или ячейки памяти, но при этом (в отличие от команды SUB) не воздейст¬вует на флаг переноса CF. Команда DEC часто используется в циклах для умень¬шения значения счетчика до тех пор, пока оно не станет нулевым или отрицатель¬ным. Ее можно использовать также для уменьшения значения индексного регистpa или указателя при доступе к последовательно расположенным ячейкам памя¬ти.
Приведем несколько примеров:

Команда обращения знака NEG.
Команда NEG вычитает значение операнда-приемника из нулевого значения и тем самым формирует его дополнение до двух. Команда NEG оказыва¬ет на флаг то же действие, что и команда SUB. Но поскольку один из операндов равен 0, то можно точнее описать условия изменения состояний флагов. Итак, при исполнении команды NEG флаги изменяются следующим образом:
Флаг переноса CF и флаг знака SF равны 1, если операнд представляет собой ненулевое положительное число; в противном случае они равны 0.
Флаг четности PF равен 1, если результат имеет четное число битов, равных 1; в противном случае он равен 0.
Флаг нуля ZF равен 1, если операнд равен 0; в противном случае он равен 0.
Флаг переполнения OF равен 1, если операнд-байт имеет значение 80Н или операнд-слово имеет значение 8000Н; в противном случае он равен 0.
Команда NEG полезна для вычитания значения регистра или ячейки памяти из непосредственного значения. Например, Вам нужно вычесть значение регистра AL из 100. Так как непосредственное значение не может служить приемником, то команда SUB 100, AL недопустима. В качестве альтернативы можно обратить знак содержимого регистра AL и добавить к нему 100:

NEG AL
ADD AL,100

Команда расширения знака.
Существуют две команды, позволяющие выполнять операции над смешанными данными за счет удвоения размера операнда со знаком. Команда CBW (convert byte to word — преобразовать байт в слово) воспроизводит 7-й бит регистра AL во всех битах регистра AH.
Команда CWD (convert word to double word — преобразовать слово в двойное слово) воспроизводит 15-й бит регистра AX во всех битах регистра DX.
Таким образом, команда CBW позволяет сложить байт и слово, вычесть слово из байта и т. д. Аналогично, команда CWD позволяет разделить слово на слово.
Приведем несколько примеров:

CBW ;Сложить байт в AL со словом в BX
ADD AX,BX
CBW ;Умножить байт в AL на слово в BX
IMUL BX
CWD ;Разделить слово в AX на слово в BX
IDIV BX

Индивидуальное задание.
Вычислить следующее выражение:

F = КОН1 оп1 (КОН2 оп2 Х оп3 Y) оп4 Z оп5 КОН3
где
КОН1, КОН2, КОН3 – числовые константы, согласно табл. 1
оп1, оп2, оп3, оп4, оп5 – операции сложения и вычитания согласно табл. 2
X, Y – переменные
Числовые константы из табл. 1 берутся согласно первой цифре варианта, операции сложения и вычитания из табл. 2 – согласно второй цифре варианта.
Исходные данные хранятся в памяти с адреса 0900H, вычисление выражения производится на Ассемблере, выводимые результаты — располагаются в памяти с адреса 1000Н.

КОН1
4589
КОН2
29
КОН3
562235
оп1

оп2

оп3
+
оп4
+
оп5
+
Пример. У студента индивидуальный вариант 9. Строим индивидуальное выражение для вычисления: F=458 – (481 + X + Y) + Z — 36

Ассемблерный фрагмент выглядит следующим образом:
mov bx, 481h // Пересылаем константу в регистр AX
mov al,x
cbw // Расширяем число X до 16 бит
add bx,ax // 481h + X
add bx, y // 481h + X + Y
mov al,z
cbw // Расширяем число Z до 16 бит
add bx,ax // (481h + X + Y) +Z
sub bx,36h // (481h + X + Y) +Z - 36h
mov cx, 458h
sub cx, ax
mov f,cx

На этом шаге мы познакомимся с регистрами .

Процессор имеет 14 регистров (смотри шаг 4), используемых для управления выполняющейся программой, адресации памяти и обеспечения арифметических вычислений. Каждый регистр имеет длину в одно слово (16 бит) и адресуется по имени. Биты регистра принято нумеровать слева направо.

Замечание . Процессоры 80386, 80486, Pentium имеют ряд дополнительных регистров, некоторые из них 32-битовые. Эти регистры здесь не рассматриваются.

  1. Сегментные регистры (CS, DS, SS, ES) .
    • Регистр сегмента кода (CS) содержит начальный адрес сегмента кода. Этот адрес плюс значение смещения в командном указателе ( IP ) определяет адрес команды, которая должна быть выбрана для выполнения .
    • Регистр сегмента данных (DS) содержит начальный адрес сегмента данных. Этот адрес плюс значение смещения, определенное в команде, указывают на конкретную ячейку в сегменте данных.
    • Регистр сегмента стека (SS) содержит начальный адрес сегмента стека.
    • Регистр ES . Некоторые операции над строками используют дополнительный сегментный регистр для управления адресацией памяти. В этом случае этот регистр связан с индексным регистром DI . Если необходимо использовать регистр ES , ассемблерная программа должна его инициализировать.
  2. Регистры общего назначения (AX, BX, CX, DX) . Особенность этих регистров состоит в том, что возможна адресация их как одного целого слова, так и однобайтовой части . Левый байт является старшей частью ( High ), а правый - младшей частью ( Low ) соответствующего регистра. Например, двухбайтовый регистр CX состоит из двух однобайтовых CH и CL , и ссылки на регистр возможны по любому из этих трех имен.


Рис.1. Адресация регистров общего назначения

  • Регистр AX . Он является основным сумматором и применяется для всех операций ввода-вывода, некоторых операций над строками и некоторых арифметических операций. Например, команды умножения, деления и сдвига предполагают использование регистра AX . Некоторые команды генерируют более эффективный код, если они имеют ссылки на регистр AX .
  • Регистр BX . Он является базовым регистром . Это единственный регистр общего назначения, который может использоваться в качестве "индекса" для расширенной адресации. Также он используется при организации вычислений.
  • Регистр CX . Это счетчик , используемый для управления числом повторений циклов и для операций сдвига влево или вправо. Регистр CX используется также при вычислениях.
  • Регистр DX . Он является регистром данных и применяется для некоторых операций ввода-вывода и тех операций умножения и деления над большими числами, которые используют регистровую пару DX:AX .
  • Регистр SP. Указатель стека обеспечивает использование стека в памяти, позволяет временно хранить адреса и иногда данные. Этот регистр связан с регистром SS для адресации стека.
  • Регистр BP. Указатель базы облегчает доступ к параметрам (данным и адресам, переданным через стек).
  • Регистр SI . Этот регистр является индексом источника данных и применяется для некоторых операций над строками. В этом случае он адресует память в паре с регистром DS .
  • Регистр DI . Этот регистр является индексом назначения и применяется также для строковых операций. В данном случае он используется совместно с регистром ES .


Рис.2. Структура флагового регистра

Многие арифметические команды и команды сравнения изменяют состояние флагов. Назначение флагов приведено в таблице 1.

При программировании на Ассемблере наиболее часто используются флаги OF, SF, ZF и CF для арифметических операций и операций сравнения, а флаг DF - для обозначения направления в операциях над строками.

На этом шаге мы познакомимся с основными арифметическими командами.

Перечислим основные арифметические команды, используемые для организации вычислений.

Таблица 1. Основные арифметические команды Команда Назначение
ADD (Сложение) Определяет двоичную сумму двух указанных операндов.
ADC (Сложение с переносом) Определяет двоичную сумму двух указанных операндов и содержимого флага переноса CF .
INC (Инкремент) Увеличивает содержимое операнда на 1.
SUB (Вычитание) Определяет разность уменьшаемого и вычитаемого.
SBB (Вычитание с заемом) Определяет разность двух операндов, и, кроме того, из уменьшаемого вычитается содержимое флага переноса.
DEC (Декремент) Уменьшает содержимое операнда на единицу.
MUL (Умножение) Производит беззнаковое умножение содержимого аккумулятора (регистра AL при байтовом умножении и регистра AX при умножении слов) на указанный операнд.
IMUL (Умножение целых чисел с учетом знака) Производит умножение аккумулятора на указанный операнд с учетом знаков.
DIV (Деление) Осуществляет деление содержимого аккумулятора ( AX при байтовом делении или пары регистров DX и AX при делении слов) на указанный операнд без учета знаков.
IDIV (Деление чисел с учетом знака) Выполняет деление содержимого аккумулятора ( AX при делении байтовых чисел или пары регистров DX и AX при делении слов) на указанный операнд с учетом знаков.
MOV (Пересылка данных) Пересылает данные из одного операнда в другой.
XCHG (Обмен значениями) Меняет местами содержимое двух операндов.
NEG (Получение противоположного значения) Меняет знак операнда на противоположный.

Рассмотрим более подробно перечисленные команды.

1. ADD (Сложение). Определяет двоичную сумму двух указанных операндов . Результат помещается на место операнда-приемника, второй операнд остается без изменения. Общий вид:

Местом хранения первого операнда может быть регистр или ячейка памяти; второго операнда - регистр или ячейка памяти, либо он может быть задан константой. Не разрешается использовать для записи операндов сегментные регистры, а также ячейки памяти для одновременного хранения двух операндов. Операнды могут быть числами со знаком или без него и представлять собой байты или слова.

Пример. Пусть регистр DL содержит число 58H, однобайтовая ячейка памяти TEST_BYTE содержит 27H. После выполнения команды ADD TEST_BYTE,DL в ячейку памяти будет записано 7FH:

Флаги, затрагиваемые операцией: OF, ZF, AF, PF, CF .

2. ADC (Сложение с переносом). Определяет двоичную сумму двух указанных операндов и содержимого флага переноса CF . Результат помещается на место операнда-приемника, второй операнд остается без изменений. Общий вид:

Команда работает с байтами и со словами, со знаковыми и беззнаковыми двоичными числами. Первый операнд может храниться в регистре или ячейке памяти. Второй операнд может быть задан в регистре, ячейке памяти или непосредственным числовым значением. Не разрешается задавать операнды в регистрах сегментов, а также хранение (запись) двух операндов одновременно в ячейках памяти. Операнды могут быть байтами или словами, представлять числа со знаком или без знака. Поскольку команда ADC использует флаг переноса CF , то она может применяться для сложения чисел, длина которых превышает 16 бит.

Пример 1. Пусть регистр BX содержит число 4803H, регистр AX - число 2517H, а регистр флагов процессора содержит значение F047H (1111000001000111 2 ), то есть флаг переноса CF равен 1. После выполнения команды ADC AX,BX вместо 2517H в регистре AX будет записано 6D1BH:

Пример 2. Проиллюстрируем использование этой команды при сложении так называемых "длинных" чисел, которые на помещаются в одно слово. Пусть требуется сложить два таких числа:

Сначала сложим младшие слова этих чисел, используя команду ADD :

Единица в скобках - это значение флага CF . Одновременно это значение, которое должно быть перенесено в следующий разряд. Мы должны его учесть при сложении старших разрядов этих чисел. Поэтому нужно воспользоваться командой ADC :

Таким образом, окончательный результат будет следующим:

Флаги, затрагиваемые операцией: OF, SF, ZF, AF, PF, CF .

3. INC (Инкремент). Увеличивает содержимое операнда на 1 . Общий вид:

Операнд может быть задан в регистре общего назначения или в ячейке памяти. Сегментные регистры не могут быть использованы для хранения операндов. Команда INC может использоваться как с однобайтовыми, так и двухбайтовыми операндами. Операнды интерпретируются как числа без знака. Команда воздействует на флаги OF, SF, ZF, AF, PF .

Пример. Пусть регистр BX задает двухбайтовую область памяти с содержимым FE00H и выполняется команда INC WORD PTR [BX] . Новым содержимым памяти после выполнения команды будет число FE01H. Так как результатом операции является отрицательное, отличное от нуля число в дополнительном коде, то флаг SF установлен в 1, а флаг ZF - в 0. Наличие только одного отличного от нуля разряда в младшем байте слова обусловливает сброс флага PF в 0.

Замечание . Выражение [BX] сообщает Ассемблеру, что регистр BX содержит адрес операнда, а не является операндом сам по себе. Скобки [ и ], заключающие какое-либо значение, указывают Ассемблеру, что это значение - адрес . Другая часть выражения, WORD PTR , требуется Ассемблеру для информации, что операнд является переменной типа WORD (слово).

4. SUB (Вычитание). Определяет разность уменьшаемого и вычитаемого . Результат помещается на место уменьшаемого, вычитаемое остается без изменений. Общий вид:

Пример. Рассмотрим случай, когда регистр DL содержит число 58H, регистр DH - число 20H. После выполнения команды SUB DL,DH в регистре DL будет записано число 38H.

Флаги, затрагиваемые операцией: OF, SF, ZF, AF, PF, CF .

5. SBB (Вычитание с заемом). Определяет разность двух операндов, и, кроме того, из уменьшаемого вычитается содержимое флага переноса :

Результат помещается на место первого операнда, предыдущее значение которого теряется. Содержимое второго операнда не изменяется.

Первый операнд может быть задан в регистре или ячейке памяти. Второй операнд, кроме того, может быть задан константой. Не допускается использовать для записи операндов сегментные регистры или задавать оба операнда в ячейках памяти. Операнды могут быть однобайтовыми или двухбайтовыми числами со знаком или без знака. Возможность заема позволяет использовать команду SBB для организации вычитания чисел с разрядностью, превышающей 16 бит.

Пример. Пусть регистр AX содержит число 4803H, регистр флагов - F047H, флаг CF установлен в 1. После выполнения команды SBB AX, 1500H в регистре AX будет записано 3302H. Флаги, затрагиваемые операцией: OF, SF, ZF, AF, PF, CF .

6. DEC (Декремент). Уменьшает содержимое операнда на единицу :

Операнд может храниться в регистре общего назначения или ячейке памяти. Не допускается задание операндов в регистрах сегментов. Операция выполняется как над однобайтовыми, так и над двухбайтовыми числами. Операнд рассматривается как беззнаковое число. Команда DEC не воздействует на флаг CF .

Пример. Пусть в регистре BL записано 00 и выполняется команда DEC BL . Новым содержимым регистра BL будет число FFH. Так как результат является отрицательным, отличным от нуля числом в дополнительном коде, флаг знака SF устанавливается в 1, а флаг нуля ZF сбрасывается в 0. Поскольку в результате присутствует восемь отличных от нуля битов, то есть четное число, то флаг паритета PF тоже установлен в 1.

Флаги, затрагиваемые операцией: OF, SF, ZF, AF, PF .

7. MUL (Умножение). Производит беззнаковое умножение содержимого аккумулятора (регистра AL при байтовом умножении и регистра AX при умножении слов) на указанный операнд . Общий вид:

Если операнд является байтом, то он умножается на содержимое регистра AL и результат двойной длины (слово) записывается в регистр AX . Если операнд - слово, то он умножается на содержимое регистра AX и результат (двойное слово) записывается в пару регистров DX и AX , причем регистр DX содержит старшие разряды результата. Операнд может быть задан в регистре общего назначения или ячейке памяти и интерпретируется как число без знака. Описанный порядок выполнения команды умножения сведен в таблицу 2.

Если содержимое регистра AH после однобайтового умножения или содержимое регистра DX после двухбайтового умножения не равны нулю, флаги CF и OF устанавливаются в 1. В противном случае они сбрасываются в 0. Состояние флагов SF, ZF, AF, PF после команды MUL не определено.

Пример 1. Пусть регистр AL содержит число 30H, однобайтовая ячейка памяти NEXT_L содержит 12H и выполняется команда MUL NEXT_L . Результат умножения (12H Х 30H = 360H) записывается в регистр AX . Поскольку содержимое регистра AH отлично от 0, флаги CF и OF установлены в 1.

Пример 2. Пусть теперь регистр AX содержит число 1000H, регистр BX - число 550H. Тогда после выполнения команды MUL BX результат умножения (1000H Х 550H = 550000H) будет записан в пару регистров DX и AX . Так как новое значение регистра DX (0055H) отлично от нуля, то флаги CF и OF устанавливаются в 1.

Флаги, затрагиваемые операцией: OF, SF, ZF, AF, PF, CF .

8. IMUL (Умножение целых чисел с учетом знака) . Производит умножение аккумулятора на указанный операнд с учетом знаков. Результатом байтового умножения является 16-битовое число, хранящееся в регистре AX . Результат умножения слов - 32-битовое число в паре регистров DX и AX , причем в DX - старшие 16 бит результата. Если старшая часть ( AH при байтовом умножении или DX при длинах операндов, равных слову) содержит не знак младшей части результата, а его значащие цифры, флаги CF и OF переводятся в единичное состояние. В противном случае оба флага обнуляются. После выполнения IMUL состояние флагов AF, PF, SF и ZF становится неопределенным.

Флаги, затрагиваемые операцией: OF, SF, ZF, AF, PF, CF .

9. DIV (Деление). Осуществляет деление содержимого аккумулятора ( AX при байтовом делении или пары регистров DX и AX при делении слов) на указанный операнд без учета знаков . Общий вид:

Результат выполнения команды деления приведен в таблице 3.

Для двухбайтовых операций выполняется деление содержимого регистровой пары DX:AX на указанный операнд. Если результата деления больше FFFFH, то генерируется прерывание типа 0. При 16-битовом делении целая часть отношения размещается в регистре AX , а остаток - в регистре DX .

После выполнения команды DIV состояния разрядов регистра флагов процессора не определены. Если произошло переполнение, то частное и остаток не определены.

Пример 1. Пусть регистр AX содержит число 0047H, регистр CL - число 12H и выполняется команда DIV CL . Частное от деления (03H=47H/12H) записывается в регистр AL , а остаток 11H - в регистр AH .

Пример 2. Рассмотрим случай, когда регистры DX и AX содержат соответственно значения 0012H и F043H, представляющие 32-разрядное шестнадцатеричное число 0012F043H, регистр BP содержит число 4320H и выполняется команда DIV BP . Частное от деления (0048H=12F043H/4320H) записывается в регистр AX , а остаток (0F43H) - в регистр DX .

Флаги, затрагиваемые операцией: OF, SF, ZF, AF, PF, CF .

11. Для написания простейших программ на языке Ассемблера необходима еще одна команда, непосредственно не относящаяся с арифметическим командам. Это команда MOV (Пересылка данных) :

Второй операнд при выполнении команды MOV занимает место хранения первого операнда. При этом первый операнд теряется.

Первый операнд может быть задан в регистре общего назначения, регистре сегмента (кроме регистра CS ) или ячейки памяти. Второй операнд, кроме того, может быть еще и константой. Команда MOV работает как с однобайтовыми, так и с двухбайтовыми словами.

Пример. Пусть регистр CX содержит слово 04C5H, а регистр BP - слово 2312H. После выполнения команды MOV CX,BP содержимым регистра CX будет слово 2312H, а содержимое регистра BP не изменится.

12. Команда замены XCHG меняет местами содержимое двух операндов . Эта команда может поменять местами содержимое двух регистров, или регистра и памяти. При этом в качестве операндов не могут использоваться сегментные регистры. Общий вид:

13. Иногда, зная положительное число, требуется получить противоположное ему отрицательное число. Для этого используется команда NEG, обеспечивающая преобразование знака двоичных чисел из положительного в отрицательное и наоборот . Общий вид:

Пример. Пусть регистр AX содержит слово 0001H. После выполнения команды NEG AX содержимым регистра AX будет FFFFH. Таким образом, команда NEG инвертирует значения битов и прибавляет 1.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Эксперт 94731 / 64177 / 26122 Ответы с готовыми решениями:

Как вывести на экран значение регистра?
Помогите, не получается вывести на экран значение регистра cx, какие-то кракозябры только.

Вывести значение регистра на экран
Есть такая проблема, пишу резидент, поэтому в части реализации недоступны многие функции, кручусь.


[FASM] Вывести значение регистра на консоль
Нужно вывести значение регистра cl на консоль. Собственно сама задача заключается в том, чтобы.

Лабораторная работа. Немогу вывести значение регистра
Лаба следующая: задаются некоторые числа m, x и n. Если mx>n, вычислить y = (mx+n)/(mx-n). Если.

Читайте также: