Регистров модел 1. Регистри с общо предназначение
31 16 15 0
|
|
[E]AX Акумулатор (Аритметични операции, вход/изход)
|
|
|
[E]BX Базов регистър (указател на базов адрес)
|
|
|
[E]CX Брояч (на цикли, при преместване..)
|
|
|
[E]DX Данни (Резултати при *,/, номер на I/O порт)
|
|
|
[E]SI Индекс-източник (при низови операции)
|
|
|
[E]DI Индекс-приемник (при низови операции)
|
|
|
[E]BP Указател на база на стека
|
|
|
[E]SP Указател на върха на стека
|
15 8 7 0
старши байт младши байт
(AH,BH,CH,DH) (AL,BL,CL,DL)
( AX,BX,CX,DX )
-
Указател на инструкция
31 16 15 0
|
|
[E]IP Отместване (OFFSET)
|
-
Сегментни регистри – предназначени са за начални адреси
15 0
|
CS кодов сегмент (текущ за инструкции IP)
|
|
DS сегмент данни
|
|
SS стеков сегмент (за стекови операции - SP)
|
|
ES екстра сегмент (за низови операции)
|
|
FS допълнителен сегмент данни (i386)
|
|
GS допълнителен сегмент данни (i386)
|
-
Регистър на флаговете
Битови полета за: Управление на операции
Представяне на текущо състояние
31 16 15 0
-
Флагове за състояние
Бит 0: C (Carry Flag) – Пренос (заем)
Бит 2: P (Parity Flag) – Четност/нечетност (“1” при четен брой единици)
Бит 4: A (Auxilary Carry Flag) – Десетичен пренос
Бит 6: Z (Zero Flag) – Нулев резултат
Бит 7: S (Sign Flag) – Отрицателен резултат
Бит 11: O (Overflow Flag) – Препълване
-
Управляващи флагове
Бит 8: T (Trap/Trace Flag) – Стъпков режим
Бит 9: I (Interrupt Flag) – Прекъсване
Бит 10: D (Direction Flag) – 0 – автоинкрементиране (SI/DI)
1 – автодекрементиране (SI/DI)
II. Системни регистри
4 регистъра по 32 бита за управление на страници: CR0, CR1, CR2, CR3
4 сегментни адресни за сегментация
GDTR – Global Descriptor Table Register
IDTR – Interrupt Descriptor Table Register
LDTR – Local Descriptor Table Register
TR – Task Register
Сегментация на паметта
Регистрите за адресиране са от 16 бита. Следователно възможните адреси са:
от 0000 0000 0000 0000 2 до 1111 1111 1111 1111 2 или 64К
Адресиране до 1 МВ (20 бита) – Процес на сегментация
Сегментен адрес
(от сегментен регистър)
Действителен (абсолютен )адрес
Отместване (Offset)
(от регистри указатели и индекси)
след преместване в ляво
Segment -> 0011 1111 1000 0110 0000 <- 3F860
Offset -> 0000 0101 1101 1010 <- 05DA
Абсолютен 0011 1111 1110 0011 1010 <- 3FE3A
адрес
Сегментите започват на всеки 16 байта.
-
Инструкции ( 1 инструкция -> 1 машинна инструкция)
-
Директиви
-
За данни
-
За действия с Асемблер
Синтаксис на инструкция
Общ вид на асемблерна инструкция:
име операция операнди ; коментар
име – етикет или име на променлива или сегмент
операция – мнемонично име на инструкция или директива
операнди – обекти за действие
Имена: с начален символ (буква,_,$,@,.)
Константи – общ вид:
символи на числена система[суфикс]
Суфиксът може да бъде: B,O,D,H
Примери за имена и константи
0FF00h – константа в система с основа 16
FF00h – име
$as – име
765 – константа в система с основа 8
“текст” – константен символен низ
‘текст’ – константен символен низ
Оператори – в изрази, изчислявани по време на асемблиране
( за представяне на операнди)
Някои по-често използвани оператори:
-
Индекси: (), []
-
Атрибути на данни:
TYPE (тип), SIZE (размер), LENGTH (дължина), OFFSET (отместване), SEG (сегментен адрес), PTR (променя типа на израз)
-
Операции: +, - , * , / , MOD, SHL, SHR
-
Логически операции: EQ, NE, LT, LE, GT, GE
Операнди на инструкция – 0, 1, 2 или 3 операнда. Всеки може да бъде: 8, 16 или 32 бита.
Операндите могат да бъдат от следните три вида:
-
Регистри
-
Непосредствен
-
Памет
Техники за адресиране -
Неявно адресиране (без операнди)
sti ; Установява в “1” флаг за прекъсване
clc ; Нулира флага за пренос
-
Регистрово (операндите са в регистри)
аdd al,dl ;Събиране на регистрите AL с DL. Резултат -> в AL
-
Непосредствено (операндът е константа или променлива)
аnd al,0fh ; Отделяне на младшата тетрада
mov bx,OFFSET var; ; BX <- отместването на промеливата var
Входно/изходното пространство (т.нар. портове) могат да бъдат:
-
64К 8 битови
-
32К 16 битови
-
16К 32 битови
in al,40h ; Вход на байт в AL от фиксиран порт (адрес 40h)
out 20h,ax ; Изход на дума от AX към фиксиран порт (адрес 20h)
in ax,dx ; Вход на дума в AX от променлив порт (адреса му е в DX)
Изчислението на ДЕЙСТВИТЕЛЕН АДРЕС може да бъде:
-
1. Директно (абсолютно)
мov ds:[2345h],ax ; Съдържанието на AX се премества в паметта
Ако ds = 1000h, то изчислението на действителен адрес се извършва по следния начин:
след преместване в ляво
DS -> 0001 0000 0000 0000 0000 <- 10000
Offset -> 0010 0011 0100 0101 <- 2345
Действителен 0001 0010 0011 0100 0101 <- 12345
адрес
-
2. Индиректно (използва се винаги индексен оператор [])
-
a. Базово
mov [bx],cl ; CL се премества на адрес ds*10h+bx
-
b. Базово с отместване
mov cl,[bx+4] ; CL <- съдържанието от адрес ds*10h+bx+4
-
c. Базово с индекс
mov [bx+si],bp ; BP се премества на адрес ds*10h+bx+si
-
d. Индексно с мащабиране
mov [bx+2*si],ax ; AX се премества на адрес ds*10h+bx+2*si
-
e. Базово-индексно с отместване
mov ax,[bp+8][si];Стек с начало BP+8 и индекс от SI се премества в AX
-
3. Стеково (използва се стека за безадресно обръщане)
push cx ; Запис на CX в стека
pop dx ; Четене от стека в DX
Дефиниране на данни
Константи и променливи
price BYTE 1000 ; Константа, която може да сменя стойността си
sum BYTE ? ; Променлива с неопределена начална стойност
Директиви за дефиниране на числени данни и инициализирането им
BYTE (DB)
|
1 байт цяло от 0 до 255
|
WORD (DW)
|
2 байта цяло от 0 до 65535 (216-1)
|
DWORD (DD)
|
4 байта цяло от 0 до 232-1
|
FWORD (DF)
|
6 байта цяло за променливи указатели
|
QWORD (DQ)
|
8 байта цяло - с инструкциите на копроцесор 8087
|
TBYTE (DT)
|
10 байта цяло – с инструкциите на копроцесор 8087
|
Примери
Z BYTE 0 ; Цяло без знак 0 в 1 байт
A SBYTE –1 ; Цяло със знак -1 в 1 байт
B WORD 2*3 ; Цяло без знак 6 в 2 байта
C SWORD 2*3 ; Цяло със знак 6 в 2 байта
Long DWORD 12345678 ; Цяло без знак в 4 байта
Nbr DWORD 123400 ; Късо реално число = 1.234*105 в 4 байта
Array BYTE ?,?,? ; Масив от 3 последователни байта с
; неопределена стойност
ar1 WORD 1,2,5,10 ; Масив от четири последователни думи
t BYTE 5 DUP(?) ; Масив от 5 байта с неопределена стойност
d WORD 20DUP(0) ; Масив от 20 думи с нулеви стойности
m WORD 10DUP(5DUP(?)) ; Матрица от 10 реда, 5 колони
Директиви за дефиниране на символи и низове
star BYTE ‘*’ ; Записва ASCII кода на *
star1 BYTE “*” ; Записва ASCII кода на *
list BYTE “abcd” ; Низ до 255 символа
a1 BYTE ‘OK’ ‘;Записва в а1 4F6Bh
;(4F е кода на буква О, а 6B – на К)
a2 WORD ‘OK’ ; Записва в паметта 6B4Fh
a3 DW 1234h ; Записва в паметта 3412h,
; т.е. младши байт на по-нисък адрес
Обръщение към данни
listb BYTE 1,2,3,4,5 ; listb е адреса на 1 байт
mov ah,listb ; AH <- 1 т.е. първи байт
mov al,listb+1 ; AL <- 2 т.е. втори байт
listw WORD 10DUP(?) ; listw е адреса на първата двубайтова дума
mov ax,listw+4 ; AX <- третата дума
mov bx,listw[2] ; BX <- втората дума
Забележка: За езика С индексът винаги отговаря на позицията на елемента в масива. В Асемблер индексът е равен на брой байтове между елемента и началото на масива.
Примери за оператори за използване на атрибути на данни
LENGTH – брой на елементите данни в променлива, създадена от първата инициализираща стойност
LENGTHOF – брой на елементите данни
SIZE – брой байтове в променлива, създадена от първата инициализираща стойност
SIZEOF – брой байтове
niz BYTE ‘a’,’b’,’c’;
mov al,TYPE niz ; AL <-1
mov ah,LENGTH niz ; AH <- 1
mov ah,LENGTHOF niz ; AH <- 3
mov bl,SIZE niz ; BL <- 1 (TYPE*LENGTH)
mov bl,SIZEOF niz ; BL <- 3 (TYPE*LENGTHOF)
v WORD 50DUP(?)
mov ah,LENGTH v ; AH <- 50
mov al, SIZE v ; AL <- 100
Оператор PTR
-
Осигурява достъп до отделни байтове.
-
Важи само за числа без знак.
v WORD ?
mov bh,v ; грешка защото v е 2 байта, а bh – 1 байт
Затова се използва оператор PTR.
v WORD 0ABh ; v се инициализира с 2 байта
mov bh,BYTE PTR v ; BH <- 1010 (т.е. първи байт=А)
mov ch,BYTE PTR v+1 ; CH <- 1011 (т.е. втори байт=В)
Съдържание
Сподели с приятели: |