Ассемблер тілі

200px|thumb|right**Ассемблер тілі** - машиналық тідің аналогы болып саналады. Ассемблер тілінде жазылған программа МП-р құрылысының ерекшеліктерін: жадтың ұйымдастырылуын, операндтарды адрестеу тәсілдерін, регистрлерді қолдану ережелерін анықтап, көрсету қажет. Әр МП-ң өзінің Ассемблері болады.

Ассемблер тілінде жазылған программа жад сегменттері деп аталатын жадблоктарының тобынан тұрады. Программа осындай бір немесе бірнеше блок-сегменттерден тұруы мүмкін. Әр сегмент программа кодының әр қатарында орналасқан сөйлемдерден құрылады.

Ассемблер тілінің сөйлемдері төрт түрлі болады:
#Командалар: машиналық кодтардың аналогтары. Бұл командалар трансляциялау кезінде МП-ң сәйкес командаларына түрленеді;
#Макрокомандалар: трансляциялау кезінде басқа сөйлемдерге алмасатын сөйлемдер;
#Дерективалар: ассемблер трансляторына орындалатын әрекеттер туралы түсінік береді, яғни қызметші ақпараттар жиыны. Дерективалар машиналвқ кодтарға түрленбейді;
#Комментарий: кез келген белгілерден тұрады.

Ассемблер тілінің екі артықшылығы бар:

Бұл тілдің көмегімен программаны МП командалары деңгейінде жазуға болады және сандық кодтардың барлығын еске сақтауды талап етпейді. Программа командалары жазылып болған соң, Ассемблер программасы шақырылады да, ол бұл командаларды олардың кодтарына айналдырады. Командалар жиыныннан тұратын программа негізгі не алғашқы программа деп аталады, ал негізгі программаның сандық кодтары, яғни машиналық тілге айналған түрі – объектік программа деп аталады.

Ассемблердің атқаратын негізгі қызметі – қолданушыға түсінікті негізгі прогрпмманы МП түсінетін объекттік программаға айналдыру. Ассемблердің кең тараған түрлері: IBM фирмасының MASM(Macro Assembler) программасы және Borland фирмасының TASM (Turbo Assembler) прграммасы.

## Ассемблер тілінде программа құру кезеңдері.

Ассемблер тілінде программа құру келесі кезеңдерден тұрады: 
#есептің қойылымы және программасының құрылымын анықтау;
#текстік редактордың көмегімен компьютерге программа командаларын енгізу;
#Ассемблердің көмегімен программаны трансляциялау;
#загрузчик (жадқа жүктеуші программа) көмегімен трансляцияланған программаны (сандық кодтарды) өздігінен орындалатын модульге айналдыру;
#программаны орындау;
#отладчиктің көмегімен программаны жүргізу.

2-ші кезеңде қолданылатын редактор ретінде WORD редакторінен басқа кез келген текстік редакторді қолдануға болады. Негізгі программа операторлар тізбегінен тұрады. Оператор ретінде Ассемблер тілінің командалары немесе псевдокомандалар қолданылады.

## Ассемблер тілінің синтаксисі, алфавиті. Тұрақтылар.

Программа сөйлемдерін (команда, макрокоманда, директива, коментарий) ассемблер трансляторы айқын анықтау үшін олар белгілі бір синтаксистік ережелерге сәйкес қалыптастырылуы тиіс.

Ассемблер тіліндегі әр команда 4 өрістен тұруы мүмкін.

Мысалы: `get: mov cx,di;` cx регистріне di регистрінің мәнін меншіктеу
Бұл жерде get белгіні білдіреді, `mov` – меншіктеу командасы, `cx, di` операндтарды білдіреді, ал; белгісінен кейін тұрған мәлімет – коментарий.

### Директивалар (Псевдокомандалар)
Директивалардвң (псевдокомандалардың) көмегімен сегменттер мен пройедураларды анықтауға, командалар мен мәліметтер элементтеріне ат беруге, жадтың жұмысшы аумақтарын анықтауға және т.с.с. әрекеттерді орындауға болады. Директивалардвң жазылу түрлері:

Жиі кездесетін директивалардың түрлері :
#SEGMENT ENDS – негізгі прграмманы сегменттерге бөледі, сегменттің басын және аяғын білдіреді. Сегмент түрлерін анықтау үшін ASSUME директивасы қолданылады. Оның жазылу түрі: Мұндағы, сегмент_регистрі – DS, CS, SS, ES сегмент регистрінің аты, : сегмент_аты – SEGMENT ДИРЕКТИВАСЫНДА КӨРСЕТІЛГЕН АТ.
#PROC ENDP  процедураның басын және соңын білдіреді. Процедура дегеніміз – программаның әр жерінде орындалатын командалардың тізбегі.

Ассемблер тілінде кездесетін тұрақтылардың түрлері:
#екілік сандық жүйесіндегі тұрақтылар: 0 және 1-ден тұратын сандар тізбегі. Тізбектің соңында В әрпі жазылады. Мысалы: 1011011В.
#орындық сандық жүйесіндегі тұрақтылар: 0+9 аралығында сандар. D әрпімен аяқталуы мүмкін. Мысалы: 927 не 927D.
#16-лық сандық жүйесіндегі тұрақтылар: 0+9 аралығында сандар, А+Ғ латын әріптері. Н әрпімен аяқталады. Алғашқы символ сан болуы тиіс. Мысалы: 1Е23Н.
#символдардың тұрақтылар – тырнақшаға алынып жазылған әріп, сан не символдар тізбегі.

Теріс сандарды енгізу үшін келесі тәсілдер қолданылады: егер сан ондық жүйеде болса, алдына минус белгісі қойылады, егер сан 2-лік не 16-лық жүйеде болса, оны толықтырғыш кодқа ауыстыру керек.

### Ассемблер тіліндегі мәндер түрлері

Мәндер өздерінің көлеміне байланысты келесі түрлерге бөлінеді:
#Байт - 8 бит
#Сөз – 2 байт, биттер (разрядтар) 0-ден 15-ке дейін нөмірленеді, нольдік разряды бар байт – кіші байт деп аталады., 15-ші разряды бар байт үлкен байт деп аталады.
#Қоз сөз – 4 байт-32 бит, үлкен сөз, кіші сөзден тұрады.
#Төрт сөз – 8 байт-64 бит, үлкен қос сөз, кіші қос сөзден тұрады.

Мәндер логика құрылысына байланысты келесі түрлерге бөлінеді:

1.таңбалы бүтін мән – 8, 16, 32 биттен тұратын екілік жүйедегі берілген таңбалы мән. Таңба белгісі 7, 15, 31 разрядтарда орналасады. Бұл разрядтардағы ноль саны мәннің теріс екенін білдіреді. Теріс сандар қосымша код арқылы беріледі.

Мәндердің берілу аралығы:
*8 разрядтық (1 байт) – 128-ден + 127-ге дейін
*16 разрядтық (2 байт) – 32768-ден + 32767 дейін
*32 разрядтық (4 байт) – 231 ден + 2 32 – 1

2.Таңбасыз бұтін мән – 8, 16, 32 биттен тұратын таңбасыз екілік жүйеде берілген мән. Мәндердің берілу аралығы:
*Байт – 0+255
*Сөз – 0+65535
*Қос сөз – 0+2 32 – 1

3.Жадты көрсету мәні 2 түрден тұрады:
*Жақын аралықтағы түрі – 32 разрядты логикалық адрес, сегменттің ығысу адресін көрсетеді.
*Алыс аралықтағы түрі – 48 разрядты логикалық адрес, 32 разрядтық ығысу адресінен және 16 разрядтық селектордан тұрады.
4.Тізбек – байт, сөз, қос сөзден тұрады, көлемі 4 Гбайт-қа дейін болуы мүмкін.

5.Разрядтық аумақ – разрядтарлың тізбегі.

## Ассемблер тілінің арифметикалық командалары

Арифметикалық командалар жиыны сандардың екі түрімен жұмыс істейді.
#Екілік бүтін оң және теріс сандар
#Бүтін ондық сандар.

Сандарды қосу командалары.

#ine ранд – инкремент амалы, яғни операнд мәнін 1-ге арттыру. Мысалы: ine bh – bh регистрінің мәнін 1-ге арттырады.
#add операнд 1, операнд 2  - қосу амалы. Нәтиже операнд 1-ге жазылады, яғни оп-д1=оп-д1+оп-д2
#ade оп-д 1, оп-д 2 – келесі разрядқа көшу жолаушысының (cf) нәтижесін қолданып қосу амалы. Нәтиже операнд 1-ге жазылады, яғни оп-д 1=оп-д 1+по-д 2+cf
Мысалы: 
`
:mov al, 01
:add al, 11
:adc ah, 1
`

Сандарды алу командалары 
#dec операнд – декремент амалы, яғни операнд мәнін 1-ге кеміту.
#sub операнд 1, операнд 2 – алу амалы, нәтиже операнд 1-ге жазылады.
#sbb операнд 1, операнд 2 – жоғарғы разрядтан алу негізінде алу амалы, нәтиже операнд 1-ге жазылады.
Мысалы:
`
:sub ax, ax; ax  ргистрін тазарту
:mov al, 0101 ; al регистріне 0101 санын енгізу
:sub al, 1010 ; al регистрінен 1010-ды алу
:neg al; модуль немесе санның қосымша коды.
`

Сандарды көбейту.
*Команданың жазылу түрі: `mul 1_көбейткіш [, 2_көбейткіш]`.

Мысалы:
`
:... ...
:sub ax, ax
:mov al, 25
:mul rez_1
:rez_1     db    45
`

Бұл команданың нәтижесінде нәтиженің жоғарғы үлкен бөлігі ah регистрінде, кіші бөлігі  al регистрінде орналасады.

Сандарды бөлу.
*Команданың жазылу түрі: `div бөлінгіш`.

Бөлінгіш жадта немесе регистрде орналасуы мүмкін және 8, 16, 32 разрядты болуы мүмкін. Нәтиже, яғни бөлінді al регистріне, қалдық ah регистріне орналасады.

Мысалы:
`
:del мәнін delt-қа бөлеміз
:... ...
:del            dw 29876 
:delt           db 45 
:sub           ax, ax 
:mov          ax, del
:div            delt
:... ...
`

Нәтижесінде al регистріне бөлінді, ah регистріне қалдық орналасады.

Mысал

1.47, 25 екі саны берілген. Оларды bh, bl 1 байтты регистрлеріне орналастырып, олардың қосындысын, айырмасын табу , 25 санын 5-ке көбейту, 47 санын 16-ға бөлу.
`
:text            segment ‘code’; (1) кодтар сегменті
:                  assume cs:text, ds: data; (2) сегмент регистрлерін               анықтау
:begin:       mov ax, data; (3) Мәндерді ds регистріне орналастыру
:                  mov ds, ax;     (4)
:                  sub bx, bx;      (5) bx регистрін тазарту
:                  mov bh, 47;     (6) bh регистріне 47 санын орналастыру
:                  mov bl, 25;      (7) bl регистріне 25 санын орналастыру
:                  add bh, bl;       (8) Екі санның қосындысын анықтап, нәтижені bh регистріне орналастыру
:                  mov dh, 47;     (9) dh регистріне47 санын орналастыру
:                  mov dl, 25;      (10) dl регистріне 25 санын орналастыру
:                  sub dh, dl;        (11) екі санның айырмасын анықтап, нәтижені dh регистріне орналастыру
:                  sub ax, ax;       (12) ax регистрін тазарту
:                  mov al, 25;       (13) al регистріне 25 санын орналастыру
:                  mul r1;              (14) 25 санын 5-ке көбейту, нәтиже ах регистрінде
:                  mov ax, 47;      (15) ах регистріне 47 санын орналастыру
:                  div r2;               (16)47 санын 16-ға бөлу, нәтижесі 
:                                             ах регистрін
:                  mov ax, 4c00h  (17) программаны аяқтау коды
:                  int 21 h;             (18) dos функциясын орындауға үзіліс жасау
:text            ends;                 (19) кодтар сегментінің соңы 
:data          segment;           (20) мәндер сегментінің басы
:r1              db 5;                   (21) 5-ті r1 – де байт ретінде анықтау
:r2              db 16;                 (22) 16-ны r2 – де байт ретінде анықтау
:data          ends;                  (23) мәндер сегментінің соңы
:                  endbegin;           (24) программа соңы
`

## Дереккөздер


Санат:Ақпараттану
Санат:Компьютерлік техника