200 likes | 380 Views
Организиране на сегменти. Физически сегмент – блок от паметта с фиксиран размер (64 КВ за 16 разредни процесори и 4 GB за 32 разредни процесори). Логически сегмент – блок от паметта с променлива дължина за програма или данни За малки програми Инструкции -> в 1 сегмент
E N D
Организиране на сегменти • Физически сегмент– блок от паметта с фиксиран размер (64 КВ за 16 разредни процесори и 4 GB за 32 разредни процесори). • Логически сегмент– блок от паметта с променлива дължина за програма или данни За малки програми Инструкции -> в 1 сегмент адресират се с 16 разрядно отместване (OFFSET)спрямо началото на сегмента Данни -> в 1 сегмент
Организиране на сегменти За големи програми Инструкции -> в 1 или повече сегмента адресират се със сегментен адрес (SEG) и отместване (OFFSET) Данни -> в 1 или повече сегмента
Организиране на сегменти • Опростени сегменти директиви • Скриват подробности за дефинираните сегменти • Дефиниране на модел . MODELмодел_на паметта[отдалеченост на стека] NEARSTACK (по подразбиране) – стек+данни -> в 1 сегмент FARSTACK – отделен сегмент за стека
Организиране на сегменти • Опростени сегменти директиви • Дефиниране на модел
Организиране на сегменти • Опростени сегменти директиви • Дефиниране на модел • NEAR: Адресирането се извършва само с 16-разрядно отместване • FAR: Адресирането се извършва чрез: сегментен адрес : отместване • Създаване на стек • Създаване на сегмента на данни . STACK [размер] ; по подразбиране размер=1КВ .DATA; създава близък сегмент с обем до 64КВ ; от всички модули и име _DATA Близки данни
Организиране на сегменти • Опростени сегменти директиви • Създаване на сегмента на данни • Създаване на сегмента на инструкции .FARDATA [име] ; създава отдалечен сегмент с ; посоченотоиме или с име FAR_DATA Отдалечени данни .CODE [име] ; дефинира началото на сегмент с ; посоченото имеили с име_TEXT
Организиране на сегменти • Опростени сегменти директиви • Започване на програма и завършване на програма (само за главна програма) • Директива за край на всеки модул .STARTUP; генерира инструкции за започване на програма ; зарежда автоматично сегментните регистри .EXIT [израз] ; генерира инструкции за завършване на ; програма и евентуално връщане на израз END
Организиране на сегменти • Опростени сегменти директиви .MODEL SMALL .STACK ; по подразбиране стек от 1КВ .DATA ; дефиниране на данни . . . .CODE .STARTUP ;генерира инструкции за ;зарежданена сегментни регистри ; инструкции . . . .EXIT END Сегментните регистри: CS (за инструкции), DS (за данни), SS (за стек) се инициализират с адресите на сегментите по подразбиране в началото на програмата
Организиране на сегменти • Пълни сегменти директиви • Осъществяват пълен контрол върху дефинираните сегменти. • Дефиниране на сегменти имеSEGMENT [граница за нов] [READONLY][комбиниране][размер][клас] . . . . . . имеENDS Параметрите показват как да се изградят и обединят сегментите.
Организиране на сегменти • Пълни сегменти директиви • Дефиниране на сегменти • Параметри • Граница за нов сегмент: BYTE, WORD,.. • Комбиниране: PRIVATE (няма обединение на сегменти от други модули), PUBLIC (при еднакви имена се поставят в общ сегмент), COMMON (припокриване на сегменти), STACK (с еднакви имена -> общ стеков сегмент) • Размер: USE16, USE32
Организиране на сегменти • Пълни сегменти директиви • Свързване на сегментен регистър със сегментен адрес (името на сегмента) ASSUME сегментен_регистър : име_на_сегмент [, сегментен р-р : име_на_сегмент] . . . ASSUMEсегментен_регистър : NOTHING; отменя свързване
Организиране на сегменти • Пълни сегменти директиви sts SEGMENT STACK WORD 32DUP(?) sts ENDS dts SEGMENT ; дефиниране на данни dts ENDS cds SEGMENT ASSUME CS:cds,SS:sts,DS:dts ;Инструкции cds ENDS END Пример
Близки и далечни адреси • На кода – при сегментен адрес в CS • Близки: Процесорът променя брояча на адресите IP, но не променяCS. • Далечни: Процесорът променя IPи CS. call my ; извикване на подпрограма my е в сегмента на call -> близък код my е в друг сегмент -> далечен код
Близки и далечни адреси • На данните – при сегментни адреси в DS и SS • Всички отмествания са спрямо адрес в DS с изключение на адресирането чрез BPи SP var WORD 50 .CODE . . . mov ax,var ; Втори операнд DS:var mov di,[bx] ; Втори операнд DS:[bx] mov [bp+6],ax ; Първи операнд SS:[bp+6]
Близки и далечни адреси • На данните – при сегментни адреси в DS и SS • При далечен сегмент на данните (.FARDATA) mov ax,SEG var ; var е променлива от отдалечен сегмент mov es,ax ; ES сочи към далечни данни mov ax,es:var ; достъп 1 до var ; достъп 2 до var ASSUME es:SEG var mov ax,var
Достъп до данни чрез адреси и указатели • Далечен адрес: адрес на променлива, дефинирана в отдалечен сегмент за данни. • Далечен указател: променлива, съдържаща Сегментен адрес + Отместване • Близък указател: променлива, съдържаща само Отместването
Достъп до данни чрез адреси и указатели Дефиниране на указатели list BYTE 100DUP(?) ; Масив от 100 байта ptr_nearWORD list ; Близък указател към list ;(2 байта отместване) ptr_farDWORD list ; Далечен указател към list (4 байта) ; сегментен адрес : отместване ASSUME bx:PTR WORD ;bx се дефинира като ;указател къмдума
Достъп до данни чрез адреси и указатели Дефиниране на указатели NPBYTETYPEDEF NEAR PTR BYTE ; тип за близък указател FPBYTETYPEDEF FAR PTR BYTE ; тип за далечен указател msg BYTE “Това е низ” . . . nps NPBYTE msg ; близък указател към низа fps FPBYTE msg ; далечен указател към низа дефиниране на указатели по време на асемблиране
Достъп до данни чрез адреси и указатели Операции с указатели msg1 BYTE “Първи низ” msg2 BYTE “Втори низ” npmsg NPBYTE ? ; Дефиниране на близък указател fpmsg FPBYTE ? ; Дефиниране на далечен указател ; Близък указател <- отместване mov npmsg,OFFSET msg1 . . . ; Далечен указател <-сегмент:отместване movWORDPTR fpmsg[0],OFFSET msg2 mov WORDPTR fpmsg[2],SEG msg2 Инициализиране и зареждане на указатели с адрес по време на изпълнение
Достъп до данни чрез адреси и указатели Операции с указатели buf1 FPBYTE ? ; Далечен указател към байтове buf1 buf2 FPBYTE ? ; Далечен указател към байтове buf2 mov ax,WORDPTR buf1[0] ; Копира се mov WORDPTR buf2[0],ax ; отместването mov ax,WORDPTR buf1[2] ; Копира се mov WORDPTR buf2[2],ax ; сегментен адрес Копиране на стойността на един указател в друг