Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Мнемоника арифметических команд




Обозначение Выполняемая функция
Команды сложения
ADD Сложение значений операндов
ADC Сложение значений операндов и значения флага переноса
INC Увеличение значения операнда на 1
AAA Коррекция ASCII кода при сложении
DAA Коррекция двоично-десятичного кода при сложении
Команды вычитания
SUB Вычитание значения второго операнда из значения первого
SBB Вычитание значения первого операнда и значения флага переноса (заем) из значения первого операнда
DEC Уменьшение значения операнда на 1
CMP Сравнение значений операндов
AAS Коррекция ASCII кода при вычитании
DAS Коррекция двоично-десятичного кода при вычитании
Команды умножения
MUL Умножение без учета знака
IMUL Умножение с учетом знака
AAM Коррекция ASCII кода при умножении
Команды деления
DIV Деление без учета знака
IDIV Деление с учетом знака
AAD Коррекция ASCII кода при делении
Команды изменения знака и размера
NEG Изменение знака у операнда
CBW Преобразование байта в слово
CWD Преобразование слова в двойное слово

Команда ADD имеет следующий формат в мнемонике ассемблера:

ADD dest,src,

где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти.

Эта команда складывает значение второго операнда со значением первого операнда, результат сложения помещается в первый операнд. Команда ADD изменяет значения флагов переполнения (OF), знака (SF), нуля (ZF), дополнительного переноса (AF), переноса (CF) и четности (PF). Флаг переполнения устанавливается, если при выполнении операции произошло переполнение (результат сложения не вмещается в размер операндов). Флаг знака устанавливается, если в результате выполнения операции получилось отрицательное число. Флаг нуля устанавливается, если результатом операции является ноль. Флаг дополнительного переноса устанавливается, если при сложении байт осуществлен перенос из 3-го бита. Флаг переноса устанавливается, если при сложении осуществлен перенос из старшего бита. Флаг четности устанавливается, если количество единичных битов в младшем байте результата операции четное.

Команда ADD имеет следующие форматы машинных кодов:

1) сложение операнда в памяти или в регистре с операндом в регистре

000000 dw mod reg r/m disp_low disp_high

2) сложение непосредственного операнда с содержимым аккумулятора

0000010 w data_low data_high

3) сложение непосредственного операнда с операндом в регистре или в памяти

100000 sw mod 000 r/m disp_low disp_high data_low data_high

Примеры использования команды ADD:

ADD DX,[BX + SI + 123] ; сложение содержимого ячейки памяти ; и регистра
ADD [BX + SI + 123],DX ; сложение содержимого регистра ; и ячейки памяти
ADD AX,123 ; сложение содержимого аккумулятора (AX) ; и константы
ADD AL,123 ; сложение содержимого аккумулятора (AL) ; и константы
ADD word ptr [123],123 ; сложение непосредственных данных ; с содержимым ячейки памяти
ADD CX,123 ; сложение непосредственных данных ; с содержимым регистра

Команда ADC имеет следующий формат в мнемонике ассемблера:

ADC dest,src,

где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти.

Эта команда складывает содержимое своих операндов и содержимое флага переноса (CF), результат сложения помещается в первый операнд. Содержимое регистра флагов при выполнении команды ADC изменяется аналогично тому, как это было при выполнении команды ADD.

Команда ADC имеет следующие форматы машинных кодов:

1) сложение операнда в памяти или в регистре с операндом в регистре

000100 dw mod reg r/m disp_low disp_high

2) сложение непосредственного операнда с содержимым аккумулятора

0001010 w data_low data_high

3) сложение непосредственного операнда с операндом в регистре или в памяти

100000 sw mod 010 r/m disp_low disp_high data_low data_high

Примеры использования команды ADC:

ADC DX,[BX + SI + 123] ; сложение с переносом содержимого ячейки ; памяти и регистра
ADC [BX + SI + 123],DX ; сложение с переносом содержимого регистра; и ячейки памяти
ADC AX,123 ; сложение с переносом содержимого ; аккумулятора (AX) и константы
ADC AL,123 ; сложение с переносом содержимого ; аккумулятора (AL) и константы
ADC word ptr [123],123 ; сложение с переносом непосредственных ; данных с содержимым ячейки памяти
ADC CX,123 ; сложение с переносом непосредственных ; данных с содержимым регистра

Команда INC имеет следующий формат в мнемонике ассемблера:

INC dest,

где операнд dest может иметь любой режим адресации, кроме непосредственной.

Эта команда увеличивает на 1 (инкрементирует) значение своего операнда. Содержимое регистра флагов (кроме флага CF) при выполнении команды INC изменяется аналогично тому, как это было при выполнении команды ADD. Команда INC не изменяет состояние флага переноса.

Команда INC имеет следующие форматы машинных кодов:

1) инкрементирование 16-разрядного регистра

01000 reg

2) инкрементирование регистра или ячейки памяти

1111111 w mod 000 r/m disp_low disp_high

Примеры использования команды INC:

INC AX ; инкрементирование 16–разрядного ; регистра
INC AH ; инкрементирование 8–разрядного ; регистра
INC byte ptr [BX + DI + 12] ; инкрементирование ячейки памяти

Команда AAA не имеет операндов. Эта команда корректирует содержимое регистра AL, которое рассматривается как результат сложения двух одноразрядных десятичных чисел, представленных ASCII кодами. Команда AAA проверяет младшую тетраду (младшую шестнадцатеричную цифру) в AL. Если значение этой тетрады больше 9 или флаг AF имеет значение 1, то к регистру AL прибавляется 6, а к регистру AH прибавляется 1, флаги AF и CF устанавливаются в 1. Кроме того, во всех случаях AAA записывает 0 в старшую тетраду AL.

Команда AAA имеет следующий формат машинного кода:

 

Пример использования команды AAA:

MOV AX,38h ; поместить в AL ASCII код цифры "8" и 0 в AH
MOV BL,34h ; поместить в BL ASCII код цифры "4"
ADD AL,BL ; сложить содержимое AL и BL, результат 6Ch, AF = 1
AAA ; коррекция AL (результат 0102 h в AX)

Команда DAA не имеет операндов. Эта команда корректирует содержимое регистра AL, которое рассматривается как результат сложения двух чисел, представленных двоично-десятичными кодами. Если младшая тетрада регистра AL имеет значение большее 9 или флаг AF установлен в 1, то команда DAA прибавляет 6 к содержимому регистра AL и устанавливает флаг AF в 1. Далее, если старшая тетрада регистра AL содержит значение большее, чем 9, или флаг CF установлен в 1, то команда DAA прибавляет 60 h к содержимому AL и устанавливает флаг CF в 1. Данная команда изменяет флаги AF, CF, PF, SF и ZF.

Команда DAA имеет следующий формат машинного кода:

 

Пример использования команды DAA:

MOV AL,38h ; поместить в AL двоично-десятичный код числа 38
MOV BL,34h ; поместить в BL двоично-десятичный код числа 34
ADD AL,BL ; сложить содержимое AL и BL, результат 6C h, AF = 1
DAA ; коррекция AL (результат 72 h в AL)

Команда SUB имеет следующий формат в мнемонике ассемблера:

SUB dest,src,

где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти.

Эта команда вычитает значение второго операнда из значения первого операнда, результат вычитания помещается в первый операнд. Команда SUB изменяет значения флагов OF, SF, ZF, AF, CF и PF. Флаг дополнительного переноса устанавливается, если при вычитании байт осуществлен заем из 3-го бита. Флаг переноса устанавливается, если при вычитании осуществлен заем из старшего бита.

Команда SUB имеет следующие форматы машинных кодов:

1) вычитание операнда в памяти или в регистре из операнда в регистре

001010 dw mod reg r/m disp_low disp_high

2) вычитание непосредственного операнда из содержимого аккумулятора

0010110 w data_low data_high

3) вычитание непосредственного операнда из операнда в регистре или в памяти

100000 sw mod 101 r/m disp_low disp_high data_low data_high

 


Примеры использования команды SUB:

SUB DX,[BX + SI + 123] ; вычитание содержимого ячейки памяти ; из содержимого регистра
SUB [BX + SI + 123],DX ; вычитание содержимого регистра ; из содержимого ячейки памяти
SUB AX,123 ; вычитание константы из содержимого ; аккумулятора (AX)
SUB AL,123 ; вычитание константы из содержимого ; аккумулятора (AL)
SUB word ptr [123],123 ; вычитание непосредственных данных ; из содержимого ячейки памяти
SUB CX,123 ; вычитание непосредственных данных ; из содержимого регистра

Команда SBB имеет следующий формат в мнемонике ассемблера:

SBB dest,src,

где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти.

Эта команда вычитает содержимое второго операнда и содержимое флага CF (заем) из содержимого первого операнда, результат вычитания помещается в первый операнд. Содержимое регистра флагов при выполнении команды SBB изменяется аналогично тому, как это было при выполнении команды SUB.

Команда SBB имеет следующие форматы машинных кодов:

1) вычитание операнда в памяти или в регистре из операнда в регистре

000110 dw mod reg r/m disp_low disp_high

2) вычитание непосредственного операнда из содержимого аккумулятора

0001110 w data_low data_high

3) вычитание непосредственного операнда из операнда в регистре или в памяти

100000 sw mod 011 r/m disp_low disp_high data_low data_high

Примеры использования команды SBB:

SBB DX,[BX + SI + 2] ; вычитание с заемом содержимого ; ячейки памяти из содержимого регистра
SBB [BX + SI + 2],DX ; вычитание с заемом содержимого регистра ; из содержимого ячейки памяти
SBB AX,123 ; вычитание с заемом константы из содержимого ; аккумулятора (AX)
SBB AL,123 ; вычитание с заемом константы из содержимого ; аккумулятора (AL)
SBB word ptr [123],12 ; вычитание с заемом непосредственных данных ; из содержимого ячейки памяти
SBB CX,123 ; вычитание с заемом непосредственных данных ; из содержимого регистра

Команда DEC имеет следующий формат в мнемонике ассемблера:

DEC dest,

где операнд dest может иметь любой режим адресации, кроме непосредственной.

Эта команда уменьшает на 1 (декрементирует) значение своего операнда. Содержимое регистра флагов (кроме флага CF) при выполнении команды DEC изменяется аналогично тому, как это было при выполнении команды SUB. Команда DEC не изменяет состояние флага переноса.

Команда DEC имеет следующие форматы машинных кодов:

1) декрементирование 16-разрядного регистра

01001 reg

2) декрементирование регистра или ячейки памяти

1111111 w mod 001 r/m disp_low disp_high

Примеры использования команды DEC:

DEC AX ; декрементирование 16-разрядного регистра
DEC AH ; декрементирование 8-разрядного регистра
DEC byte ptr [BX + 2] ; декрементирование ячейки памяти

Команда CMP имеет следующий формат в мнемонике ассемблера:

CMP dest,src,

где dest – первый операнд, который может иметь любой режим адресации, кроме непосредственной; src – второй операнд, который может иметь любой режим адресации, если первый операнд имеет регистровую адресацию, или иметь регистровую или непосредственную адресацию, если первый операнд адресует данные в памяти.

Эта команда предназначена для сравнения своих операндов. Действия, выполняемые командой CMP, во всем аналогичны действиям команды SUB, за тем лишь исключением, что результат вычитания ни куда не помещается, а изменяются только флаги.

Команда CMP имеет следующие форматы машинных кодов:

1) сравнение операнда в памяти или в регистре и операнда в регистре

001110 dw mod reg r/m disp_low disp_high

2) сравнение непосредственного операнда с содержимым аккумулятора

0011110 w data_low data_high

3) сравнение непосредственного операнда с операндом в регистре или в памяти

100000 sw mod 111 r/m disp_low disp_high data_low data_high

Примеры использования команды CMP:

CMP DX,[BX + SI + 12] ; сравнение содержимого ячейки памяти ; и регистра
CMP [BX + SI + 12],DX ; сравнение содержимого регистра ; и ячейки памяти
CMP AX,123 ; сравнение константы и содержимого ; аккумулятора (AX)
CMP AL,123 ; сравнение константы и содержимого ; аккумулятора (AL)
CMP word ptr [123],12 ; сравнение непосредственных данных ; и содержимого ячейки памяти
CMP CX,123 ; сравнение непосредственных данных ; и содержимого регистра

Команда AAS не имеет операндов. Эта команда корректирует содержимое регистра AL, которое рассматривается как результат вычитания двух одноразрядных десятичных чисел, представленных ASCII кодами. Команда AAS проверяет младшую тетраду в AL. Если значение этой тетрады больше 9 или флаг AF имеет значение 1, то из содержимого регистра AL вычитается 6, а из содержимого регистра AH вычитается 1, флаги AF и CF устанавливаются в 1. Кроме того, во всех случаях AAS записывает 0 в старшую тетраду AL.


Команда AAS имеет следующий формат машинного кода:

 

 

Пример использования команды AAS:

MOV AX,34h ; поместить в AL ASCII код цифры "4" и в AH значение 0
SUB AL,38h ; вычесть ASCII код цифры "8" из содержимого AL, ; результат FC h, AF = 1
AAS ; коррекция AL (результат FF06 h в AX, ; где 6 – дополнение числа – 4 до 10)

Команда DAS не имеет операндов. Эта команда корректирует содержимое регистра AL, которое рассматривается как результат вычитания двух чисел, представленных двоично-десятичными кодами. Если младшая тетрада регистра AL имеет значение большее 9 или флаг AF установлен в 1, то команда DAS вычитает 6 из содержимого регистра AL и устанавливает флаг AF в 1. Далее, если старшая тетрада регистра AL содержит значение большее, чем 9, или флаг CF установлен в 1, то команда DAS вычитает 60 h из содержимого AL и устанавливает флаг CF в 1. Данная команда изменяет флаги AF, CF, PF, SF и ZF.

Команда DAS имеет следующий формат машинного кода:

 

Пример использования команды DAS:

MOV AL,34h ; поместить в AL двоично-десятичный код числа 34
MOV BL,38h ; поместить в BL двоично-десятичный код числа 38
SUB AL,BL ; вычесть содержимое AL и BL, результат (FC h) в AL, ; AF = 1, CF = 1
DAS ; коррекция AL (результат 96 h в AL, где ; двоично-десятичное число 96 есть дополнение ; до 10 числа – 4)

Команда MUL имеет следующий формат в мнемонике ассемблера:

MUL src,

где src – операнд-множитель, имеющий любой режим адресации, кроме непосредственной.

Эта команда умножает беззнаковое множимое (байт или слово) на беззнаковый множитель (байт или слово соответственно). Старший бит мно-жимого и множителя при этом рассматривается как бит данных, а не как знаковый бит. При умножении байт множимое находится в регистре AL, произведение в регистре AX, а при умножении слов – множимое в регистре AX, произведение в паре регистров DX: AX. Команда MUL воздействует на флаги CF и OF (флаги AF, PF, SF, ZF не определены). Флаги CF и OF устанавливаются, если старшая часть произведения (AH или DX в зависимости от вида умножения) не равна 0. В противном случае эти флаги сбрасываются.

Команда MUL имеет следующий формат машинного кода:

1111011 w mod 100 r/m disp_low disp_high

Примеры использования команды MUL:

MUL BX ; умножение слов, множитель в регистре
MUL BH ; умножение байт, множитель в регистре
MUL byte ptr [BX + 123] ; умножение байт, множитель в памяти
MUL word ptr [SI + 123] ; умножение слов, множитель в памяти

Команда IMUL имеет следующий формат в мнемонике ассемблера:

IMUL src,

где src – операнд-множитель, имеющий любой режим адресации, кроме непосредственной.

Эта команда умножает знаковое множимое (байт или слово) на знаковый множитель (байт или слово соответственно). Старший бит множимого и множителя при этом рассматривается как знаковый бит. При умножении байт множимое находится в регистре AL, произведение в регистре AX, а при умножении слов – множимое в регистре AX, произведение в паре регистров DX: AX. Команда IMUL воздействует на флаги CF и OF (флаги AF, PF, SF, ZF не определены). Флаги CF и OF устанавливаются, если младшая часть произведения (AL или AX в зависимости от вида умножения) равна максимальному положительному числу, которое может в ней разместиться (7F h и 7FFF h соответственно), или старшая часть произведения (AH или DX в зависимости от вида умножения) не равна максимальному беззнаковому числу, которое может в ней разместиться (0FF h и 0FFFF h соответственно). В противном случае эти флаги сбрасываются.

Команда IMUL имеет следующий формат машинного кода:

1111011 w mod 101 r/m disp_low disp_high

 


Примеры использования команды IMUL:

IMUL BX ; знаковое умножение слов, множитель ; в регистре
IMUL BH ; знаковое умножение байт, множитель ; в регистре
IMUL byte ptr [BX + 123] ; знаковое умножение байт, множитель ; в памяти
IMUL word ptr [SI + 12] ; знаковое умножение слов, множитель ; в памяти

Команда AAM не имеет операндов. Эта команда корректирует содержимое регистра AX, которое рассматривается как результат умножения двух одноразрядных десятичных чисел, представленных ASCII кодами. Однако до выполнения умножения в этих числах должны быть обнулены старшие тетрады. Команда AAM делит содержимое регистра AL на 10, частное помещается в AH, а остаток от деления – в AL. Команда AAM изменяет флаги PF, SF и ZF.

Команда AAM имеет следующий формат машинного кода:

   

Пример использования команды AAM:

MOV AL,34h ; поместить в AL ASCII код цифры "4"
MOV BL,38h ; поместить в BL ASCII код цифры "8"
SUB AL,30h ; обнулить старшую тетраду в AL, результат 04 h
SUB BL,30h ; обнулить старшую тетраду в BL, результат 08 h
MUL BL ; перемножить содержимое AL и BL, ; результат 0020 h в AX
AAM ; осуществить коррекцию AX, результат 0302 h

Команда DIV имеет следующий формат в мнемонике ассемблера:

DIV src,

где src – операнд-множитель, имеющий любой режим адресации, кроме непосредственной.

Эта команда делит беззнаковое делимое (слово или двойное слово) на беззнаковый делитель (байт или слово соответственно). Старший бит множимого и множителя при этом рассматривается как бит данных, а не как знаковый бит. При делении на байт делимое находится в регистре AX, частное помещается в AL, а остаток от деления – в AH. При делении на слово делимое находится в паре регистров DX: AX, частное помещается в AX, а остаток от деления в DX. После выполнения команды DIV флаги CF, OF, AF, PF, SF, ZF не определены.

Если частное слишком велико для того, чтобы поместиться в регистре (AL или AX), то при выполнении команды DIV происходит программное прерывание INT 0h. Во избежание этой ситуации рекомендуется перед выполнением деления осуществлять проверку делителя на неравенство нулю. Другое правило, обеспечивающее благоприятные условия для выполнения деления, заключается в следующем: если делитель - байт, то его значение должно быть больше, чем старший байт (AH) делимого; если делитель – слово, то его значение должно быть больше, чем старшее слово (DX) делимого.

Команда DIV имеет следующий формат машинного кода:

1111011 w mod 110 r/m disp_low disp_high

Примеры использования команды DIV:

DIV BX ; деление на слово, делитель в регистре, ; делимое в DX: AX
DIV BH ; деление на байт, делитель в регистре, ; делимое в AX
DIV byte ptr [BX + SI + 123] ; деление на байт, делитель в памяти, ; делимое в AX
DIV word ptr [BX + SI + 12] ; деление на слово, делитель в памяти, ; делимое в DX: AX

Команда IDIV имеет следующий формат в мнемонике ассемблера:

IDIV src,

где src – операнд-множитель, имеющий любой режим адресации, кроме непосредственной.

Эта команда во всем аналогична команде DIV, с тем лишь исключением, что ее операнды рассматриваются как числа со знаком. При этом знак остатка всегда совпадает со знаком делимого.

Команда IDIV имеет следующий формат машинного кода:

1111011 w mod 111 r/m disp_low disp_high

Примеры использования команды IDIV:

IDIV BX ; знаковое деление на слово, ; делитель в регистре, делимое в DX: AX
IDIV BH ; знаковое деление на байт, ; делитель в регистре, делимое в AX
IDIV byte ptr [BX + SI + 123] ; знаковое деление на байт, ; делитель в памяти, делимое в AX
IDIV word ptr [BX + SI + 12] ; знаковое деление на слово, ; делитель в памяти, делимое в DX: AX

Команда AAD не имеет операндов. Эта команда корректирует содержимое регистра AX, которое рассматривается как делимое перед выполнением деления двухразрядного числа, представленного ASCII кодами своих цифр. Перед выполнением коррекции старшие тетрады AH и AL должны быть обнулены. Команда AAD умножает содержимое регистра AH на 10 и прибавляет полученное число к содержимому AL, при этом AH обнуляется. Команда AAD изменят флаги PF, SF и ZF.

Команда AAD имеет следующий формат машинного кода:

   

Пример использования команды AAD:

MOV AX,3435h ; поместить в AX ASCII коды цифр "4" и "5"
SUB AX,3030h ; обнулить старшие тетрады, результат 0405 h
AAD ; коррекция AX, результат 002D h (45)
MOV BL,03h ; поместить в BL делитель 3
DIV BL ; деление AX на BL, частное 0F h (15) в AL, ; остаток 0 в AH

Команда NEG имеет следующий формат в мнемонике ассемблера:

NEG dest,

где операнд dest может иметь любой режим адресации, кроме непосредственной.

Эта команда изменяет знак своего операнда путем построения его дополнительного кода. Команда NEG изменят флаги AF, CF, OF, SF, PF и ZF так же, как команда SUB при вычитании операнда dest из 0.

Команда NEG имеет следующий формат машинного кода:

1111011 w mod 011 r/m disp_low disp_high

Примеры использования команды NEG:

NEG AX ; изменение знака содержимого ; 16-разрядного регистра
NEG AH ; изменение знака содержимого ; 8-разрядного регистра
NEG byte ptr [BX + 12] ; изменение знака содержимого ячейки памяти

Команда CBW не имеет операндов. Ее выполнение заключается в том, что байт в AL расширяется до слова в AX расширением знакового бита. При этом значение регистра флагов не изменяется.

Команда CBW имеет следующий формат машинного кода:

 

Примеры использования команды CBW:

MOV AL,0Fh ; помещение в AL числа 15
CBW ; преобразование байта в слово, результат 000F h в AX
MOV BL,3 ; помещение числа 03 h в BL
IDIV BL ; деление, частное 05 h в AL, остаток 0 в AH

Команда CWD не имеет операндов. Ее выполнение заключается в том, что слово в AX расширяется до двойного слова в DX: AX расширением знакового бита. При этом значение регистра флагов не изменяется.

Команда CWD имеет следующий формат машинного кода:

 

Примеры использования команды CWD:

MOV AX,0Fh ; помещение в AX числа 15
CWD ; преобразование слова в двойное слово, ; результат 0000:000F h в DX: AX
MOV BX,3 ; помещение числа 0003 h в BX
IDIV BX ; деление, частное 0005h в AX, остаток 0 в DX

СОДЕРЖАНИЕ РАБОТЫ

1. Ознакомиться с теоретическим материалом.

2. С помощью программы debug исследовать выполнение всех арифметических команд с любым возможным типом их операндов.

3. В соответствии со своим вариантом решить поставленные задачи и с помощью DEBUG установить правильность их решения.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...