Командната структура на асемблерски јазик содржи: Општи карактеристики на командниот систем на јазикот Assembler за IBM-PC (основен сет на команди, основни методи за адресирање на операнди). Структура на програмата во асемблер јазик. Програмски сегменти. претпостави директива

Тема 1.4 Склопна мнемоника. Структура и формати на команди. Видови на адресирање. Микропроцесорски инструкциски систем

План:

1 Асамблерски јазик. Основни концепти

2 Симболи на асемблерски јазик

3 Видови на асемблер искази

4 Директиви на Собранието

5 Инструкциски систем на процесорот

1 Јасасемблерски јазик. Основни концепти

асемблерски јазике симболична претстава на машинскиот јазик. Сите процеси во машина на најниско хардверско ниво се управувани само со команди (инструкции) на машинскиот јазик. Од ова е јасно дека, и покрај заедничкото име, јазикот на склопување е различен за секој тип на компјутер.

Програма за асемблерски јазик е збирка мемориски блокови наречени мемориски сегменти.Програмата може да се состои од еден или повеќе такви блок-сегменти. Секој сегмент содржи збирка јазични реченици, од кои секоја зафаќа посебна линија на програмски код.

Постојат четири типа на асемблер изјави:

1) команди или инструкции кои се симболични аналози на машинските инструкции. За време на процесот на преведување, инструкциите на асемблерот се претвораат во соодветните команди на множеството инструкции на микропроцесорот;

2) макро команди -реченици од програмскиот текст, форматирани на одреден начин, заменети за време на емитувањето со други реченици;

3) директиви,кои се инструкции за асемблер-преведувачот да изврши одредени дејства. Директивите немаат колеги во машинското претставување;

4) линии за коментари , кој содржи какви било симболи, вклучително и букви од руската азбука. Коментарите се игнорирани од преведувачот.

­ Структура на програмата на собранието. Синтакса на собранието.

Речениците што ја сочинуваат програмата може да бидат синтаксички конструкт што одговара на команда, макро, директива или коментар. За да може асемблер-преведувачот да ги препознае, тие мора да се формираат според одредени синтаксички правила. За да го направите ова, најдобро е да користите формален опис на синтаксата на јазикот, како правилата на граматиката. Најчестите начини за опишување на програмски јазик на овој начин - синтаксни дијаграмиИ продолжени Backus-Naur форми.За практична употребапоудобно синтаксни дијаграми.На пример, синтаксата на асемблер речениците може да се опише со користење на синтаксни дијаграми прикажани на следните слики 10, 11, 12.

Слика 10 - Формат на собраниска реченица


­ Слика 11 - Формат на директивата

­ Слика 12 - Формат на команди и макроа

На овие слики:

­ име на етикетата- идентификатор чија вредност е адресата на првиот бајт од реченицата во изворниот текст на програмата што ја означува;

­ Име -Идентификатор што ја разликува оваа директива од другите директиви со исто име. Како резултат на обработката на одредена директива од страна на асемблерот, на тоа име може да му се доделат одредени карактеристики;

­ оперативен код (OPC) и директива - ова се мнемоници за соодветната машинска инструкција, макроинструкција или директива за преведувач;

­ операнди -делови од команда, макро или асемблер директива кои ги означуваат објектите на кои се извршуваат дејствата. Операндите на асемблерски јазик се опишуваат со изрази со нумерички и текстуални константи, ознаки и идентификатори на променливи користејќи знаци на оператор и некои резервирани зборови.

Синтаксните дијаграми помагаат најдете и потоа следете ја патеката од влезот на дијаграмот (лево) до неговиот излез (десно). Ако постои таква патека, тогаш реченицата или конструкцијата е синтаксички точна. Ако не постои таква патека, тогаш компајлерот нема да ја прифати оваа конструкција.

­ 2 Симболи на асемблерски јазик

Прифатливи знаци при пишување текст на програмата се:

1) Сите писма: А-З,a-z. Во овој случај, големите и малите букви се сметаат за еквивалентни;

2) броеви од 0 пред 9 ;

3) знаци ? , @ , $ , _ , & ;

4) сепаратори , . () < > { } + / * % ! " " ? = # ^ .

Изјавите на асемблерски јазик се формираат од лексема, кои се синтаксички неразделни низи од валидни јазични симболи кои имаат смисла за преведувачот.

Лексемисе:

1) идентификатори - секвенци од валидни знаци кои се користат за претставување на објекти на програмата како што се оптички кодови, имиња на променливи и имиња на етикети. Правилото за пишување идентификатори е следново: идентификаторот може да се состои од еден или повеќе знаци;

2) низи од ликови - секвенци од знаци затворени во единечни или двојни наводници;

3) цели броеви во еден од следните нумерички системи : бинарен, децимален, хексадецимален. Идентификацијата на броевите при нивното пишување во асемблер програми се врши според одредени правила:

4) децималните броеви не бараат да се идентификуваат никакви дополнителни знаци, на пример 25 или 139. За идентификација во изворниот текст на програмата бинарни броевиОткако ќе ги запишете нулите и оние што ги сочинуваат, потребно е да се стави латиницата „ б“, на пример 10010101 б.

5) Хексадецималните броеви имаат повеќе конвенции кога ги пишуваат:

Прво, тие се состојат од броеви 0...9 , мали и големи букви од латинската азбука а,б, в,г,д,ѓили А,Б,В,Д,Е,Ф.

Второ, преведувачот може да има потешкотии да препознае хексадецимални броеви поради фактот што тие можат да се состојат само од цифри 0...9 (на пример, 190845) или да започнат со буква од латинската азбука (на пример, еф15). За да му „објасни“ на преведувачот дека дадениот токен не е децимален број или идентификатор, програмерот мора да го означи хексадецималниот број на посебен начин. За да го направите ова, на крајот од низата хексадецимални цифри што сочинуваат хексадецимален број, напишете ја латинската буква „ ч" Ова е задолжително. Ако хексадецимален број започнува со буква, тогаш пред него се пишува првата нула: 0 еф15 ч.

Речиси секоја реченица содржи опис на предмет на кој или со помош на кој се врши некое дејство. Овие предмети се нарекуваат операнди. Тие можат да се дефинираат вака: операнди- тоа се објекти (некои вредности, регистри или мемориски ќелии) на кои дејствуваат инструкциите или директивите или тоа се објекти кои го дефинираат или појаснуваат дејството на инструкциите или директивите.

Можно е да се класифицираат операндите на следниов начин:

­ константни или непосредни операнди;

­ адресни операнди;

­ подвижни операнди;

бројач за адреси;

­ регистарски операнд;

­ базни и индексни операнди;

­ структурни операнди;

рекорди.

Операндите се елементарни компоненти кои се дел од машинската инструкција која ги означува објектите на кои се изведува операција. Во поопшт случај, операндите може да се вклучат како компоненти во посложени формации наречени изрази.

Изрази се комбинации на операнди и оператори кои се разгледуваат како целина. Резултатот од оценувањето на изразот може да биде адресата на некоја мемориска ќелија или некоја константна (апсолутна) вредност.

­ 3 Видови на асемблер искази

Да ги наведеме можните типови асемблер оператории синтаксички правила за формирање на асемблер изрази:

­ аритметички оператори;

­ оператори на смена;

­ споредбени оператори;

­ логички оператори;

­ индекс оператор;

­ оператор за редефинирање на типот;

­ оператор за надминување на сегментот;

­ оператор за именување на типот на структура;

­ оператор за добивање на сегментна компонента на адреса на израз;

­ оператор за добивање на поместување на израз.

1 Директиви на собранието

­ Постојат директиви за асемблер:

1) Директиви за сегментирање. Во текот на претходната дискусија ги дознавме сите основни правила за пишување инструкции и операнди во програма за асемблерски јазик. Останува отворено прашањето како правилно да се форматира низата наредби за да може преведувачот да ги обработи, а микропроцесорот да може да ги изврши.

Кога ја разгледувавме архитектурата на микропроцесорот, дознавме дека има шест сегментни регистри преку кои може истовремено да работи:

­ со еден код сегмент;

­ со еден оџак сегмент;

­ со еден податочен сегмент;

­ со три дополнителни податочни сегменти.

Физички, сегмент е мемориска област окупирана од инструкции и (или) податоци, чии адреси се пресметуваат во однос на вредноста во соодветниот регистар на сегменти. Синтаксичкиот опис на сегмент во асемблерот е конструкцијата прикажана на Слика 13:


­ Слика 13 - Синтаксички опис на сегмент во асемблер

Важно е да се забележи дека функционалноста на сегментот е нешто поширока од едноставно делење на програмата на блокови од код, податоци и стек. Сегментацијата е дел од поопшт механизам поврзан со концептот на модуларно програмирање.Тоа вклучува обединување на дизајнот на објектните модули создадени од компајлерот, вклучувајќи ги и оние од различни програмски јазици. Ова ви овозможува да комбинирате програми напишани на различни јазици. Операндите во директивата SEGMENT се наменети да имплементираат различни опции за таква унија.

2) Директиви за управување со котација. Директивите за управување со котација се поделени во следниве групи:

­ општи упатства за управување со котација;

­ директиви за наведување на вклучени датотеки;

­ директиви за излез на условни склопувачки блокови;

­ директиви за прикажување на макро команди во списокот;

­ директиви за прикажување информации за вкрстени референци во огласот;

­ директиви за промена на форматот на котација.

2 Процесорски инструкциски систем

Командниот систем на процесорот е прикажан на слика 14.

Ајде да ги погледнеме главните групи на команди.

­ Слика 14 - Класификација на инструкции за асемблер

Тимовите се:

1 Команди за пренос на податоци. Овие инструкции заземаат многу важно место во множеството инструкции на кој било процесор. Тие ги извршуваат следниве основни функции:

­ складирање на содржината на внатрешните регистри на процесорот во меморијата;

­ копирање содржина од една мемориска област во друга;

­ пишување и читање од I/O уреди.

На некои процесори, сите овие функции се извршуваат со една единствена инструкција MOV (за пренос на бајти - MOVB ) но со различни методи за адресирање на операнд.

Во други процесори покрај командата MOV Има уште неколку команди за извршување на овие функции. Командите за пренос на податоци, исто така, вклучуваат команди за размена на информации (нивното именување се заснова на зборотРазмена ). Информациите може да се разменуваат помеѓу внатрешни регистри, помеѓу две половини од еден регистар ( SWAP ) или помеѓу регистар и мемориска ќелија.

2 Аритметички наредби. Аритметичките инструкции ги третираат кодовите на операндот како нумерички бинарни или BCD кодови. Овие команди може да се поделат во пет главни групи:

­ инструкции за операции со фиксна точка (собирање, одземање, множење, делење);

­ инструкции со подвижна запирка (собирање, одземање, множење, делење);

­ команди за чистење;

­ команди за зголемување и намалување;

­ команда за споредба.

3 Инструкциите со фиксна точка ги третираат кодовите во процесорските регистри или меморијата како да се нормални бинарни кодови. Инструкциите со подвижна запирка (точка) користат формат за претставување на броеви со експонент и мантиса (обично овие броеви зафаќаат две последователни мемориски ќелии). Во модерната моќни процесориМножеството инструкции со подвижна запирка не е ограничено на само четири аритметички операции, туку содржи и многу други посложени инструкции, на пример, пресметка на тригонометриски функции, логаритамски функции, како и сложени функции неопходни за обработка на аудио и слика.

4 Чистите инструкции се дизајнирани да напишат нулта шифра на регистар или локација во меморијата. Овие команди може да се заменат со команди за нула код, но специјалните јасни команди обично се побрзи од командите за напред.

5 Наредби за зголемување (зголемување за еден) и намалување

(се намалува за еден) се исто така многу погодни. Тие во принцип може да се заменат со инструкции за додавање-еден или одземање-еден, но зголемувањето и намалувањето се побрзи од собирањето и одземањето. Овие инструкции бараат еден влезен операнд, кој исто така е излезен операнд.

6 Инструкцијата compare се користи за споредба на два влезни операнди. Во суштина, тој ја пресметува разликата помеѓу овие два операнди, но не генерира излезен операнд, туку само ги менува битовите во регистарот за статус на процесорот врз основа на резултатот од ова одземање. Инструкцијата што ја следи инструкцијата за споредување (обично инструкција за скок) ќе ги испита битовите во статусниот регистар на процесорот и ќе изврши дејства врз основа на нивните вредности. Некои процесори обезбедуваат инструкции за споредување на синџири на две секвенци на операнди лоцирани во меморијата.

7 Логички команди. Логичките инструкции вршат логички (битни) операции на нивните операнди, односно ги третираат шифрите на операндите не како единечен број, туку како збир на поединечни битови. Вака се разликуваат од аритметички инструкции. Логичките команди ги извршуваат следните основни операции:

­ логички И, логички ИЛИ, модуло за собирање 2 (Ексклузивно ИЛИ);

­ логички, аритметички и циклични поместувања;

­ проверка на битови и операнди;

­ поставување и бришење битови (знамиња) од регистарот за статус на процесорот ( PSW).

Инструкциите за логички операции ви овозможуваат да ги проценувате основните логички функции малку по малку од два влезни операнди. Дополнително, операцијата И се користи за присилно бришење на одредени битови (како еден од операндите, се користи код за маска во кој битовите што бараат расчистување се поставени на нула). Операцијата ИЛИ се користи за присилување на наведените битови да се постават (како еден од операндите, се користи маска код во кој битовите кои бараат поставување на еден се еднакви на еден). Операцијата „Ексклузивно ИЛИ“ се користи за инвертирање на одредени битови (код за маска се користи како еден од операндите, во кој битовите што треба да се превртат се поставени на еден). Инструкциите бараат два влезни операнди и произведуваат еден излезен операнд.

8 Инструкциите за Shift ви дозволуваат да го поместувате кодот на операндот малку по малку надесно (кон битовите од низок ред) или налево (кон битовите од висок ред). Типот на поместување (логично, аритметичко или циклично) одредува колкава ќе биде новата вредност на високиот бит (за десно поместување) или нискиот бит (за лево поместување), а исто така одредува дали старата вредност на високиот бит (за лево поместување) ќе се зачува некаде или најмалку значајна бит (кога е префрлена надесно). Кружните поместувања ви дозволуваат да ги поместите битовите на кодот на операндот на кружен начин (во насока на стрелките на часовникот за десно, или спротивно од стрелките на часовникот за лево). Во овој случај, прстенот за менување може или не може да вклучува знаменце за носење. Битот за носење знаменце (ако се користи) ја складира вредноста на најзначајниот бит кога се ротира лево и најмалку значајниот бит кога се ротира десно. Според тоа, вредноста на битот за носење знаменце ќе се препише на најмалку значајниот бит за време на цикличното поместување налево и на најзначајниот бит за време на цикличното поместување надесно.

9 Команди за транзиција. Командите за скокање се дизајнирани да ги организираат сите видови јамки, гранки, потпрограмски повици итн., односно го нарушуваат секвенцијалниот тек на извршување на програмата. Овие инструкции запишуваат нова вредност во регистарот за бројачи на програми и со тоа предизвикуваат процесорот да се пресели не на следната инструкција по ред, туку на која било друга инструкција во програмската меморија. Некои команди за транзиција обезбедуваат последователно враќање назад до точката од која е направена транзицијата, други не го предвидуваат тоа. Ако е обезбедено враќање, тогаш тековните параметри на процесорот се зачувуваат на оџакот. Ако враќањето не е обезбедено, тогаш тековните параметри на процесорот не се зачувуваат.

Командите за скок без враќање се поделени во две групи:

­ команди за безусловен скок;

­ команди за условен скок.

Овие команди ги користат зборовитеГранка (разгранување) и Скок (скок).

Безусловните команди за скок предизвикуваат скок до нова адресабез разлика на се. Тие можат да предизвикаат скок до одредена сума на поместување (напред или назад) или до одредена мемориска адреса. Вредноста на поместување или вредноста на новата адреса е наведена како влезен операнд.

Условните команди за скок не секогаш предизвикуваат скок, туку само кога се исполнети одредени услови. Такви услови обично се вредностите на знаменцата во регистарот за статус на процесорот ( P.S.W. ). Односно, состојбата на транзиција е резултат на претходна операција што ги менува вредностите на знаменцата. Вкупно може да има од 4 до 16 такви услови за транзиција. Неколку примери на команди за условна транзиција:

­ скок ако е еднакво на нула;

­ скок ако не и нула;

­ скокајте ако има прелевање;

­ скокајте ако нема прелевање;

­ скок ако е поголем од нула;

­ скок ако е помало или еднакво на нула.

Ако условот за транзиција е исполнет, нова вредност се вчитува во регистарот за бројачи на команди. Ако условот за транзиција не е исполнет, програмскиот бројач едноставно се зголемува, а процесорот ја избира и извршува следната инструкција по редослед.

Поточно, за проверка на условите за скок, се користи инструкција за споредба (CMP) која претходи на инструкција за условен скок (или дури и неколку инструкции за условен скок). Но, знаменцата може да се постават и со која било друга команда, на пример, команда за пренос на податоци или која било аритметичка или логичка команда. Забележете дека самите команди за скок не ги менуваат знаменцата, што е токму она што ви овозможува да поставите неколку команди за скокови една по друга.

Наредбите за прекин заземаат посебно место меѓу командите скок со враќање. Овие инструкции бараат број на прекин (векторска адреса) како влезен операнд.

Заклучок:

Јазикот на склопување е симболична претстава на машинскиот јазик. Јазикот на склопување е различен за секој тип на компјутер. Програма за асемблерски јазик е збирка на блокови на меморија наречени мемориски сегменти. Секој сегмент содржи збирка јазични реченици, од кои секоја зафаќа посебна линија на програмски код. Постојат четири типа на асемблер изјави: команди или инструкции, макроа, директиви и линии за коментари.

Прифатливи знаци при пишување текст на програмата се сите латински букви: А-З,a-z. Во овој случај, големите и малите букви се сметаат за еквивалентни; броеви од 0 пред 9 ; знаци ? , @ , $ , _ , & ; сепаратори , . () < > { } + / * % ! " " ? = # ^ .

Се користат следните типови на асемблер оператори и синтаксички правила за формирање асемблер изрази. аритметички оператори, поместувачки оператори, оператори за споредба, логички оператори, оператор за индекс, оператор за редефинирање на типот, оператор за редефинирање на сегмент, оператор за именување на типот на структура, оператор за добивање на сегментната компонента на адресата на изразот, оператор за добивање на поместување на изразот.

Командниот систем е поделен на 8 главни групи.

­ Контролни прашања:

1 Што е асемблерски јазик?

2 Кои симболи може да се користат за пишување наредби на асемблерски јазик?

3 Што се ознаките и нивната цел?

4 Објаснете ја структурата на командите на асемблер.

5 Наведете 4 типа асемблер реченици.

НАЦИОНАЛЕН УНИВЕРЗИТЕТ ВО УЗБЕКИСТАН ИМЕНА ПО МИРЗО УЛУГБЕК

ФАКУЛТЕТ ЗА КОМПЈУТЕРСКА ТЕХНОЛОГИЈА

На тема: Семантичко парсирање на датотека EXE.

Завршено:

Ташкент 2003 година.

Предговор.

Јазик на склопување и командна структура.

Структура на датотеката EXE (семантичко парсирање).

COM структура на датотека.

Принципот на дејствување и ширење на вирусот.

Расклопувач.

Програми.

Предговор

Професијата програмер е неверојатна и единствена. Во денешно време е невозможно да се замисли науката и животот без најновата технологија. Сè што е поврзано со човековата активност не може без компјутерска технологија. И ова придонесува за неговиот висок развој и совршенство. Иако развојот на персоналните компјутери започна не толку одамна, за тоа време беа направени колосални чекори во софтверските производи и овие производи ќе бидат широко користени долго време. Областа на знаење поврзано со компјутери претрпе експлозија, како и соодветната технологија. Ако не ја земеме предвид комерцијалната страна, тогаш можеме да кажеме дека нема странци во оваа област на професионална дејност. Многу луѓе развиваат програми не за профит или приход, туку од своја слободна волја, од страст. Се разбира, тоа не треба да влијае на квалитетот на програмата, а во овој бизнис, така да се каже, постои конкуренција и побарувачка за квалитетно извршување, стабилна работа и исполнување на сите современи барања. Тука, исто така, вреди да се забележи појавата на микропроцесори во 60-тите години, кои дојдоа да заменат голем број комплети светилки. Постојат некои видови на микропроцесори кои се многу различни еден од друг. Овие микропроцесори се разликуваат еден од друг по нивната длабочина на бит и вградените системски команди. Најчести се: Intel, IBM, Celeron, AMD итн. Сите овие процесори се поврзани со напредната архитектура на процесорите на Intel. Ширењето на микрокомпјутерите предизвика преиспитување на ставовите кон асемблерскиот јазик од две главни причини. Прво, програмите напишани на асемблерски јазик бараат значително помалку меморија и време за извршување. Второ, познавањето на асемблерскиот јазик и добиениот машински код обезбедува разбирање на архитектурата на машината, што е малку веројатно да се обезбеди кога се работи на јазик на високо ниво. Иако повеќето софтверски професионалци се развиваат на јазици на високо ниво како што се Pascal, C или Delphi, што е полесно кога пишувате програми, најмоќните и најефикасните софтвернапишано целосно или делумно на асемблерски јазик. Јазиците на високо ниво беа дизајнирани да избегнуваат посебни технички карактеристикиспецифични компјутери. И асемблерскиот јазик, пак, е дизајниран за специфичните специфики на процесорот. Затоа, за да напишете програма за асемблерски јазик за одреден компјутер, мора да ја знаете неговата архитектура. Деновиве погледот на главната софтверски производе датотека EXE. Со оглед на позитивни страниОва значи дека авторот на програмата може да биде сигурен во нејзиниот интегритет. Но, често ова е далеку од случајот. Има и расклопувач. Со помош на расклопувач, можете да дознаете прекини и програмски кодови. Нема да биде тешко за човек кој е добро упатен во асемблерот да ја преработи целата програма по негов вкус. Можеби тука се јавува најнерешливиот проблем - вирусот. Зошто луѓето пишуваат вирус? Некои го поставуваат ова прашање со изненадување, некои со гнев, но сепак и понатаму има луѓе кои се заинтересирани за оваа задача не од гледна точка на предизвикување каква било штета, туку како интерес за системско програмирање. Вирусите се напишани од различни причини. Некои луѓе сакаат системски повици, други го подобруваат своето знаење за асемблерот. Сето ова ќе се обидам да го објаснам во мојот работа на курсот. Исто така, кажува не само за структурата на датотеката EXE, туку и за јазикот на асемблирањето.

^ асемблерски јазик.

Интересно е да се следи, од времето на појавувањето на првите компјутери до денес, трансформацијата на идеите на програмерите за асемблерскиот јазик.

Некогаш, асемблирањето беше јазик без кој не можете да го натерате компјутерот да направи ништо корисно. Постепено ситуацијата се промени. Се појавија попогодни средства за комуникација со компјутер. Но, за разлика од другите јазици, асемблер не умре, згора на тоа, тој не можеше да го стори тоа во принцип. Зошто? Во потрага по одговор, ајде да се обидеме да разбереме што е асемблерски јазик воопшто.

Накратко, асемблерскиот јазик е симболична претстава на машинскиот јазик. Сите процеси во машина на најниско хардверско ниво се управувани само со команди (инструкции) на машинскиот јазик. Од ова е јасно дека, и покрај заедничкото име, јазикот на склопување е различен за секој тип на компјутер. Ова исто така важи изгледпрограми напишани на асемблерски јазик и идеи на кои овој јазик е одраз.

Невозможно е вистински да се решат проблемите поврзани со хардверот (или дури, згора на тоа, зависни од хардверот, како што е зголемувањето на брзината на програмата), без познавање на асемблерот.

Програмер или кој било друг корисник може да користи какви било алатки на високо ниво, дури и програми за конструирање виртуелни светови, а можеби дури и да не се сомнева дека всушност компјутерот не ги извршува командите на јазикот на кој е напишана неговата програма, туку нивното трансформирано претставување во форма на здодевни и досадни секвенци на наредби од сосема друг јазик - машински јазик. Сега да замислиме дека таков корисник има нестандарден проблем или нешто едноставно не функционира. На пример, неговата програма мора да работи со некој необичен уред или да изврши други дејства за кои е потребно познавање на принципите на работа на компјутерскиот хардвер. Колку и да е паметен програмерот, колку и да е добар јазикот на кој ја напишал својата прекрасна програма, тој не може без познавање на асемблер. И не е случајно што скоро сите јазични компајлери на високо ниво содржат средства за поврзување на нивните модули со асемблер модули или поддржуваат пристап до асемблериското ниво на програмирање.

Се разбира, времето на компјутерските генералисти веќе помина. Како што велат, не можете да ја прифатите неизмерноста. Но, има нешто заедничко, еден вид темел на кој се гради секое сериозно компјутерско образование. Ова е знаење за принципите на работа на компјутерот, неговата архитектура и асемблерски јазик како одраз и олицетворение на ова знаење.

Типичен модерен компјутер (базиран на i486 или Pentium) се состои од следните компоненти (Слика 1).

Ориз. 1. Компјутер и периферни уреди

Ориз. 2. Блок дијаграм персонален компјутер

Од сликата (слика 1) може да се види дека компјутерот е составен од неколку физички уреди, од кои секој е поврзан со една единица, наречена системска единица. Ако размислуваме логично, јасно е дека тој ја игра улогата на некој вид координативен уред. Ајде да погледнеме внатре во системската единица (нема потреба да се обидувате да влезете во мониторот - нема ништо интересно таму, а покрај тоа, тоа е опасно): отворете го куќиштето и видете неколку табли, блокови, жици за поврзување. За да ја разбереме нивната функционална цел, да го погледнеме блок дијаграмот на типичен компјутер (сл. 2). Не бара апсолутна точност и е наменет само да ја прикаже целта, меѓусебната поврзаност и типичниот состав на елементите на модерен персонален компјутер.

Ајде да разговараме за дијаграмот на сл. 2 во малку неконвенционален стил.
Вообичаено е човек, кога ќе наиде на нешто ново, да бара некои асоцијации кои можат да му помогнат да го разбере непознатото. Какви асоцијации предизвикува компјутерот? На пример, јас често поврзувам компјутер со самата личност. Зошто?

Кога некој создавал компјутер, некаде длабоко во себе мислел дека создава нешто слично на себе. Компјутерот има органи за примање информации од надворешниот свет - тастатура, глувче и магнетни дискови. На сл. 2 овие органи се наоѓаат десно од системските автобуси. Компјутерот има органи кои ги „варат“ добиените информации - тоа се ПроцесоротИ RAM меморија. И, конечно, компјутерот има говорни органи кои ги произведуваат резултатите од обработката. Ова се исто така некои од уредите на десната страна.

Модерни компјутери, се разбира, е далеку од човечки. Тие можат да се споредат со суштества кои комуницираат со надворешниот свет на ниво на голем, но ограничен сет на безусловни рефлекси.
Овој сет на рефлекси формира систем на машински команди. Без разлика колку високо ниво комуницирате со компјутер, тоа на крајот се сведува на здодевна и монотона низа на машински команди.
Секоја машинска команда е еден вид стимул за возбудување на еден или друг безусловен рефлекс. Реакцијата на овој стимул е секогаш недвосмислена и „тврдена“ во микрокомандниот блок во форма на микропрограма. Оваа микропрограма спроведува активности за имплементација на машинска команда, но на ниво на сигнали доставени до одредени логикакомпјутер, а со тоа контролира различни потсистеми на компјутерот. Ова е таканаречениот принцип на контрола на микропрограмата.

Продолжувајќи ја аналогијата со личност, забележуваме: за компјутерот да јаде правилно, измислени се многу оперативни системи, компајлери за стотици програмски јазици итн. Но, сите тие се всушност само послужавник на кој храната (програмите) се доставува според одредени правила.желудник (компјутер). Само стомакот на компјутерот сака диета, монотона храна - дајте му структурирани информации, во форма на строго организирани секвенци од нули и единици, чии комбинации го сочинуваат машинскиот јазик.

Така, иако надворешно е полиглот, компјутерот разбира само еден јазик - јазикот на машинските инструкции. Се разбира, за комуникација и работа со компјутер, не е неопходно да се знае овој јазик, но скоро секој професионален програмер порано или подоцна се соочува со потреба да го проучува. За среќа, програмерот не мора да се обидува да го разбере значењето на различни комбинации на бинарни броеви, бидејќи уште во 50-тите, програмерите почнаа да користат симболичен аналог на машинскиот јазик за програмирање, кој беше наречен асемблерски јазик. Овој јазик точно ги одразува сите карактеристики на машинскиот јазик. Затоа, за разлика од јазиците на високо ниво, асемблерскиот јазик е различен за секој тип на компјутер.

Од сето погоре, можеме да заклучиме дека бидејќи асемблерскиот јазик е „мајчин“ за компјутер, најефективната програма може да се напише само во него (под услов да е напишана од квалификуван програмер). Има едно мало „но“ овде: ова е многу трудоинтензивен процес кој бара многу внимание и практично искуство. Затоа, во реалноста, тие главно пишуваат програми во асемблер што треба да ги обезбеди ефективна работасо хардвер. Понекогаш програмските делови кои се критични во однос на времето на извршување или потрошувачката на меморија се запишуваат во асемблер. Последователно, тие се формализирани во форма на потпрограми и се комбинираат со код на јазик на високо ниво.

Има смисла да се започне со учење на асемблерски јазик на кој било компјутер само откако ќе се открие кој дел од компјутерот е оставен видлив и достапен за програмирање на овој јазик. Ова е таканаречениот модел на компјутерска програма, чиј дел е програмскиот модел на микропроцесор, кој содржи 32 регистри, до еден или друг степен, достапни за употреба од страна на програмерот.

Овие регистри може да се поделат во две големи групи:

^ 16 регистри на корисници;

16 системски регистри.

Програмите на асемблерски јазик многу интензивно користат регистри. Повеќето регистри имаат одредена функционална намена.

Како што сугерира името, корисничките регистри се нарекуваат кориснички регистри бидејќи програмерот може да ги користи кога ги пишува своите програми. Овие регистри вклучуваат (сл. 3):

Осум 32-битни регистри кои програмерите можат да ги користат за складирање податоци и адреси (исто така наречени регистри за општа намена (GPR)):

шест сегментни регистри: cs, ds, ss, es, fs, gs;

статус и контролни регистри:

Знамиња регистрираат знамиња/знамиња;

Регистар на команден покажувач eip/ip.

Ориз. 3. Кориснички регистри на микропроцесорите i486 и Pentium

Зошто многу од овие регистри се прикажани со коси црти? Не, ова не се различни регистри - тие се делови од еден голем 32-битен регистар. Тие можат да се користат во програмата како посебни објекти. Ова беше направено за да се обезбеди функционалност на програмите напишани за помлади 16-битни модели на микропроцесори на Intel, почнувајќи од i8086. Микропроцесорите i486 и Pentium имаат претежно 32-битни регистри. Нивниот број, со исклучок на регистрите на сегменти, е ист како оној на i8086, но димензијата е поголема, што се рефлектира во нивните ознаки - тие имаат
префикс e (Проширено).

^ Регистри за општа намена
Сите регистри во оваа група ви дозволуваат пристап до нивните „пониски“ делови (види Сл. 3). Гледајќи ја оваа бројка, забележете дека само долните 16 и 8-битни делови од овие регистри може да се користат за само-адресирање. Горните 16 бита од овие регистри не се достапни како независни објекти. Ова беше направено, како што забележавме погоре, за компатибилност со помладите 16-битни модели на Intel микропроцесори.

Да ги наведеме регистрите кои припаѓаат на групата регистри за општа намена. Бидејќи овие регистри се физички лоцирани во микропроцесорот во аритметичка логичка единица (ALU), тие се нарекуваат и ALU регистри:

eax/ax/ah/al (акумулаторски регистар) - батерија.
Се користи за складирање на средни податоци. Некои команди бараат употреба на овој регистар;

ebx/bx/bh/bl (Основен регистар) - базен регистар.
Се користи за складирање на основната адреса на некој објект во меморијата;

ecx/cx/ch/cl (Регистар на брои) - бројач регистар.
Се користи во тимови кои вршат некои повторувачки дејства. Неговата употреба е често имплицитна и скриена во алгоритмот на соодветната команда.
На пример, наредбата за организирање циклус на јамка, покрај тоа што ја пренесува контролата на команда која се наоѓа на одредена адреса, ја анализира и ја намалува вредноста на регистарот ecx/cx за еден;

edx/dx/dh/dl (Регистар на податоци) - регистар на податоци.
Исто како и регистарот eax/ax/ah/al, складира средни податоци. Во некои команди неговата употреба е задолжителна; За некои команди ова се случува имплицитно.

Следниве два регистри се користат за поддршка на таканаречените операции со синџири, односно операции кои секвенцијално обработуваат синџири на елементи, од кои секоја може да биде долга 32, 16 или 8 бита:

esi/si (регистар на изворен индекс) - изворен индекс.
Овој регистар во синџирните операции ја содржи моменталната адреса на елементот во изворниот синџир;

edi/di (Destination Index register) - индекс на примачот (примач).
Овој регистар во синџирните операции ја содржи тековната адреса во синџирот на дестинација.

Во архитектурата на микропроцесорот, податочна структура како што е стек е поддржана на хардверско и софтверско ниво. За работа со стекот, постојат посебни команди во инструкцискиот систем на микропроцесорот и во програмски моделМикропроцесорот има специјални регистри за ова:

esp/sp (Stack Pointer register) - регистер на покажувачи на стек.
Содржи покажувач кон врвот на оџакот во тековниот сегмент на стек.

ebp/bp (Регистар на базен покажувач) - регистер на базен покажувач на рамката на магацинот.
Дизајниран да организира случаен пристап до податоци во стекот.

Стак е програмска област за привремено складирање на произволни податоци. Се разбира, податоците може да се складираат и во податочен сегмент, но во овој случај, за секој привремено складиран податок, мора да се креира посебна мемориска ќелија со име, што ја зголемува големината на програмата и бројот на употребени имиња. Практичноста на оџакот лежи во фактот што неговата област е повторно употреблива, а складирањето на податоците на стекот и нивното вадење од таму се врши со помош на ефективни команди за push и pop без да се наведат имиња.
Стакот традиционално се користи, на пример, за зачувување на содржината на регистрите што ги користи програмата пред да се повика потпрограма, која, пак, ќе ги користи регистрите на процесорот „за свои цели“. Оригиналната содржина на регистрите се појавува од оџакот откако ќе се врати потпрограмата. Друга вообичаена техника е да се пренесат потребните параметри на потпрограмата преку стекот. Потпрограмата, знаејќи по кој редослед се поставени параметрите на оџакот, може да ги земе од таму и да ги користи за време на неговото извршување. Карактеристична карактеристикаСтекот е единствен редослед по кој се преземаат податоците содржани во него: во кое било време, само горниот елемент е достапен на стекот, т.е. елементот неодамна турнат на оџакот. Повлекувањето на горниот елемент од оџакот го прави следниот елемент достапен. Елементите на магацинот се наоѓаат во мемориската област доделена за стекот, почнувајќи од дното на стекот (т.е. од неговата максимална адреса) со секвенцијално намалување на адресите. Адресата на горниот, достапен елемент е зачувана во регистарот на покажувачи на стек SP. Како и секоја друга област на програмска меморија, оџакот мора да биде дел од некој сегмент или да формира посебен сегмент. Во секој случај, адресата на сегментот на овој сегмент е сместена во регистарот на стек сегменти SS. Така, парот на регистри SS:SP ја опишува адресата на достапната клетка на стек: SS ја зачувува адресата на сегментот на стекот, а SP го складира поместувањето на последните податоци зачувани на стекот (сл. 4, а). Забележете дека во почетната состојба, покажувачот на стек SP покажува на ќелија која лежи под дното на стек и не е вклучена во неа.

Сл. 4. Организација на стек: а - почетна состојба, б - по вчитување на еден елемент (во овој пример, содржината на регистарот AX), в - по вчитување на вториот елемент (содржина на регистарот DS), г - по растоварување на еден елемент, e - по растоварување на два елементи и враќање во нивната првобитна состојба.

Вчитувањето во оџакот се врши со посебна команда за работа со стек (туркање). Оваа инструкција прво ја намалува содржината на покажувачот на стекот за 2, а потоа го става операндот на адресата во SP. Ако, на пример, сакаме привремено да ја зачуваме содржината на регистарот AX на магацинот, треба да ја извршиме командата

Магацинот оди во состојбата прикажана на сл. 1.10, б. Може да се види дека покажувачот на стек е поместен нагоре два бајта (кон пониски адреси) и операндот наведен во командата push е запишан на оваа адреса. Следната команда за вчитување на стек е на пр.

ќе го стави оџакот во состојбата прикажана на сл. 1.10, в. Сега стекот ќе складира два елементи, а само горниот, на кој покажува покажувачот на стекот SP, ќе биде достапен. Ако по некое време треба да ја вратиме оригиналната содржина на регистрите зачувани на стекот, мора да ги извршиме командите pop (push) за да се растоварат од стекот:

поп ДС
поп секира

Колку треба да биде оџакот? Зависи од тоа колку интензивно се користи во програмата. Ако, на пример, планирате да складирате низа од 10.000 бајти на оџакот, тогаш стекот мора да биде барем оваа големина. Треба да се има на ум дека во некои случаи оџакот автоматски се користи од системот, особено при извршување на командата за прекин на int 21h. Со оваа команда, процесорот прво ја турка повратната адреса на стекот, а потоа DOS ја турка содржината на регистрите и другите информации поврзани со прекинатата програма на стекот. Затоа, дури и ако програмата воопшто не користи стек, тој сепак мора да биде присутен во програмата и да има најмалку неколку десетици зборови во големина. Во нашиот прв пример, доделивме 128 зборови на магацинот, што секако е доволно.

^ Структура на асемблер програма

Програма за асемблерски јазик е збирка на блокови на меморија наречени мемориски сегменти. Програмата може да се состои од еден или повеќе такви блок-сегменти. Секој сегмент содржи збирка јазични реченици, од кои секоја зафаќа посебна линија на програмски код.

Постојат четири типа на асемблер изјави:

команди или инструкции кои се симболични аналози на машинските команди. За време на процесот на преведување, инструкциите на асемблерот се претвораат во соодветните команди на множеството инструкции на микропроцесорот;

макрокоманди - реченици на програмски текст форматиран на одреден начин, заменети за време на емитувањето со други реченици;

директиви, кои се инструкции за асемблер-преведувачот да изврши одредени дејства. Директивите немаат колеги во машинското претставување;

линии за коментари кои содржат какви било знаци, вклучително и букви од руската азбука. Коментарите се игнорирани од преведувачот.

^ Синтакса на собранието

Речениците што ја сочинуваат програмата може да бидат синтаксички конструкт што одговара на команда, макро, директива или коментар. За да може асемблер-преведувачот да ги препознае, тие мора да се формираат според одредени синтаксички правила. За да го направите ова, најдобро е да користите формален опис на синтаксата на јазикот, како правилата на граматиката. Најчестите начини за опишување на програмски јазик на овој начин се синтаксните дијаграми и проширените Backus-Naur форми. За практична употреба, синтаксните дијаграми се попогодни. На пример, синтаксата на изјавите на асемблерски јазик може да се опише со користење на синтаксните дијаграми прикажани на следните слики.

Ориз. 5. Формат на собраниска реченица

Ориз. 6. Формат на директивата

Ориз. 7. Формат на команди и макроа

На овие слики:

име на етикета - идентификатор чија вредност е адресата на првиот бајт од реченицата во изворниот код на програмата што ја означува;

име - идентификатор што ја разликува оваа директива од другите директиви со исто име. Како резултат на обработката на одредена директива од страна на асемблерот, на тоа име може да му се доделат одредени карактеристики;

оперативен код (OPC) и директива се мнемонички симболи за соодветната машинска инструкција, макро инструкција или директива за преведувач;

операнди се делови од команда, макро или асемблер директива кои ги означуваат објектите на кои се извршуваат дејствата. Операндите на асемблерски јазик се опишуваат со изрази со нумерички и текстуални константи, ознаки и идентификатори на променливи користејќи знаци на оператор и некои резервирани зборови.

^ Како да користите синтаксни дијаграми? Многу е едноставно: сè што треба да направите е да најдете и потоа да ја следите патеката од влезот на дијаграмот (лево) до неговиот излез (десно). Ако постои таква патека, тогаш реченицата или конструкцијата е синтаксички точна. Ако не постои таква патека, тогаш компајлерот нема да ја прифати оваа конструкција. Кога работите со синтаксни дијаграми, обрнете внимание на насоката на премин означена со стрелките, бидејќи меѓу патеките може да има некои што може да се следат од десно кон лево. Во суштина, синтаксните дијаграми ја рефлектираат логиката на работата на преведувачот при парсирање на влезните реченици на програмата.

Прифатливи знаци при пишување текст на програмата се:

Сите латински букви: A-Z, a-z. Во овој случај, големите и малите букви се сметаат за еквивалентни;

Броеви од 0 до 9;

Знаци ?, @, $, _, &;

Сепаратори,. ()< > { } + / * % ! " " ? \ = # ^.

Речениците на асемблерски јазик се формираат од лексеми, кои се синтаксички неразделни низи на валидни јазични симболи кои имаат смисла за преведувачот.

Лексемите се:

Идентификаторите се низи од валидни знаци кои се користат за означување на објектите на програмата како што се оперативни кодови, имиња на променливи и имиња на етикети. Правилото за пишување идентификатори е следново: идентификаторот може да се состои од еден или повеќе знаци. Како симболи можете да користите букви од латинската азбука, бројки и некои специјални знаци - _, ?, $, @. Идентификаторот не може да започне со цифрен знак. Должината на идентификаторот може да биде до 255 знаци, иако преведувачот ги прифаќа само првите 32, а останатите ги игнорира. Можете да ја прилагодите должината на можните идентификатори користејќи ја опцијата командна линија mv. Покрај тоа, можно е да му се наложи на преведувачот да прави разлика помеѓу големи и мали букви или да ја игнорира нивната разлика (што се прави стандардно).

^Команди на асемблерот.

Командите на асемблерот ја откриваат способноста да ги префрлите вашите барања на компјутерот, механизам за пренос на контрола во програма (циклуси и транзиции) за логички споредби и организација на програмата. Сепак, програмираните задачи ретко се толку едноставни. Повеќето програми содржат низа циклуси во кои се повторуваат неколку команди додека не се постигне одредено барање и разни проверки кои одредуваат која од неколкуте дејства треба да се изврши. Некои инструкции можат да ја пренесат контролата со менување на нормалната низа чекори со директно менување на вредноста на поместувањето во покажувачот на инструкциите. Како што споменавме порано, постојат различни команди за различни процесори, но ќе разгледаме неколку команди за процесорите 80186, 80286 и 80386.

За да ја опишеме состојбата на знаменцата по извршувањето на одредена команда, ќе користиме избор од табела што ја рефлектира структурата на регистарот со знаменце eflag:

Долниот ред од оваа табела ги прикажува вредностите на знаменцата откако ќе се изврши командата. Се користат следните ознаки:

1 - откако ќе се изврши командата, се поставува знамето (еднакво на 1);

0 - откако ќе се изврши командата, знамето се ресетира (еднакво на 0);

r - вредноста на знамето зависи од резултатот на командата;

Откако ќе се изврши командата, знамето не е дефинирано;

простор - откако ќе се изврши командата, знамето не се менува;

Следната нотација се користи за претставување на операнди во синтаксните дијаграми:

r8, r16, r32 - операнд во еден од регистрите со големина на бајт, збор или двоен збор;

m8, m16, m32, m48 - бајт со големина на мемориски операнд, збор, двоен збор или 48 бита;

i8, i16, i32 - директна големина на операнд бајт, збор или двоен збор;

a8, a16, a32 - релативна адреса (офсет) во сегментот на кодот.

Команди (по азбучен ред):

*Овие команди се детално опишани.

ДОДАЈ
(ДОДАТОК)

Додаток

^ Команден дијаграм:

додадете дестинација, извор

Цел: додавање на два изворни и одредишни операнди со големина бајт, збор или двоен збор.

Работен алгоритам:

додајте ги изворните и одредишните операнди;

напишете го резултатот од собирањето на примачот;

постави знамиња.

Состојба на знаменца по извршување на командата:

Апликација:
Командата add се користи за додавање два целобројни операнди. Резултатот од собирањето се става на адресата на првиот операнд. Ако резултатот од додавањето оди подалеку од границите на операндот на примачот (се јавува прелевање), тогаш оваа ситуација треба да се земе предвид со анализа на знамето cf и последователната можна употреба на командата adc. На пример, да ги додадеме вредностите во регистарот со оски и областа на меморијата ch. Кога додавате, земете ја предвид можноста за прелевање.

Регистрирајте плус регистар или меморија:

|000000dw|modregr/rm|

Регистар AX (AL) плус непосредна вредност:

|0000010w|--податоци--|податоци ако w=1|

Регистрирај се или меморија плус непосредна вредност:

|100000sw|mod000r/m|--податоци--|податоци ако BW=01|

ПОВИК
(ПОВИК)

Повикување постапка или задача

^ Команден дијаграм:

Цел:

пренесување на контролата на блиска или далечна процедура со зачувување на адресата на повратната точка на оџакот;

префрлување задачи.

Работен алгоритам:
определен од типот на операндот:

Near label - содржината на командниот покажувач eip/ip се турка на оџакот и новата адресна вредност што одговара на етикетата се вчитува во истиот регистар;

Далечна ознака - содржината на командниот покажувач eip/ip и cs се турка на оџакот. Потоа во истите регистри се вчитуваат нови адресни вредности што одговараат на далечната ознака;

R16, 32 или m16, 32 - дефинирајте регистар или мемориска ќелија која содржи поместувања во тековниот сегмент на инструкции на кој се пренесува контролата. Кога контролата се пренесува, содржината на командниот покажувач eip/ip се турка на оџакот;

Мемориски покажувач - дефинира мемориска локација која содржи покажувач од 4 или 6 бајти кон повиканата процедура. Структурата на таков покажувач е 2+2 или 2+4 бајти. Толкувањето на таков покажувач зависи од режимот на работа на микропроцесорот:

^ Состојба на знаменца по извршување на командата (освен префрлување задачи):

извршувањето на командата не влијае на знаменцата

Кога ќе се префрли задача, вредностите на знамето се менуваат според информациите за регистарот на знаменца во статусниот сегмент на TSS на задачата на која се префрла.
Апликација:
Командата за повик ви овозможува да организирате флексибилен и повеќеваријантен пренос на контрола во потпрограма, додека ја зачувувате адресата на повратната точка.

Код на објектот (четири формати):

Директно адресирање во сегмент:

|11101000|дисп-ниско|ниско-високо|

Индиректно адресирање во сегмент:

|11111111|mod010r/m|

Индиректно адресирање помеѓу сегментите:

|11111111|mod011r/m|

Директно адресирање помеѓу сегментите:

|10011010|поместување-ниско|офсет-високо|сег-ниско|сег-високо|

CMP
(Спореди ги операнди)

Споредба на операнд

^ Команден дијаграм:

cmp операнд 1, операнд 2

Цел: споредба на два операнди.

Работен алгоритам:

изврши одземање (операнд1-операнд2);

во зависност од резултатот, поставете ги знаменцата, не менувајте ги операндот1 и операндот2 (односно, не се сеќавајте на резултатот).

Апликација:
Оваа командасе користи за споредување на два операнди со одземање без промена на операндите. Врз основа на резултатите од командата, се поставуваат знаменца. Командата cmp се користи со командите за условен скок и со командата за сет бајт по вредност setcc.

Код на објектот (три формати):

Регистрирај се или меморија со регистар:

|001110dw|modregr/m|

Непосредна вредност со регистарот AX (AL):

|0011110w|--податоци--|податоци ако w=1|

Непосредна вредност со регистар или меморија:

|100000sw|mod111r/m|--податоци--|податоци ако sw=0|

ДЕК
(Операндот го намалува за 1)

Намалување на операнд за еден

^ Команден дијаграм:

дек операнд

Цел: Намалете ја вредноста на операндот во меморијата или регистрирајте се за 1.

Работен алгоритам:
наредбата одзема 1 од операндот. Состојба на знаменца по извршување на командата:

Апликација:
Инструкцијата dec се користи за намалување на вредноста на бајт, збор, двоен збор во меморијата или регистрирање за еден. Сепак, имајте предвид дека командата не влијае на знамето cf.

Регистрирај се: |01001reg|

^ Регистрирај се или меморија: |1111111w|mod001r/m|

DIV
(Поделете непотпишано)

Непотпишана поделба

Тимски преглед:

див делител

Цел: Изведете операција за делење помеѓу две неозначени бинарни вредности.

^ Оперативен алгоритам:
Наредбата бара два операнди - дивиденда и делител. Дивидендата е наведена имплицитно и нејзината големина зависи од големината на делителот, што е наведено во командата:

ако делителот е со големина на бајт, тогаш дивидендата мора да биде лоцирана во регистарот на секира. По операцијата, количникот се става во al, а остатокот во ah;

ако делителот е со големина на збор, тогаш дивидендата мора да се наоѓа во регистерскиот пар dx:ax, при што делот од дивидендата од низок ред се наоѓа во ax. По операцијата, количникот се става во секира, а остатокот во dx;

ако делителот е со двоен збор по големина, тогаш дивидендата мора да се наоѓа во регистерскиот пар edx:eax, при што делот од дивидендата со низок ред се наоѓа во eax. По операцијата, количникот се става во eax, а остатокот во edx.

^ Состојба на знаменца по извршување на командата:

Апликација:
Командата врши целобројна поделба на операндите, произведувајќи го резултатот од делењето како количник и остатокот од делењето. При извршување на операција за поделба, може да се појави исклучок: 0 - грешка во делењето. Оваа ситуација се јавува во еден од двата случаи: делителот е 0 или количникот е преголем за да се вклопи во регистарот eax/ax/al.

Код на објектот:

|1111011w|mod110r/m|

ИНТ
(Прекине)

Повикување на рутинска услуга за прекин

^ Команден дијаграм:

int interrupt_number

Цел: повикајте ја рутината на услугата за прекин со прекинувачкиот број наведен од командниот операнд.

^ Оперативен алгоритам:

турнете ги знаменцата на регистерските ознаки/знамињата и адресата за враќање на оџакот. При пишување повратна адреса, прво се запишува содржината на сегментниот регистар cs, а потоа содржината на командниот покажувач eip/ip;

ресетирајте ги знаменцата if и tf на нула;

префрлете ја контролата на програмата за услуга за прекин со наведениот број. Механизмот за пренос на контрола зависи од режимот на работа на микропроцесорот.

^ Состојба на знаменца по извршување на командата:

Апликација:
Како што можете да видите од синтаксата, постојат две форми на оваа команда:

int 3 - има сопствена индивидуална оперативна шифра 0cch и зафаќа еден бајт. Оваа околност го прави многу погодно за употреба во различни софтверски дебагери за поставување точки на прекин со замена на првиот бајт од која било команда. Микропроцесорот, наидувајќи на команда со оперативен код 0cch во низата наредби, ја повикува програмата за обработка на прекини со вектор број 3, која служи за комуникација со софтверскиот дебагер.

Втората форма на командата зафаќа два бајта, има оптички код од 0cdh и ви овозможува да иницирате повик до рутинска услуга за прекин со векторски број во опсегот 0-255. Карактеристиките на пренос на контрола, како што е наведено, зависат од режимот на работа на микропроцесорот.

Код на објектот (два формати):

Регистрирај се: |01000рег|

^ Регистрирај се или меморија: |1111111w|mod000r/m|

J.C.C.
JCXZ/JECXZ
(Скокни ако услов)

(Скокни ако CX=Нула/Скокни ако ECX=Нула)

Скокни ако условот е исполнет

Скокни ако CX/ECX е нула

^ Команден дијаграм:

ознака jcc
jcxz етикета
jecxz етикета

Цел: транзиција во тековниот команден сегмент во зависност од некоја состојба.

^ Команден алгоритам (освен jcxz/jecxz):
Проверка на состојбата на знаменцата во зависност од оптичкиот код (тоа ја одразува состојбата што се проверува):

ако условот што се тестира е вистинит, тогаш одете во ќелијата означена со операндот;

ако условот што се проверува е неточен, тогаш префрлете ја контролата на следната команда.

Алгоритам за командата jcxz/jecxz:
Проверка на условот дека содржината на регистарот ecx/cx е еднаква на нула:

доколку состојбата се проверува

Програмирањето на ниво на машинска инструкција е минималното ниво на кое може да се напишат програмите. Системот на машински инструкции мора да биде доволен за да ги спроведе потребните дејства со издавање инструкции до компјутерскиот хардвер.

Секоја машинска команда се состои од два дела:

  • оперативно - одредување „што да се прави“;
  • операнд - дефинирање на објекти за обработка, „со што да се прави“.

Командата за машина за микропроцесор, напишана на асемблер јазик, е една линија со следнава синтаксичка форма:

ознака за команда/директива операнд(и) ;коментари

Во овој случај, потребното поле во линијата е команда или директива.

Етикетата, командата/директивата и операндите (доколку ги има) се одделени со барем еден знак за празно место или таб.

Ако некоја команда или директива треба да се продолжи на следната линија, се користи знакот за назад црта: \.

Стандардно, асемблерскиот јазик не прави разлика помеѓу големи и мали букви при пишување наредби или директиви.

Пример линии на код:

Брои db 1 ;Име, директива, еден операнд
mov eax,0 ;Команда, два операнди
cbw ; Тим

Тагови

Етикета во асемблерски јазик може да ги содржи следните симболи:

  • сите букви од латинската азбука;
  • броеви од 0 до 9;
  • специјални знаци: _, @, $, ?.

Точка може да се користи како прв знак на етикетата, но некои компајлери не препорачуваат користење на овој знак. Имињата на резервирани асемблери (директиви, оператори, имиња на команди) не можат да се користат како ознаки.

Првиот знак во етикетата мора да биде буква или посебен знак (но не и број). Максимална должинаознаки – 31 знак. Сите етикети што се напишани на линија што не содржи директива за асемблер мора да завршуваат со две точки: .

Тимови

Тим му кажува на преведувачот какво дејство треба да изврши микропроцесорот. Во податочниот сегмент, командата (или директивата) дефинира поле, работен простор или константа. Во сегментот на код, командата одредува дејство, како што е поместување (mov) или додавање (додавање).

Директиви

Асемблерот има голем број на оператори кои ви дозволуваат да го контролирате процесот на склопување и листање. Овие оператори се нарекуваат директиви . Тие дејствуваат само за време на процесот на склопување на програмата и, за разлика од командите, не генерираат машински код.

Операнди

Операнд – објект на кој се извршува машинска команда или изјава за програмски јазик.
Инструкцијата може да има еден или два операнди или воопшто да нема операнди. Бројот на операнди е имплицитно одреден со инструкцискиот код.
Примери:

  • Нема враќање на операнди ;Враќање
  • Еден операнд inc ecx ;Зголеми ecx
  • Два операнди додаваат eax,12; Додадете 12 на eax

Ознаката, командата (директивата) и операндот не мора да започнуваат на која било одредена позиција во линијата. Сепак, се препорачува да се напишат во колона за да се олесни читањето на програмата.

Операндите можат да бидат

  • идентификатори;
  • низи од знаци затворени во единечни или двојни наводници;
  • цели броеви во бинарни, октални, децимални или хексадецимални броени системи.
Идентификатори

Идентификатори – секвенци од важечки знаци кои се користат за означување на објектите на програмата, како што се оперативни кодови, имиња на променливи и имиња на етикети.

Правила за снимање идентификатори.

  • Идентификаторот може да се состои од еден или повеќе знаци.
  • Како симболи можете да користите букви од латинската азбука, бројки и некои специјални знаци: _, ?, $, @.
  • Идентификаторот не може да започне со цифрен знак.
  • Должината на идентификаторот може да биде до 255 знаци.
  • Преведувачот ги прифаќа првите 32 знаци од идентификаторот и ги игнорира останатите.
Коментари

Коментарите се одделени од извршната линија со знак; . Во овој случај, се што е напишано после точка-запирка и до крајот на редот е коментар. Користењето коментари во програмата ја подобрува нејзината јасност, особено кога целта на множеството команди е нејасна. Коментарот може да содржи какви било знаци за печатење, вклучувајќи празни места. Коментарот може да ја опфаќа целата линија или да следи команда на истата линија.

Структура на програмата на собранието

Програма напишана на асемблерски јазик може да се состои од неколку наречени делови модули . Секој модул може да има дефинирани еден или повеќе сегменти на податоци, стек и код. Секоја комплетна асемблер програма мора да вклучува еден главен или главен модул од кој започнува неговото извршување. Модулот може да содржи кодни сегменти, податочни сегменти и сегменти на стек, декларирани со користење на соодветни директиви. Пред да декларирате сегменти, мора да го наведете моделот на меморија користејќи ја директивата .MODEL.

Пример за програма „не прави ништо“ на асемблерски јазик:

686p
.МОДЕЛ РАМЕН, STDCALL
.ПОДАТОЦИ
.КОД
СТАРТ:

РЕТ
КРАЈ ПОЧЕТ

Оваа програма содржи само една команда на микропроцесорот. Оваа команда е RET. Обезбедува дека програмата правилно завршува. Во принцип, оваа команда се користи за излез од процедура.
Остатокот од програмата се однесува на работата на преведувачот.
.686P - Командите за заштитен режим на Pentium 6 (Pentium II) се дозволени. Оваа директива го избира поддржаниот сет на инструкции за асемблер, што го означува моделот на процесорот. Буквата P означена на крајот од директивата го информира преведувачот дека процесорот работи во заштитен режим.
.MODEL FLAT, stdcall - модел со рамна меморија. Овој модел на меморија се користи во оперативниот систем Windows. stdcall
.DATA е програмски сегмент кој содржи податоци.
.CODE е програмски блок кој содржи код.
СТАРТ - етикета. Во асемблер, ознаките играат голема улога, што не може да се каже за современите јазици на високо ниво.
КРАЈ СТАРТ - крај на програмата и порака до преведувачот дека извршувањето на програмата треба да започне со ознаката СТАРТ.
Секој модул мора да содржи директива КРАЈ за да го означи крајот изворен кодпрограми. Сите линии што ја следат директивата КРАЈ се игнорираат. Ако ја испуштите директивата КРАЈ, се генерира грешка.
Ознаката наведена по директивата КРАЈ му го кажува на преведувачот името на главниот модул од кој започнува извршувањето на програмата. Ако програмата содржи еден модул, ознаката по директивата КРАЈ може да се изостави.

Структура на команди во асемблерски јазик Програмирањето на ниво на машински команди е минималното ниво на кое е можно компјутерско програмирање. Системот за команда на машината мора да биде доволен за спроведување на бараните дејства со издавање инструкции на машинската опрема. Секоја машинска инструкција се состои од два дела: оперативен, кој одредува „што да се прави“ и операнд, кој ги одредува објектите за обработка, односно „што да се прави“. Инструкција за машина за микропроцесор, напишана на јазик на собранието, е единечна линија која ја има следната форма: операнд(и) команда/директива на ознака; коментари Етикетата, командата/директивата и операндот се одделени со барем еден знак за празно место или таб. Операндите на командата се одделени со запирки.

Структура на команда на асемблерски јазик Командата за асемблер му кажува на преведувачот каква акција треба да изврши микропроцесорот. Директивите за склопување се параметри наведени во текстот на програмата кои влијаат на процесот на склопување или на својствата на излезната датотека. Операндот ја одредува почетната вредност на податоците (во податочниот сегмент) или елементите на кои се врши командното дејство (во сегментот на кодот). Инструкцијата може да има еден или два операнди или да нема операнди. Бројот на операнди е имплицитно одреден со инструкцискиот код. Ако некоја команда или директива треба да се продолжи на следната линија, се користи знакот за назад црта: "" . Стандардно, асемблерот не прави разлика помеѓу големи и мали букви кога пишува команди и директиви. Примери на директиви и команди Брои db 1 ; Име, директива, еден операнд mov eax, 0 ; Команда, два операнди

Идентификаторите се низи од валидни знаци кои се користат за означување на имиња на променливи и имиња на етикети. Идентификаторот може да се состои од еден или повеќе од следниве знаци: сите букви од латинската азбука; броеви од 0 до 9; специјални знаци: _, @, $, ? . Точка може да се користи како прв знак на етикетата. Резервираните имиња на асемблерите (директиви, оператори, имиња на команди) не можат да се користат како идентификатори. Првиот знак на идентификаторот мора да биде буква или посебен знак. Максималната должина на идентификаторот е 255 знаци, но преведувачот ги прифаќа првите 32 и ги игнорира останатите. Сите етикети што се напишани на линија што не содржи директива за асемблер мора да завршуваат со две точки „:“. Ознаката, командата (директивата) и операндот не мора да започнуваат на која било одредена позиција во линијата. Се препорачува да се запишат во колона за поголема читливост на програмата.

Етикети Сите етикети што се напишани на линија што не содржи директива за асемблер мора да завршуваат со две точки „:“. Ознаката, командата (директивата) и операндот не мора да започнуваат на која било одредена позиција во линијата. Се препорачува да се запишат во колона за поголема читливост на програмата.

Коментари Користењето коментари во програма ја подобрува нејзината јасност, особено кога целта на множеството команди е нејасна. Коментарите започнуваат на која било линија во изворниот модул со точка-запирка (;). Сите знаци десно од „; „До крајот на редот има коментар. Коментарот може да содржи какви било знаци за печатење, вклучително и празно место. Коментарот може да ја опфаќа целата линија или да следи команда на истата линија.

Структура на програмата на асемблерски јазик Програма напишана на асемблерски јазик може да се состои од неколку делови наречени модули, од кои секој може да дефинира еден или повеќе сегменти на податоци, стек и код. Секоја целосна програма на асемблерски јазик мора да вклучува еден главен, или главен, модул од кој започнува неговото извршување. Модулот може да содржи програмски, податоци и сегменти на стек, декларирани со користење на соодветни директиви.

Модели на меморија Пред да декларирате сегменти, треба да го наведете моделот на меморија користејќи директива. MODEL modifier memory_model, calling_convention, OS_type, stack_parameter Основни мемориски модели на асемблерски јазик: Мемориски модел Адресирање на код Адресирање на податоци операционен системКод и податоци за преплетување МАЛКИ блиску до MS-DOS Прифатливи МАЛО БЛИЗИРА MS-DOS, Windows без СРЕДНО ДАЛЕКУ БЛИЗИРА MS-DOS, Windows Нема КОМПАКТЕН БЛИЗУ ДАЛЕКУ MS-DOS, Windows Нема ГОЛЕМ ДАЛЕКУ MS-DOS, Windows нема ОГРОМНИ ДАЛЕКУ MS-DOS, Windows нема БЛИЗИРА на Windows 2000, Windows XP, Windows прифатливо РАМЕН БЛИЗУ NT,

Модели со меморија Малиот модел работи само во 16-битни MS-DOS апликации. Во овој модел, сите податоци и код се наоѓаат на еден физички сегмент. Големината на програмската датотека во овој случај не надминува 64 KB. Малиот модел поддржува еден код сегмент и еден податочен сегмент. Податоците и кодот се адресираат како блиску кога се користи овој модел. Медиумскиот модел поддржува повеќе кодни сегменти и еден податочен сегмент, при што сите референци во сегментите на кодот стандардно се сметаат за далеку, а референците во сегментот на податоци се сметаат за блиски. Компактниот модел поддржува неколку податочни сегменти кои користат далечно податочно адресирање (далеку) и еден код сегмент кој користи блиско адресирање (блиску). Големиот модел поддржува повеќе сегменти на код и повеќе сегменти на податоци. Стандардно, сите референци на код и податоци се сметаат за далеку. Огромниот модел е речиси еквивалентен на моделот со голема меморија.

Модели на меморија Рамниот модел претпоставува несегментирана програмска конфигурација и се користи само во 32-битни оперативни системи. Овој модел е сличен на малиот модел по тоа што податоците и кодот се наоѓаат во еден сегмент, но тој е 32-битен. Да се ​​развие програма за рамен модел пред директивата. модел стан треба да постави една од директивите: . 386,. 486,. 586 или. 686. Изборот на директивата за избор на процесор го одредува множеството инструкции достапни при пишување програми. Буквата p по директивата за избор на процесор значи заштитен режим на работа. Адресирањето на податоците и кодот е блиску, а сите адреси и покажувачи се 32-битни.

Модели за меморија. Модификатор MODEL memory_model, calling_convention, OS_type, stack_parameter Параметарот на модификаторот се користи за дефинирање на типовите сегменти и може да ги земе следните вредности: користете 16 (сегментите од избраниот модел се користат како 16-битни) користете 32 (сегменти од избраниот модел се користат како 32-битни). Параметарот calling_convention се користи за одредување на начинот на пренесување параметри при повикување постапка од други јазици, вклучително и јазици на високо ниво (C++, Pascal). Параметарот може да ги земе следните вредности: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

Модели за меморија. Модификатор MODEL memory_model, calling_convention, OS_type, stack_parameter Параметарот OS_type е стандардно OS_DOS и вклучен овој моментова е единствената поддржана вредност за овој параметар. Параметарот stack_parameter е поставен на: NEARSTACK (SS регистерот е еднаков на DS, податочните области и магацинот се наоѓаат во истиот физички сегмент) FARSTACK (SS регистарот не е еднаков на DS, податочните и областите на стек се наоѓаат во различни физички сегменти). Стандардната вредност е NEARSTACK.

Пример за програма што не прави ништо. 686 P. МОДЕЛ РАМЕН, STDCALL. ПОДАТОЦИ. CODE START: RET END START RET - команда на микропроцесорот. Обезбедува дека програмата правилно завршува. Остатокот од програмата се однесува на работата на преведувачот. . 686 P - Командите за заштитен режим на Pentium 6 (Pentium II) се дозволени. Оваа директива го избира поддржаниот сет на инструкции за асемблер, што го означува моделот на процесорот. . MODEL FLAT, stdcall - модел со рамна меморија. Овој модел на меморија се користи во оперативниот систем Windows. stdcall - се користи постапката за повикување на конвенцијата.

Пример за програма што не прави ништо. 686 P. МОДЕЛ РАМЕН, STDCALL. ПОДАТОЦИ. ШИФРА ЗА ПОЧЕТОК: ПОВТОРУВАЊЕ КРАЈ СТАРТ. ПОДАТОЦИ е програмски сегмент кој содржи податоци. Оваа програмане го користи стекот, па сегментот. STACK недостасува. . CODE е програмски сегмент кој содржи код. СТАРТ - етикета. КРАЈ СТАРТ - крај на програмата и порака до компајлерот дека извршувањето на програмата треба да започне со ознаката СТАРТ. Секоја програма мора да содржи END директива, означувајќи го крајот на изворниот код на програмата. Сите линии што ја следат директивата КРАЈ се игнорираат.Ознаката наведена по директивата КРАЈ му го кажува на преведувачот името на главниот модул од кој започнува извршувањето на програмата. Ако програмата содржи еден модул, ознаката по директивата КРАЈ може да се изостави.

Преведувачи на асемблерски јазици Преведувач - програма или технички средства, кој конвертира програма претставена на еден од програмските јазици во програма на целниот јазик, наречена објектен код. Покрај поддршката за мнемоника на машински инструкции, секој преведувач има свој сет на директиви и макро алатки, честопати некомпатибилни со ништо друго. Главните типови на преведувачи на асемблерски јазици: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - слободно дистрибуиран асемблерот со повеќе премини напишан од Tomasz Gryshtar (полски), NASM (Netwide Assembler) - бесплатен асемблерот за архитектурата Intel x 86, создаден од Сајмон Татам со Џулијан Хол и моментално се развива од мал тим програмери во Source. Ковач. нето.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="Translating a program in Microsoft Visual Studio 2005 1) Создадете проект со избирање на File->New- > Проектно мени И"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="Преведување на програмата во Microsoft Visual Studio 2005 2) Во дрвото на проектот (View->Solution Explorer) додадете"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Преведување на програмата во Microsoft Visual Studio 2005 3) Изберете го типот на датотеката Code C++, но наведете го името со наставката. asm:

Преведување на програмата во Microsoft Visual Studio 2005 5) Поставете параметри на компајлерот. Десен-клик на менито Custom Build Rules во проектната датотека...

Преведете ја програмата во Microsoft Visual Studio 2005 и изберете Microsoft Macro Assembler во прозорецот што се појавува.

Превод на програмата во Microsoft Visual Studio 2005 Проверете со десното копче во датотеката hello. asm проектно дрво од менито Својства и инсталирајте Општо-> Алатка: Мајкрософт Макро Асемблер.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="Преведување на програмата во Microsoft Visual Studio 2005 6) Компилирајте ја датотеката со избирање Build->Build hello. прј."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Програмирање во Windows OS Програмирањето во Windows OS се заснова на употреба на функции API (Application Program Interface, т.е., софтверска апликација интерфејс). Нивниот број достигнува 2000. Програмата Windows во голема мера се состои од такви повици. Сите интеракции со надворешни уредии ресурсите на оперативниот систем се јавуваат, по правило, преку такви функции. операциона сала Виндоус системкористи модел на рамна меморија. Адресата на која било мемориска ќелија ќе биде одредена од содржината на еден 32-битен регистар. Постојат 3 типа програмски структури за Windows: дијалог (главниот прозорец е дијалог), конзола или структура без прозорци, класична структура (прозорец, рамка).

Јавете се Функции на Windows API Во датотеката за помош, секоја API функција е претставена како тип функција_име (FA 1, FA 2, FA 3) Тип – тип на повратна вредност; ФАкс – листа на формални аргументи по редоследот по кој се појавуваат.На пример, int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Оваа функцијаприкажува прозорец со порака и копче за излез (или копчиња). Значење на параметрите: ж. Wnd е дескриптор на прозорецот во кој ќе се појави прозорецот за пораки, lp. Текст - текст што ќе се појави во прозорецот, lp. Наслов - текст во насловот на прозорецот, у. Тип - тип на прозорец; особено, можете да го одредите бројот на копчиња за излез.

Повикување на функциите на Windows API int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Речиси сите параметри на функцијата API се всушност 32-битни цели броеви: HWND е 32-битен цел број, LPCTSTR е 32-битен покажувач на низа, UINT е 32-битен цел број. Наставката „А“ често се додава на името на функцијата за да се пресели во поновите верзии на функцијата.

Повикување на функциите на Windows API int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Кога користите MASM, мора да додадете @N N на крајот од името - бројот на бајти што усвоените аргументи ги зафаќаат на оџакот. За Win 32 API функциите, овој број може да се дефинира како број на аргументи n помножен со 4 (бајти во секој аргумент): N=4*n. За да повикате функција, користете ја инструкцијата CALL за асемблерот. Во овој случај, сите функциски аргументи се пренесуваат до него преку стекот (наредба PUSH). Насока на предавање аргументи: ЛЕВО НАДЕСНО - ДОЛО ГОРЕ. Аргументот u прво ќе се притисне на магацинот. Тип. Повикот до наведената функција ќе изгледа вака: Порака повик. Кутија. A@16

Повикување на функциите на Windows API int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Резултатот од извршувањето на која било API функција е обично цел број што се враќа во регистарот EAX. Директивата OFFSET претставува „поместување во сегмент“, или, преведено во јазични термини на високо ниво, „покажувач“ на почетокот на линијата. Директивата EQU, како #define во SI, дефинира константа. Директивата EXTERN му кажува на преведувачот дека функцијата или идентификаторот е надворешен од овој модул.

Пример за програма „Здраво на сите!“. . 686 P. МОДЕЛ РАМЕН, STDCALL. STACK 4096. ПОДАТОЦИ MB_OK EQU 0 STR 1 DB "Мојата прва програма", 0 STR 2 DB "Здраво на сите!", 0 HW DD ? НАДВОРЕШНА порака. Кутија. A@16: БЛИЗУ. КОД СТАРТ: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Порака. Кутија. A@16 РЕТ КРАЈ СТАРТ

Директивата INVOKE Преведувачот на јазикот MASM исто така ви овозможува да ги поедноставите повиците на функции со помош на макро алатка - директивата INVOKE: INVOKE функција, параметар1, параметар2, ... Нема потреба да додавате @16 на повикот на функцијата; параметрите се пишуваат точно по редоследот по кој се дадени во описот на функцијата. Со макро средства на преведувачот, параметрите се ставаат на оџакот. За да ја користите директивата INVOKE, мора да имате опис на прототипот на функцијата користејќи ја директивата PROTO во форма: Порака. Кутија. ПРОТО: DWORD, : DWORD Ако програмата користи многу функции на Win 32 API, препорачливо е да се користи директивата вклучување C: masm 32includeuser 32. inc




Врв