Асемблери - Теми 10, 11, 12, 13, 16, 27
| Информационни технологии | 2009-12-04 | 175 сваляния |
13.ООП реализация ...
Структура започва с директивата <име> STRUC <брой полета>. Пр.
S1 STRUC
A DB 0
B SW 10
S1 ENDS
.
STR S1 ;променлива STR от тип S1(декларация)
STR S1 <5,6> ; ако искаме да променим съдържанието на полетата
STR S1 < ,6> ;
Новите стоности са с по-висок приоритет. Достъп до полетата на структурата:1) чрез адрес LDA BX,STR в BX се записва първото поле; [BX].a достъп до първото поле; 2) Чрез името на структурата STR.a
Записи - <име> RECORD а:7 {име на поле}, b:9 {размер в битове}. Пр. REC R1; REC R1 <1,2> - ако се налага инициализация. WIDTH a връща дължина на полето {7}; МАСК а маскира останалите битове и връща само тези, които са записани в полето.
Таблици - <име>TABLE t_m, - полетата могат да бъдат :1) статични в момента на дефниране не се заделя памет; 2) виртуални в момента на дефиниране се заделя памет. Тези компоненти трябва да са предхождани от VIRTUAL. ПР.: f1 TABLE VIRTUAL tmp:WORD
16. Конкретизация на ...
Асемблерни програми се въвеждат предимно там, където се търси бързодействие, респективно при управление на хардуер. Те водят диалога с външните измервателни, управляващи устройства и евентуално четат в един буфер поредица от измервани стойности. Понататъшна математическа обработка на данни и извеждането на екрана или на печатащо устройство се извършва на език от високо ниво. За целта асемблерните програми се свързват в програми на езици от по-високо ниво и при изпълнението на тези програми се извикват от тях. Има два вида асемблерни програми. В най-простия случай програмата изпълнява само едно действие; тя нито изисква параметри от извикващата я главна програма, нито връща такива. В другия случай асемблерната програма получава данни от програма от език на високо ниво и/или връща резултати от свои операции на тази програма. Програми от този тип са по- трудни за програмиране ,тъй като няма единна концепция за предаването на данни. Независимо от използвания вид на предаване наи-напред трябва да се узнае с колко байта ще се съхраняват отделните типове числа и с колко байта ще бъдат подавани адресите на параметрите. При микропроц. фамилии 8088-80х86 и Pentium всеки физически адрес в паметта се изчислява от един 16 битов базов адрес (сегментен адрес) и едно 16 битово отместване(offset). Често асемблерната програма използва същия сегмент от данни както и език от високо ниво- дълъг максимално 64 КВ. По принцип асемблерни програми трябва да се пишат като процедури. Някои езици от високо ниво правят възможно дирекното въвеждане на инстр. на процесора в шестнайсетичен код.
Връзка CPP-ASM: За правилна връзка, от страна асемблер е нужно: 1) коректно установяване на име на сегмент; атрибути на сегмент; директива .MODEL; 2) съответствие между PUBLIC и EXTERN. 3) коректно построяване на локална база, след което се декрементира SP с число. С положително отместване спрямо BP се прави достъп до параметрите, а с отрицателно достъп до пространството. 4) съхраняване в стека на регистрите, които ще се модифицират. 5) в края на асемблерската програма се правят обратните неща. Завършва с return или ret n в зависимост от конвекцията на извикване.
12. Разделно комп
Средства за асемблиране и свързване: На етапа на свързване трябва да има съответствие между имената и типовете. 1) Единен даннов сегмент данните които ще се използват във всички модули се структурират в един. Трябва да се декларират с PUBLIC или EXTERN. При използването на EXTERN трябва да се добави и типа. EXTERN са имената, които се срещат във всички модули. EXTERN и PUBLIC могат да са на глобално ниво или в рамките на сегмент. При втория вариант, търсенето е само в едноименни сегменти; 2) Сегментната база не е известна по име зареждането става чрез: mov ax, seg var1 директивата seg извлича съдържаннието на сегмента в който е променливата. mov es, ax | mov bx, es:var1 така се осъществява достъп до var1. 3) чрез фиктивен достъп имената са общи. Дефинират се два сегмента единия е за лични локални данни, а другия е фиктивен. Той съдържа само декларации EXTERN, а не дефиниции данните са дефинирани на друго място. 4) С общи имена на процедури съответствие се дефинира чрез PUBLIC и EXTERN. Свързване на модул, написан на асемблер и ЕВН. Моделите памет, в които се извършва компилацията, определят имената на сегметите. За всеки модел памет име определени имена на сегменти и техните атрибути. В езика Си компилатора разделя данните на инициализирани, стекови и др. Прави се разделяне по групи.
10. Процедури..
<име> PROC указване къде започва тялото на програмата. (NEAR, FAR); NEAR означава, че извиканата и извикващата програма са в един и същи сегмент; FAR тялото на процедурата е в друг сегмент. RET управлението се връща в точката на извикване; ENDP край на процедурата.
Механизми за предаване на параметри: 1) чрез регистър броя параметри е ограничен; 2) чрез глобални променливи влизат в действие директивите PUBLIC I EXTERN. В главната програма трябва с PUBLIC да укажем на асемблера към кои параметри може да се използват извън рамките на главната програма. Чрез EXTERN записана в извикваната програма посочваме имената и типа на параметрите, които ще използваме отвън; 3) чрез стек в главната програма записваме в стека променливите, чрез PUSH BP; MOV BP, SP замразяваме текущото съдържание на стека и създаваме локална база. В СИ се извършва в самата процедура, а в Pascal в извикващата програма. Адреси на променливите BP+offset Първия параметър е записан в младшия адрес Си конвенция. В Pascal първия параметър е записан в старшия адрес. Обратната процедура епилог е възстановяване на предишното съдържание на BP. 4) чрез директивата ARG <</SPAN>argument> - списък параметри. Всеки аргумент може да е представен по три начина: 1) чрез име name; 2) чрез име и тип name:type 3) чрез име, тип и брой name:type:count
11. Оператори и изрази. 1) Операции за събиране: ADD- зададените операции се сумират в допълнителен код ADD AX,BX прибавя се съдържанието на регистъра BX към съдържанието на AX и резултата се записва в AX. Инстукции ADC (Add with Carry- събиране с пренос) същата като инстр. ADD с тази разлика че при сумирането се включва и стойността на флага за пренос, ако флагът е единица резултатът от изпълнението на ADC е с единица по-голям от изпълнението на ADD. Ако флагът е нула- резултатите са равни. Операции за изваждане: SUB и SBB имат аналогично действие с инстр. за събиране при изваждането флаговете се установяват в съответствие с резултата като флагът за пренос отразява наличието на заем. SUB AX,BX- изважда се стойността на BX от АХ и се записва резултата в AX. Аритметични действия с един операнд: Инстр. NEG е инструкция за смяна на знака на операнда. Операндът може да е с дължина един байт или една дума. С тази инстр. се сменя знака на операнда, който е представен в допълнителен код. INC- придава единица към стойността на операнда. DEC- изважда единица от стойността на операнда. Всяка от инстр. от един операнд може да има като оперант стойност един байт или една дума. Ако в една от тези инстр. е зададена клетка от паметта чрез не пряко адресиране, например [BX+SI]. Асемблерът има нужда от допълнителна информация. Той трябва да знае дължината на операнда от паметта за да може да използва правилния код на операцията. За описване на операнда се използват модификаторите BYTE PTR и WORD PTR. ; <тип> PTR A оператор за преобразуване на тип. За текущата операция А се представя в типа, посочен пред оператора. LENGTH А оператор, който връща броя единици памет, които са заделени за променливата A; TYPE A връща типа на променливата като цяло число. SIZE връща произведението на единиците памет по размера; HIGH A връща старшите 8 бита (при 16 битова променлива); LOW A връща младшите 8 бита; OFFSET A връща отместването на A. Инструкция за сравняване: CMP- сравнява две стойности като ги изважда една от друга. Регистъра на състоянието се установява в зависимост от резултата от изваждането като самия резултат не се запомня. Инструкцията променя само флаговете. Инструкции за корекции на резултата: DAA- десетична корекция при събиране; DAS- при изваждане. Използват се само при операции с числа в BCD код в пакетиран формат. Инструкции при ASCII корекция при събиране и изваждане: ААА- корекция при събиране която преобразува резултата в правилно не пакетирано представяне. ААS- при изваждане. Инструкции за умножение и деление: MUL- умножение на цели числа без знак и IMUL- цели числа със знак; DIV- деление на двоични числа без знак и IDIV- със знак. И двата типа инстр. за умножение и деление са операции с двоични числа представени в допълнителен код.
27. Управление на паметта в win32. Една програма може да има повече от един процес. В win95 долните 2Gb са общи за процеса, а горните за процесите в глобалното линейно пространство. Има относителна изолация, съществува опастност при срив в процес да се разпространи срива и към другите процеси. В NT и горните и долните са защитени от достъп. SWAP файл: Общ за всички процеси, структурира се от средата и се използва от механизма VirtualMenuMenager за прехвърляне от и към HDD. В Wind95 е голям, в NT са множство малки. Глобални данни: Win95 прави отделно копие от тях за всеки прозорец, NT поддържа общо копие, но промените се извършват в отделно копие, собствено за процеса, което прави размяната. Виртуалния адрес не се променя за програмата, въпреки, че е на друго място, т.е. по-пестеливо е в NT. Heap: Наследен е от 16 бита. GlobalAlloc, въпреи, че тук не съществуват глобални heap, GlobalAlloc вика стандарната HeapAlloc, връща handle към глоблната памет от тип Hglobal, както при 16 бита, но тук се работи с адреси. С тази функция пак се стига до адреса, но първо средата конструира таблица с handle и т.н. Тъй като работим с виртуални адреси, можем да включим към виртуалното адресно пространство даден файл. Така за голям период от време можем да спестим блокирането на RAM. Файла се качва само ако се извърши промяна (запис и т.н.) С това се занимава Virtual Memory Manager.
Тагове от реферата: асембери, реаия, руктура, STRUC, Директива, променлива











