300 likes | 517 Views
Регистров модел. Основни регистри Регистри с общо предназначение 31 0 . Регистров модел. Основни регистри Регистри с общо предназначение 15 8 7 0 Регистър за указател на инструкции 31 16 15 0.
E N D
Регистров модел • Основни регистри • Регистри с общо предназначение 31 0
Регистров модел • Основни регистри • Регистри с общо предназначение 15 8 7 0 • Регистър за указател на инструкции 31 16 15 0 старши байтмладши байт AH, BH, CH, DHAL, BL, CL, DL (AX, BX, CX, DX) [E]IPОтместване (OFFSET)
Регистров модел • Основни регистри • Сегментни регистри – предназначени са за начални адреси 15 0
Регистров модел • Основни регистри • Регистър на флаговете Битови полета за: • Управление на операции • Представяне на текущо състояние 31 16 15 0 [E]FLAGS
Регистров модел • Основни регистри • Регистър на флаговете Флагове за състояние • Бит 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)
Регистров модел • Системни регистри • 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 010111011010 <- 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)
Техники за адресиране • Адресиране в паметта • Изчислението на ДЕЙСТВИТЕЛЕН АДРЕС може да бъде: • Директно (абсолютно) Ако ds = 1000h, то изчислението на действителен адрес се извършва по следния начин: След преместване в ляво DS -> 0001 0000 0000 0000 0000 <- 10000 Offset -> 0010 0011 0100 0101 <- 2345 Действителен 0001 0010 0011 0100 0101 <- 12345 адрес мov ds:[2345h],ax ;Съдържанието на AX се премества в паметта
Техники за адресиране • Адресиране в паметта • Изчислението на ДЕЙСТВИТЕЛЕН АДРЕС може да бъде: • Индиректно (използва се винаги индексен оператор []) • Базово • Базово с отместване • Базово с индекс mov [bx],cl ;CL се премества на адрес ds*10h+bx mov cl,[bx+4] ;CL <- съдържанието от адрес ds*10h+bx+4 mov [bx+si],bp ;BP се премества на адрес ds*10h+bx+si
Техники за адресиране • Адресиране в паметта • Индиректно (използва се винаги индексен оператор[]) • Индексно с мащабиране • Базово – индексно с отместване mov [bx+2*si],ax ; AX се премества на адрес ds*10h+bx+2*si mov ax,[bp+8][si];Стек с начало BP+8 ;и индекс от SI се премества в AX
Техники за адресиране • Адресиране в паметта • Изчислението на ДЕЙСТВИТЕЛЕН АДРЕС може да бъде: • Стеково (използва се стека за безадресно обръщение) push cx ;Запис на CX в стека pop dx ;Четене от стека в DX
Дефиниране на данни price BYTE 1000 ;Константа, която може да сменя стойността си sum BYTE ? ;Променлива с неопределена начална стойност Константи и променливи Директиви за дефиниране на числени данни и инициализирането им
Дефиниране на данни Примери Z BYTE 0 ; Цяло без знак 0 в 1 байт A SBYTE –1 ; Цяло със знак -1 в 1 байт B WORD 2*3 ; Цяло без знак 6 в 2 байта C SWORD2*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 movah,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 байт . . . v WORD 0ABh ; v се инициализира с 2 байта mov bh, BYTE PTR v ; BH <- 1010 ;(т.е. първибайт=А) mov ch, BYTE PTR v+1 ; CH <- 1011 (т.е. втори байт=В) За целта се използва оператор PTR