индексная
При задании адреса используется один из индексных регистров esi (si) или edi (di). При таком способе адресации адрес области памяти может иметь вид:
-индексный регистр в квадратных скобках. Например, команда вида mov [esi], ’\0’
-некоторое символическое имя и индексный регистр в квадратных скобках. mov arr[esi], 10
-в квадратных скобках индексный регистр, символическое имя и константы, соединенные знаком +. mov [arr + esi], 1 mov [arr + esi+4], 2
С помощью этого метода разрешается организовывать доступ к одномерным массивам байтов. Смещение соответствует адресу начала массива. Число в регистре - индексу элемента массива, который надо считать. Eсли массив состоит из байтов, базовый регистр увеличиваем на 1, если из слов, увеличиваем на 2, если из двойных слов - на 4. Масштабирование, которое выполняется в Си при увеличении адреса можно заменить умножением базового регистр на 2, для двойных слов - на 4.
базовая
Если применяется базовая адресация, то при задании адреса используется один из базовых регистров: либо ЕBX(ВХ) либо BP
При таком способе адресации адрес области памяти, куда помещается информация, может быть записан:
-заключением в квадратные скобки базового регистра: MOV [ebx],10
-заключением в квадратные скобки не базового регистра, символического имени: MOV [x+ebx],10
- заключением в квадратные скобки базового регистра, символического имени и некоторого числа-смещения: MOV [x+ebx+4],10
С помощью этого метода разрешается организовывать доступ к одномерным массивам байтов. Смещение соответствует адресу начала массива. Число в регистре - индексу элемента массива, который надо считать.
базово-индексная
это когда при задании адреса используются один из базовых регистров: ebx (bx) ebp (bp) и один из индексных регистров: esi (si) либо edi (di)
-либозаключением в квадратные скобки базового и индексного регистров, например, можно записать так: MOV[BX,SI],25
- либо заключением в квадратные скобки не только базового и индексного регистров, но и некоторого символического имени, например MOV А[ЕBX,ЕSI],2007
- либо заключением в квадратные скобки не только базового регистра и индексного регистра, некоторого символического имени, но и некоторого числа, называемого смещением. Например,
MOV [X+ЕBX+ЕSI+4],2007
mov ax,[bx+si+2]
mov ax,[bx][si]+2
mov ax,[bx+2][si] Разные способы записи одного и того же
mov ax,[bx][si+2]
mov ax,2[bx][si]
адресация по базе с индексированием и масштабированием
Это самая полная схема адресации, в которую входят все случаи, рассмотренные ранее как частные. Смещение может быть байтом или двойным словом. Если ESP или ЕВР используются в роли базового регистра, селектор сегмента операнда берется по умолчанию из регистра SS, во всех остальных случаях - из DS.
mov [ebx-4][esi*4],edx
Арифметические команды
Двоичной aрифметики | Десятичной арифметики | |
Add | Imul | Aaa |
Adc | Mul | Daa |
Inc | Idiv | Aas |
Sub | Div | Das |
Sbb | Neg | Aam |
Dec | Aad |
Команды сложения
add приёмник, источник – выполняет сложение приёмника и источника, результат заносится в приёмник. Источник не изменяется, меняются флаги. Команда ADD не различает числа со знаком и без знака, но, употребляя значения флагов CF (перенос при сложении чисел без знака), OF (перенос при сложении чисел со знаком) и SF (знак результата), разрешается применять ее и для тех, и для других.
adc приёмник, источник – выполняет сложение приёмника, источника и флага CF. Обычно эта команда используется для сложения чисел повышенной точности.
inc приемник (инкремент) - у величивает приемник (регистр или переменная) на 1. Единственное отличие этой команды от add приемник,1
состоит в том, что флаг CF не затрагивается, а остальные меняются в соответствии с правилами сложения.
Команды вычитания
sub приёмник, источник – вычитает источник из приёмника, результат заносит в приёмник.
sbb приёмник, источник – вычитает из приёмника значение источника, затем вычитает значение CF. Её можно использовать для вычитания 64-битных слов.
dec приемник (декремент) - у величивает приемник (регистр или переменная) на 1. Единственное отличие этой команды от sub приемник,1
состоит в том, что флаг CF не затрагивается, а остальные меняются в соответствии с правилами сложения.
Команды умножения
MUL источник - умножение чисел без знака
Источник умножается на al|ax|eax в зависимости от разрядности операнда.
Результат располагается в ax|dx:ax|edx:eax соответственно.
Если результат поместился в младшую половину, то CF=OF=0, иначе CF=OF=1. ZF, SF, AF, PF – не определены.
Умножение со знаком:
1. IMUL источник (регистр или переменная) умножается на AL, АХ или ЕАХ (в зависимости от размера операнда), и результат располагается в АХ, DX и AX или EDX и EAX соответственно.
2. IMUL приемник, источник: источник (число, регистр или переменная) умножается на приемник (регистр), и результат заносится в приемник.
3. IMUL приемник, источник1, источник2: источник 1 (регистр или переменная) умножается на источник 2 (число), и результат заносится в приемник (регистр).
1. Команды деления
DIV источник – целочисленное деление без знака.
I DIV источник – целочисленное деление co знаком.
Команда DIV выполняет деление целого числа без знака, из регистра АХ (в случае деления на байт), DX и AX (в случае деления на слово) и EDX и EAX (в случае деления на двойное слово), на операнд-источник (целое число без знака). Частное заносится в AL(в случае деления на байт), AX(в случае деления на слово),EAX(в случае деления на двойное слово); остаток в AH(в случае деления на байт), DX(в случае деления на слово), EDX(в случае деления на двойное слово). Размер делимого в два раза больше размеров делителя и остатка. Флаги ZF, SF, CF, OF, AF, PF после этой команды не определены.
Остальные команды
Команда изменения знака NEG.
NEG приемник (регистр или переменная)
Выполняет над числом, содержащимся в приемнике (регистр или переменная), операцию дополнения до двух. Эта операция эквивалентна обращению знака операнда, если рассматривать его как число со знаком. Если приемник равен нулю, флаг CF = 0, иначе 1. Остальные флаги (OF, SF, ZF, AF, PF) назначаются в соответствии с результатом операции.
КомандаXCHG выполняет обмен двух значений. Обмен значений можно выполнять двух между регистрами или между регистрами и памятью:
XCHG приемник, источник
Команда NOP - ничего не делающая команда
NOP
Эта команда не делает абсолютно ничего (пустая команда). Она только занимает пространство и время. Используется для резервирования места в сегменте кода или организации программной задержки.
22. Команды преобразования:
CBW Преобразование байта в слово (convert byte to word)
Команда CBW заполняет регистр AH знаковым битом содержимого регистра АL, преобразуя тем самым 8-разрядное число со знаком в 16-разрядное. Команду удобно использовать для преобразования байтового делимого в двухбайтовое (слово) при делении на 8-разрядный операнд.