Регистров модел I. Основни регистри Регистри с общо предназначение



Дата20.06.2017
Размер70.4 Kb.
#24005

Регистров модел

I. Основни регистри

  1. 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 )

 


  1. Указател на инструкция

31 16 15 0

 

 

[E]IP Отместване (OFFSET)

 

  1. Сегментни регистри – предназначени са за начални адреси

15 0

 

CS кодов сегмент (текущ за инструкции IP)

 

DS сегмент данни

 

SS стеков сегмент (за стекови операции - SP)

 

ES екстра сегмент (за низови операции)

 

FS допълнителен сегмент данни (i386)

 

GS допълнителен сегмент данни (i386)

 

  1. Регистър на флаговете

Битови полета за: Управление на операции

Представяне на текущо състояние

31 16 15 0



 

 

[E]FLAGS



  1. Флагове за състояние

Бит 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) – Препълване

 


  1. Управляващи флагове

Бит 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 машинна инструкция)

  • Директиви

  1. За данни

  2. За действия с Асемблер

 

Синтаксис на инструкция


Общ вид на асемблерна инструкция:

име операция операнди ; коментар

име – етикет или име на променлива или сегмент

операция – мнемонично име на инструкция или директива

операнди – обекти за действие

Имена: с начален символ (буква,_,$,@,.)

Константи – общ вид:

символи на числена система[суфикс]

Суфиксът може да бъде: 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

  • Адресиране на вход/изход

Входно/изходното пространство (т.нар. портове) могат да бъдат:

in al,40h ; Вход на байт в AL от фиксиран порт (адрес 40h)

out 20h,ax ; Изход на дума от AX към фиксиран порт (адрес 20h)

in ax,dx ; Вход на дума в AX от променлив порт (адреса му е в DX)


  • Адресиране в паметта

Изчислението на ДЕЙСТВИТЕЛЕН АДРЕС може да бъде:

  1. 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



адрес

  1. 2.      Индиректно (използва се винаги индексен оператор [])

  1. a.      Базово

mov [bx],cl ; CL се премества на адрес ds*10h+bx

  1. b.      Базово с отместване

mov cl,[bx+4] ; CL <- съдържанието от адрес ds*10h+bx+4

  1. c.       Базово с индекс

mov [bx+si],bp ; BP се премества на адрес ds*10h+bx+si

  1. d.      Индексно с мащабиране

mov [bx+2*si],ax ; AX се премества на адрес ds*10h+bx+2*si

  1. e.      Базово-индексно с отместване

mov ax,[bp+8][si];Стек с начало BP+8 и индекс от SI се премества в AX

  1. 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 (т.е. втори байт=В)


 


Съдържание

 


Сподели с приятели:




©obuch.info 2024
отнасят до администрацията

    Начална страница