104.05K
Category: programmingprogramming

Регистровая структура универсального микропроцессора

1.

Регистровая структура
универсального
микропроцессора

2.

Группы регистров:
• основные функциональные регистры;
• регистры процессора с плавающей точкой;
• системные регистры;
• регистры отладки и тестирования.
• Первые две группы регистров используются
прикладными программами, последние
две группы - системными программами,
имеющими наивысший уровень
привилегий.

3.

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

4.

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

5.

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

6.

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

7.

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

8.

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

9.

РОНы(32 бит)

10.

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

11.

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

12.

• TF (Trap Flag) — флаг пошагового режима
(используется при отладке).
• IF (Interrupt-enable Flag) — флаг разрешения
аппаратных прерываний.
• DF (Direction Flag) — флаг направления при
строковых операциях. Обозначает левое
или правое направление пересылки или
сравнения строковых данных.

13.

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

14.

Комментарии
• Комментарии в языке ассемблера
начинаются с символа «точка с запятой» и
могут начинаться как в начале строки, так и
после команды.

15.

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

17.

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

18.

Команда изменения знака
• 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 имеет размер 1 байт, то второй
сомножитель берётся из регистра AL, а результат помещается
в регистр AX.
• Если операнд команды MUL имеет размер 2 байта, то второй
сомножитель берётся из регистра AX, а результат помещается
в регистровую пару DX:AX.
• Если операнд команды MUL имеет размер 4 байта, то второй
сомножитель берётся из регистра EAX, а результат
помещается в регистровую пару EDX:EAX.

20.

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

22.

• Команда 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 <операнд> ; Знаковое деление
• В командах указывается только один операнд – делитель, который
может быть регистром или ячейкой памяти, но не может быть
непосредственным операндом. Местоположение делимого и
результата для команд деления фиксировано.
• Если делитель имеет размер 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 = 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, b
mov sum, eax
}
printf(“a+b = %d ", sum);

27.

Программа на nasm
section .text
global _start
;write our string to stdout
mov edx,len
mov ecx,msg
mov ebx,1
mov eax,4
int 0x80
;we must export the entry point to the ELF linker or
;loader. They conventionally recognize _start as their
;entry point. Use ld -e foo to override the default.
_start:
;section declaration
;third argument: message length
;second argument: pointer to message to write
;first argument: file handle (stdout)
;system call number (sys_write)
;call kernel
;and exit
mov ebx,0
;first syscall argument: exit code
mov eax,1
;system call number (sys_exit)
int 0x80
;call kernel
section .data
msg db
len equ
;section declaration
"Hello, world!",0xa ;our dear string
$ - msg
;length of our dear string
English     Русский Rules