Ассемблер1 (1)

Содержание

Слайд 2

Группы регистров: основные функциональные регистры; регистры процессора с плавающей точкой; системные

Группы регистров:

основные функциональные регистры;
регистры процессора с плавающей точкой;
системные регистры;
регистры отладки и

тестирования.
Первые две группы регистров используются прикладными программами, последние две группы - системными программами, имеющими наивысший уровень привилегий.
Слайд 3

Основные функциональные регистры В состав регистров этой группы входят: регистры общего

Основные функциональные регистры

В состав регистров этой группы входят:
регистры общего назначения;
регистр указателя

команд;
регистр флагов;
сегментные регистры.
Слайд 4

Регистры общего назначения Регистры АХ, ВХ, СХ и DX входят в

Регистры общего назначения

Регистры АХ, ВХ, СХ и DX входят в группу

регистров общего назначения.
Первый регистр в этой группе, АХ, называется регистром-сумматором. Он применяется для накапливания результатов вычислений и часто выступает в роли приемника результатов выполнения различных команд.
Хотя каждый регистр способен решать множество разнообразных задач, результаты выполнения некоторых команд (в частности, команд умножения) отправляются в регистр АХ по умолчанию.
Слайд 5

Базовый регистр Второй регистр этой группы, ВХ, называется базовым регистром. По

Базовый регистр

Второй регистр этой группы, ВХ, называется базовым регистром.
По назначению

он во многом аналогичен регистру АХ, но есть и одно существенное отличие.
В ВХ можно записать адрес памяти, а затем выполнить команду, операнд которой располагается по этому адресу памяти.
Другими словами, ВХ может содержать указатель на область памяти, а АХ - не может.
Чтобы проиллюстрировать это утверждение, сравним две команды. 
Слайд 6

Первая команда: MOV АХ,ВХ Эта команда копирует содержимое ВХ в АХ.

Первая команда:
MOV АХ,ВХ
Эта команда копирует содержимое ВХ в АХ. Вторая команда:
M0V

АХ,(ВХ)
Эта команда копирует в АХ содержимое слова памяти, адрес которого содержится в ВХ.
В первом примере исходный операнд содержится в регистре ВХ;
во втором примере фигурирует указатель на исходный операнд.
В обоих примерах, как видите, для команды M0V заданы оба операнда: исходный (источник) и целевой (приемник). При этом целевой операнд указывается перед исходным.
Слайд 7

Счётчик Следующий регистр общего назначения, СХ, называется регистром-счетчиком. Помимо прочего, он

Счётчик

Следующий регистр общего назначения, СХ, называется регистром-счетчиком.
Помимо прочего, он применяется

для хранения значений счетчиков при выполнении циклов.
Во время обработки команды LOOP значение в этом регистре автоматически уменьшается на единицу.
Как правило, циклы завершаются в тот момент, когда значение в регистре СХ достигает нуля.
Слайд 8

Регистр данных Четвертым регистром в группе регистров общего назначения является регистр

Регистр данных

Четвертым регистром в группе регистров общего назначения является регистр данных

(DX).
Совместно с регистром АХ он задействуется при выполнении команд со словами двойной длины (32-разрядными).
В этом случае в DX сохраняются старшие 16 бит, а в АХ - младшие 16 бит.
Слайд 9

РОНы(32 бит)

РОНы(32 бит)

Слайд 10

Регистр флагов По результатам операций АЛУ устанавливает либо сбрасывает отдельные биты

Регистр флагов

По результатам операций АЛУ устанавливает либо сбрасывает отдельные биты в регистре флагов

F.
x обозначает, что содержимое этого бита не имеет значения.
Некоторые операции влияют только на отдельные флаги, а другие совсем на них не воздействуют, поэтому при описании флагов подразумевается выполнение тех команд (операций), которые влияют на эти флаги.
ZF - флаг/признак нулевого результата (Zero), устанавливается в 1, если получен нулевой результат, иначе (ZF)=0.
CF - флаг переноса (Carry) устанавливается, если в результате выполнения операции из старшего бита переносится или занимается 1 при сложении или вычитании, иначе (CF)=0. На CF влияют также команды сдвига и умножения.
Слайд 11

SF - флаг знака результата (Sign) равен единице, если результат отрицательный,

SF - флаг знака результата (Sign) равен единице, если результат отрицательный,

т.е. он дублирует старший знаковый бит результата.
PF - флаг четности (Parity). (PF)=1, если сумма по модулю два всех битов результата равна нулю (число единичных битов - четное).
AF - флаг дополнительного переноса (Auxiliary) устанавливается, если есть перенос из старшего бита младшей тетрады (бит D3) в младший бит старшей тетрады (бит D4). Используется в операциях над упакованными BCD числами.
OF - флаг переполнения (Overflow) устанавливается, когда результат операции превысит одно- или двухбайтовый диапазон чисел со ЗНАКОМ, а также в некоторых других случаях.
Другое определение: (OF)=1, если перенос/заем в старший бит результата не равен переносу/заему из старшего бита.
Слайд 12

TF (Trap Flag) — флаг пошагового режима (используется при отладке). IF

TF (Trap Flag) — флаг пошагового режима (используется при отладке).
IF (Interrupt-enable Flag) —

флаг разрешения аппаратных прерываний.
DF (Direction Flag) — флаг направления при строковых операциях. Обозначает левое или правое направление пересылки или сравнения строковых данных.
Слайд 13

Команды языка Ассемблер

Команды языка Ассемблер

Слайд 14

Комментарии Комментарии в языке ассемблера начинаются с символа «точка с запятой»

Комментарии

Комментарии в языке ассемблера начинаются с символа «точка с запятой» и

могут начинаться как в начале строки, так и после команды.
Слайд 15

Команда пересылки данных mov приёмник, источник Копирует содержимое источника в приёмник,

Команда пересылки данных

mov приёмник, источник
Копирует содержимое источника в приёмник, источник не

изменяется. 
Операнды должны иметь одинаковый размер. 
mov eax, ebx ; Пересылаем значение регистра EBX в регистр EAX
mov eax, 0ffffh ; Записываем в регистр EAX шестнадцатеричное значение ffff
mov x, 0 ; Записываем в переменную x значение 0
mov eax, x ; mov y, eax ; Переслать значение из одной ячейки памяти в другую нельзя. Но можно использовать две команды MOV.
Слайд 16

Команды сложения и вычитания add приёмник, источник – выполняет сложение приёмника

Команды сложения и вычитания

add приёмник, источник – выполняет сложение приёмника и источника, результат

заносится в приёмник.
Источник не изменяется.
sub приёмник, источник – вычитает источник из приёмника, результат заносит в приёмник.
Операнды должны иметь одинаковый размер. Если первый операнд – регистр, то второй может быть также регистром, ячейкой памяти и непосредственным операндом.
Если первый операнд – ячейка памяти, то второй операнд может быть регистром или непосредственным операндом.
Возможно сложение и вычитание как знаковых, так и беззнаковых чисел любого размера.
Команды меняют флаги AF, CF, OF, PF, SF и ZF.
mov eax, a
add eax, b
mov c, eax ; c = a + b
Слайд 17

Команды инкремента и декремента увеличивают и уменьшают на 1 свой операнд.

Команды инкремента и декремента 

увеличивают и уменьшают на 1 свой операнд.
INC <операнд>
DEC <операнд>
Операндом

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

Команда изменения знака NEG Операндом может быть регистр или ячейка памяти

Команда изменения знака

NEG <операнд>
Операндом может быть регистр или ячейка памяти

любого размера. Команда NEG рассматривает свой операнд как число со знаком и меняет знак операнда на противоположный. Команда меняет флаги AF, CF, OF, PF, SF и ZF.
mov ax, 1
neg ax ; AX = -1 = ffffh
mov bl, -128
neg bl ; BL = -128, OF = 1
Слайд 19

Команды умножения Для беззнакового умножения используется команда MUL: MUL Операнд, указываемый

Команды умножения

Для беззнакового умножения используется команда MUL:
MUL <операнд>
Операнд, указываемый в команде, – это

один из сомножителей. Он может быть регистром или ячейкой памяти, но не может быть непосредственным операндом.
Местонахождение второго сомножителя и результата фиксировано, и в команде явно не указывается.
Если операнд команды MUL имеет размер 1 байт, то второй сомножитель берётся из регистра AL, а результат помещается в регистр AX.
Если операнд команды MUL имеет размер 2 байта, то второй сомножитель берётся из регистра AX, а результат помещается в регистровую пару DX:AX.
Если операнд команды MUL имеет размер 4 байта, то второй сомножитель берётся из регистра EAX, а результат помещается в регистровую пару EDX:EAX.
Слайд 20

Команда меняет флаги CF и OF. Если произведение имеет такой же

Команда меняет флаги CF и OF.
Если произведение имеет такой же

размер, что и сомножители, то оба флага сбрасываются в 0.
Если же размер произведения удваивается относительно размера сомножителей, то оба флага устанавливаются в 1.
mov x, 256
mov ax, 105
mul x ; AX = AX * x, AX = 26880, CF = OF = 0
mov eax, 500000
mov ebx, 100000
mul ebx ; EDX:EAX = EAX * EBX, EDX:EAX = 50000000000, CF = OF = 1
Слайд 21

Знаковое умножение IMUL соответствует команде MUL – один из сомножителей указывается

Знаковое умножение

IMUL <операнд>
соответствует команде MUL – один из сомножителей указывается в команде,

второй должен находиться в регистре EAX/AX/AL, а результат помещается в регистры EDX:EAX/DX:AX/AX.
IMUL <операнд>, <непосредственный операнд>
позволяет указать регистр, который будет содержать один из сомножителей. В этот же регистр будет помещён результат. Второй сомножитель указывается непосредственно в команде.
IMUL <операнд1>, <операнд2>, <непосредственный операнд>
позволяет указать и результат, и оба сомножителя. Однако результат может быть помещён только в регистр, а второй сомножитель может быть только непосредственным операндом. Первый сомножитель может быть регистром или ячейкой памяти.
IMUL <операнд1>, <операнд2>
позволяет указать оба сомножителя. Первый должен быть регистром, а второй – регистром или ячейкой памяти. Результат помещается в регистр, являющийся первым операндом.
Слайд 22

Команда IMUL устанавливает флаги так же, как и команда MUL. Однако

Команда IMUL устанавливает флаги так же, как и команда MUL.
Однако расширение результата в

регистр EDX/DX происходит только при использовании первого варианта команды IMUL.
В остальных случаях часть произведения, не помещающаяся в регистр-результат, теряется, даже если в качестве результата указан регистр EAX/AX.
При умножении двух 1-байтовых чисел, произведение которых больше байта, но меньше слова, в регистре-результате получается корректное произведение.
mov eax, 5
mov ebx, -7
imul ebx ; EAX = ffffffdd, EDX = ffffffff, CF = 0
mov ebx, 3
imul ebx, 6 ; EBX = EBX * 6
mov ebx, 500000
imul eax, ebx, 100000 ; EAX = EBX * 100000, старшая часть результата теряется
mov eax, 55
imul eax, x ; EAX = EAX * x
Слайд 23

Команды деления DIV ; Беззнаковое деление IDIV ; Знаковое деление В

Команды деления

DIV <операнд> ; Беззнаковое деление
IDIV <операнд> ; Знаковое деление


В командах указывается только один операнд – делитель, который может быть регистром или ячейкой памяти, но не может быть непосредственным операндом. Местоположение делимого и результата для команд деления фиксировано.
Если делитель имеет размер 1 байт, то делимое берётся из регистра AX. Если делитель имеет размер 2 байта, то делимое берётся из регистровой пары DX:AX. Если же делитель имеет размер 4 байта, то делимое берётся из регистровой пары EDX:EAX.
Поскольку процессор работает с целыми числами, то в результате деления получается сразу два числа – частное и остаток.
Если делитель имеет размер 1 байт, то частное помещается в регистр AL, а остаток – в регистр AH.
Если делитель имеет размер 2 байта, то частное помещается в регистр AX, а остаток – в регистр DX.
Если же делитель имеет размер 4 байта, то частное помещается в регистр EAX, а остаток – в регистр EDX.
Слайд 24

mov ax, 127 mov bl, 5 div bl ; AL =

mov ax, 127
mov bl, 5
div bl ; AL =

19h = 25, AH = 02h = 2
mov ax, 127
mov bl, -5
idiv bl ; AL = e7h = -25, AH = 02h = 2
mov ax, -127
mov bl, 5
idiv bl ; AL = e7h = -25, AH = feh = -2
mov ax, -127
mov bl, -5
idiv bl ; AL = 19h = 25, AH = feh = -2
; x = a * b + c
mov eax, a
imul b
add eax, c ; Операнды команды сложения вычисляются слева направо
mov x, eax
; x = a + b * c
mov eax, b
imul c
add eax, a ; Операнды команды сложения вычисляются справа налево
mov x, eax
Слайд 25

Реализация программы ассемблерной вставкой В программе на языке С++, в момент

Реализация программы ассемблерной вставкой

В программе на языке С++, в момент когда

необходимо написать программный код на языке ассемблер, формируется вставка вида:
_asm
{
 // здесь код на ассемблере
 } 
Слайд 26

Например: int a=33, b=10, sum=0; _asm { mov eax,a add eax,

Например:

    int a=33, b=10, sum=0;     _asm     { mov eax,a    add eax,

b    mov sum, eax     }     printf(“a+b = %d ", sum);