140 likes | 329 Views
Сложни типове данни. Общ вид за деклариране на тип структура. Структура Всяко поле има отместване спрямо първия байт Размерът на структурата е сумата от размерите на полетата. име STRUCT [ изравняване:1,2 или 4 ] //Декларации на полета име ENDS. Пример за деклариране. student STRUCT 2
E N D
Сложни типове данни Общ вид за деклариране на тип структура • Структура • Всяко поле има отместване спрямо първия байт • Размерът на структурата е сумата от размерите на полетата имеSTRUCT[изравняване:1,2 или 4] //Декларации на полета имеENDS Пример за деклариране student STRUCT 2 name BYTE 31 DUP(?) ; отместване=0 score WORD ? ; отместване=32 year DWORD ? ; отместване=34 student ENDS
Сложни типове данни Пример за дефиниране на променливи и масиви от тип структура и достъп до полета • Структура ; Дефиниране на тип структура date STRUCT day BYTE ? month BYTE ? year WORD 2006 ; стойност по подразбиране date ENDS .DATA today date <22,4> ; променлива today:22-4-2006 a date <22,4,2006> ; променлива а: 22-4-2006 array date 20 DUP({26,3,2006}) ; масив от 20 структури mov al,today.day ; достъп до поле mov bx,OFFSET today ; BX <- адрес на today mov al,(date PTR[bx]).month ; индиректен операнд памет
Сложни типове данни Общ вид за деклариране на тип обединение • Обединение • Всички полета имат едно и също отместване • Размерът е равен на размера на най-дългото поле имеUNION[изравняване:1,2 или 4] //Декларации на полета имеENDS primer UNION a DWORD 00FFh ; начална стойност 00FFh b WORD ? c BYTE ? primer ENDS .DATA ex1 primer ; променлива с начална стойност 00FFh ex2 primer 52h ; променлива с начална стойност 5200h array primer 10 DUP({2}); масив от 10 обединения с начална ; стойност 2 Пример
Сложни типове данни Общ вид за деклариране на тип запис • Запис • Полетата на записа са последователност от битове • Основни операции за работа със записи: имеRECORD име_на_поле : широчина[=израз][,име_на_поле...] определя броя на битовете на запис или поле от запис WIDTH {име_на_поле/име_на_запис } MASK{име_на_поле/име_на_запис } връща маска от битове за поле от запис (или за цял запис), в която всички битове са със стойност 1, а останалите – с 0
Сложни типове данни • Запис ; Деклариране на тип запис ex1 RECORD a:1,b:3=2,c:4=9 ; брой битове=8 -> 00101001 ex2 RECORD a:2=2,b:1,c:3=2 ; брой битове<8 -> 00100010 ; Дефиниране на променливи –записи а ex1 <>;променлива без начални стойности ;за полетата b ex1 <1,3,8>;променлива с начални стойности за ;полетата Допълнение до 8
Сложни типове данни • Запис ;Операции със записи .DATA colorRECORDblink:1,back:3,intense:1,fore:3 mes color <1,5,1,1>; начална стойност 11011001 wblink EQU WIDTH blink ; широчина за поле blink=1 wback EQU WIDTH back ; широчина за поле back=3 wintense EQU WIDTH intense ; широчина за поле intense=1 wfore EQU WIDTH fore ; широчина за поле fore=3 .CODE mov ah,mes ;AH <- 11011001 ; Нулиране на полето back and ah,NOT MASK back ; AND 1000 1111 ; AH <- 1000 1001 ; Установяване на полето blink в 1 or ah,MASK blink ; OR 1000 0000 ; AH <- 1000 0001
Процедури Общ вид за дефиниране на процедура имеPROC [NEAR/FAR] ; Тяло на процедурата RET [константа]; връща управлението на адрес – върха на стека имеENDP • Общ вид за извикване • записва адрес на връщане в стека • 2) предава управлението callиме
Предаване на параметри Пример Определяне сумата на масив от числа с процедура • Чрез регистри ; Входни параметри: начален адрес на масива (ВХ)1/2 ; брой на елементи (СХ) ; Изходен параметър: сума (АХ) .DATA array BYTE 50 DUP(?) ; Масив от 50 байта sum WORD ? ; Променлива за резултата .CODE sumarPROC ;заглавен ред на процедура xor ax,ax ; нулиране на регистър за сума clc ; нулиране на флаг за пренос l1: add al,BYTE PTR[bx] ; прибавяне на пореден елемент adc ah,0 ; прибавяне на пренос inc bx ; указател към следващ байт loop l1 ; цикъл с брояч СХ ret ; връщане от процедура sumarENDP ; край на процедура
Предаване на параметри Пример Определяне сумата на масив от числа • Чрез регистри ; Входни параметри: начален адрес на масива (ВХ) 2/2 ; брой на елементи (СХ) ; Изходен параметър: сума (АХ) .STARTUP mov bx,OFFSET array ; ВХ <- начален адрес mov cx,LENGTHOF array ; СХ <- брой числа call sumar ; извикване на процедура mov sum,ax ; резултат sum=АХ . . .
Предаване на параметри Пример Определяне сумата на 3 двубайтови числа Входни параметри: 3 двубайтови числа Изходен параметър: сума (АХ) .DATA arg2 WORD 20 arg1 WORD 30 .CODE sumPROC NEAR push bp ; съхраняване на стара стойност на BP mov bp,sp ; ВР сочи към върха на стека mov ax,[bp+4] ; AX <- първи параметър add ax,[bp+6] ; събиране с втори параметър add ax,[bp+8] ; събиране с трети параметър pop bp ; възстановяване на ВР ret sumENDP ; Записване на параметрите в стека преди извикване mov ax,10 ; AX <- 10 push ax ; параметър3 се записва в стека push arg2 ; параметър2 се записва в стека push arg1 ; параметър1 се записва в стека call sum add sp,6 ; унищожаване на параметри • Чрез стека
Предаване на параметри • Чрез стека
Предаване на параметри • Чрез стека
Предаване на параметри • Деклариране на параметри с директива Атрибутите могат да бъдат: а) FAR/NEAR; b) смесено програмиране (С) имеPROC [атрибути] [USES с-к регистри,параметър:тип[,..]]
Предаване на параметри .DATA a1 WORD ? a2 WORD ? a3 WORD ? .CODE sumPROC NEAR,C arg1:WORD,arg2:WORD,arg3:WORD mov ax,arg1 ; използват се имената на параметрите add ax,arg2 ; а не отместването им add ax,arg3 ret ; автоматично извлича регистри sumENDP ; от стека и го освобождава ; Записване на параметрите в стека ; В езика С първи параметър се записва първи push a1 push a2 push a3 call sum • Деклариране на параметри с директива Процедура с параметри – стойностите на 3 числа Може да се извика от програма на С като функция, връщаща цяла стойност