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

Команди на асемблерски јазик (Предавање)

ПЛАН ЗА ПРЕДАВАЊЕ

1. Главни групи на операции.

Пентиум.

1. Главни групи на операции

Микропроцесорите извршуваат збир на команди кои ги имплементираат следните главни групи на операции:

Шпедитерски операции

Аритметички операции,

Логички операции

Операции со смена

Операции за споредба и тестирање

Операции со битови

Програмски операции за управување;

Операции за контрола на процесорот.

2. Мнемонички кодови на команди на процесорот Пентиум

Кога се опишуваат команди, обично се користат нивните мнемонички ознаки (мнемонички кодови), кои се користат за одредување на командата при програмирање на јазик на собранието. За различни верзии на Assembler, мнемоничките кодови на некои команди може да се разликуваат. На пример, за командата за повикување потпрограма, се користи мнемоничкиот кодПОВИК или ЈСР („Скокни до Подрутина"). Сепак, мнемоничките кодови за повеќето команди за главните типови на микропроцесори се исти или малку се разликуваат, бидејќи тие се кратенки на соодветните англиски зборови кои ја дефинираат операцијата што се изведува. Да ги погледнеме командите мнемонички кодови усвоени за процесоритеПентиум.

Наредби за препраќање. Главниот тим на оваа група е тимотMOV , кој обезбедува пренос на податоци помеѓу два регистри или помеѓу регистар и мемориска ќелија. Некои микропроцесори спроведуваат трансфери помеѓу две мемориски ќелии, како и масовни преноси на содржината на неколку регистри од меморијата. На пример, микропроцесори од семејството 68Моторола ххх извршете ја командатаДВИЖЕТЕ , обезбедувајќи трансфер од една мемориска ќелија во друга и командатаМОВЕМ , кој запишува во меморија или ја вчитува од меморијата содржината на одреден сет на регистри (до 16 регистри). ТимXCHG меѓусебно ја разменува содржината на два процесорски регистри или регистер и мемориска ќелија.

Внесени команди ВО и излез ИЗЛЕЗ спроведување на испраќање податоци од процесорски регистар на надворешен уред или примање податоци од надворешен уред во регистар. Овие команди го одредуваат бројот на интерфејс уредот (влезен/излезен приклучок) преку кој се пренесуваат податоците. Забележете дека многу микропроцесори немаат посебни команди за пристап до надворешни уреди. Во овој случај, внесување и излез на податоци во системот се врши со помош на командатаMOV , што ја одредува адресата на потребниот интерфејс уред. Така, надворешниот уред се адресира како мемориска ќелија, а одреден дел се доделува во адресниот простор во кој се наоѓаат адресите на интерфејс уредите (порти) поврзани со системот.

Наредби за аритметички операции. Главните команди во оваа група се собирање, одземање, множење и делење, кои имаат голем број на опции. Команди за додавање ДОДАЈ и одземање ПОД врши соодветните операции совго поседуваат два регистри, регистер и мемориска локација, или со користење на непосреден операнд. Тимови АД В , С.Б. Б врши собирање и одземање земајќи ја предвид вредноста на атрибутотВ, поставено при формирање на пренос за време на извршувањето на претходната операција. Користејќи ги овие команди, се имплементира секвенцијално собирање на операнди, чиј број на битови го надминува капацитетот на процесорот. Тим Н.Е.Г. го менува знакот на операндот, претворајќи го во комплемент од два.

Операциите за множење и делење може да се извршат на потпишани броеви (наредбиЈас MUL, Јас DIV ) или непотпишана (наредби MUL, DIV Еден од операндите секогаш се наоѓа во регистар, вториот може да биде во регистар, мемориска ќелија или да биде непосреден операнд. Резултатот од операцијата се наоѓа во регистарот. При множење (наредбиМУЛ , ИМУЛ ) резултатот е двобитен, за кој се користат два регистри. При делење (наредбиDIV , ИДИВ ) како дивиденда, се користи двобитен операнд, сместен во два регистри и како резултат на тоа, количникот и остатокот се запишуваат во два регистри.

Наредби за логичка операција . Речиси сите микропроцесори вршат логички операции И, ИЛИ, Ексклузивно ИЛИ, кои се изведуваат на истите битови од операнди со помош на команди И, ИЛИ, X ИЛИ . Операциите се вршат на содржината на два регистри, регистар и мемориска локација или со користење на непосреден операнд. Тим НЕ ја инвертира вредноста на секој бит од операндот.

Shift Commands. Микропроцесорите вршат аритметички, логички и циклични поместувања на адресираните операнди за еден или повеќе битови. Операндот што треба да се префрли може да биде во регистар или мемориска локација, а бројот на битови за поместување е одреден со непосредниот операнд содржан во инструкцијата или одреден од содржината на наведениот регистар. Знакот за трансфер обично е вклучен во спроведувањето на сменатаВво статус регистарот (С.Р.или ЕЗНАМЕ), кој го содржи последниот бит од операндот отстранет од регистарот или мемориската ќелија.

Наредби за споредба и тестирање . Споредбата на операнди обично се прави со помош на командатаCMP , кој ги одзема операндите и ги поставува вредностите на карактеристиките N, Z, V, Cво статусниот регистар според добиениот резултат. Во овој случај, резултатот од одземањето не е зачуван, а вредностите на операндите не се менуваат. Последователната анализа на добиените вредности на карактеристиките ни овозможува да ја одредиме релативната вредност (>,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

Некои микропроцесори ја извршуваат тест командата TST , што е верзија со еден операнд на инструкцијата за споредување. Кога ќе се изврши оваа команда, знаците се поставени Н, Зспоред знакот и вредноста (еднаква или ненула) на адресираниот операнд.

Инструкции за работа со битови . Овие команди ја поставуваат вредноста на атрибутотВво статусниот регистар во согласност со вредноста на битот што се тестирабн во адресираниот операнд. Во некои микропроцесори, врз основа на резултатот од бит-тестирањето, атрибутот е поставенЗ. Број на тест битnсе одредува или со содржината на регистарот наведена во командата или со непосредниот операнд.

Командите на оваа група имплементираат различни опции за менување на битот што се тестира БТ ја задржува вредноста на овој бит непроменета.Команда Б Т С пост-тест ја поставува вредноста бн=1, и командата Б Т В - значење бн=0.Тим Б Т В ја инвертира вредноста на битот bn откако ќе го тестира.

Програмски операции за управување. За контрола на програмата, се користат голем број на команди, меѓу кои се:

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

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

- тимови за организирање програмски циклуси;

- прекини команди;

- команди за промена на атрибути.

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

Потпрограма се повикува и со безусловно пренесување на контролата со помош на командатаПОВИК (или ЈСР ). Меѓутоа, во овој случај, пред да се вчита вокомпјутер нова содржина која ја одредува адресата на првата команда на потпрограмата, неопходно е да се зачува нејзината моментална вредност (адресата на следната команда) за да се обезбеди враќање на главната програма по извршувањето на потпрограмата (или на претходната потпрограма кога се вгнездуваат потпрограми). Условните команди за скокови (програмски гранки) се вчитуваат вокомпјутернова содржина доколку се исполнети одредени услови, кои обично се поставуваат според моменталната вредност на различни атрибути во статусниот регистар. Ако условот не е исполнет, тогаш се извршува следната програмска команда.

Командите за контрола на функции обезбедуваат пишување - читање на содржината на статусниот регистар во кој се зачувани карактеристиките, како и менување на вредностите на поединечните карактеристики. На пример, Pentium процесорите ги имплементираат командите LAHF И САХФ , кои го вчитуваат нискиот бајт, кој ги содржи знаците, од статусниот регистар ЕФЛАГдо нискиот бајт на регистарот EAXи пополнување на нискиот бајт ЕЗНАМЕод регистарот Е АX.. Тимови CLC, STCизврши поставување на вредностите на знакот за пренос CF=0, CF=1 и командата ЦУКпредизвикува вредноста на овој атрибут да се преврти.Бидејќи атрибутите го одредуваат текот на извршувањето на програмата за време на условните транзиции, командите за промена на атрибутот обично се користат за контрола на програмата.

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

Специјални тимови CLI, СПИ забрани и овозможува сервисирање на барања за прекин. Во процесоритеПентиум за ова се користи контролен бит (знаме).АКОво регистарот ЕЗНАМЕ.

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

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

Некои процесори вршат аритметички операции со бинарни-децимални броеви или извршуваат специјални инструкции за да го поправат резултатот при обработката на таквите броеви. Вклучуваат многу процесори со високи перформанси FPU - единица за обработка на броевив „подвижна точка“.

Голем број современи процесори спроведуваат групна обработка на неколку цели броеви или броевив „подвижна точка“ користејќи една команда според принципот SIMD („Единечна инструкција – повеќе податоци“ ”) - „Една команда – многу податоци“. Истовременото извршување на операции на повеќе операнди значително ги подобрува перформансите на процесорот при работа со видео и аудио податоци. Ваквите операции се широко користени за обработка на слики, аудио сигнали и други апликации. За извршување на овие операции, во процесорите се воведени специјални блокови кои ги имплементираат соодветните множества на инструкции, кои кај различни типови процесори (Пентиум, Атлон) го доби иметоMMX (“ Милти- Медиумска екстензија ”) – Мултимедијална екстензија,ЈЈИ(„Продолжување на SIMD за стриминг“) – Стриминг на SIMD - продолжување, “3 ДПродолжување– Тридимензионално проширување.

Карактеристична карактеристика на процесорите на компанијатаИнтел , почнувајќи од моделот 80286, е приоритетна контрола при пристап до меморијата, што се обезбедува кога процесорот работи во режим на заштитени виртуелни адреси - “Заштитен режим ” (заштитен режим). За имплементација на овој режим, се користат специјални групи на команди, кои служат за организирање на заштитата на меморијата во согласност со усвоениот приоритетен алгоритам за пристап.

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

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

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

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

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

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

Модели на меморија Пред да декларирате сегменти, треба да го наведете моделот на меморија користејќи директива. МОДЕЛ модификатор memory_model, calling_convention, OS_type, stack_parameter Основни модели на меморија на асемблерски јазик: Адресирање на мемориски модел Адресирање на податоци Адресирање на податоци Оперативен систем Шифра и преплетување на податоци МАЛО БЛИЗИРА НА MS-DOS, Windows Не СРЕДНО ДАЛЕКУ-БЛИЗОР 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 - модел со рамна меморија. Овој модел на меморија се користи во операционата сала Виндоус систем. stdcall - се користи постапката за повикување на конвенцијата.

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

Преведувачи на асемблерски јазици Преведувачот е програма или техничка алатка која конвертира програма претставена на еден од програмските јазици во програма на целниот јазик, наречена објектен код. Покрај поддршката за мнемоника на машински инструкции, секој преведувач има свој сет на директиви и макро алатки, честопати некомпатибилни со ништо друго. Главните типови на преведувачи на асемблерски јазици: 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

Структури во асемблерски јазик

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

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

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

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

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

За да користите структури во програма, мора да извршите три чекори:

    Поставете шаблон за структура .

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

    Дефинирај структура пример .

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

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

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

Опишете структурата во програмата едноставно значи означување на нејзиниот преглед или шема; меморијата не е доделена.

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

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

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

Опис на шаблонот за структура

Описот на шаблонот на структурата ја има следнава синтакса:

структура_име STRUC

структура_име КРАЈ

Еве е низа од директиви за опис на податоци db, dw, dd, dqИ dt.

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

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

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

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

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

Ајде да ја дефинираме структурата на записите на оваа база на податоци со следниов образец:

Дефинирање на податоци со тип на структура

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

[име на променлива] структура_име

    име на променлива- идентификатор на променлива од овој тип на структура.

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

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

    Неговата задача е исто така опционална.

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

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

    На пример: победнички работник.

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

Методи за работа со структура

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

Јазикот мора да има средство за пристап до овие променливи во специфичен примерок од структурата. За да се упати на поле од некоја структура во командата, се користи специјален оператор - симбол". " (точка). Се користи во следнава синтакса:

    адреса_израз- идентификатор на променлива од некој структурен тип или израз во загради во согласност со синтаксните правила наведени подолу (сл. 1);

    структура_поле_име- име на поле од шаблонот за структура.

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

Така операторот " . " (точка) го оценува изразот

Ориз. 5. Синтакса на адресен израз во оператор за пристап на поле за структура

Дозволете ни да демонстрираме користејќи го примерот на структурата што ја дефиниравме. работник некои техники за работа со структури.

На пример, екстракт до секиравредности на полето со возраста. Бидејќи е малку веројатно дека возраста на работното лице ќе биде поголема од 99 години, по ставањето на содржината на ова поле за знаци во регистарот секираЌе биде погодно да се претвори во бинарно претставување со командата аад.

Бидете внимателни бидејќи поради принципот на складирање податоци „низок бајт при ниска адреса“ќе биде ставена највисоката цифра на возраста ал, а најмладиот - во ах.

За да направите прилагодувања, само користете ја командата xchg al,ah:

mov ax,word ptr sotr1.age ;in al age sotr1

или можете да го направите вака:

Понатамошната работа со низа структури се изведува на ист начин како и со еднодимензионална низа. Овде се наметнуваат неколку прашања:

Што да се прави со големината и како да се организира индексирање на елементите на низата?

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

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

На пример:

Како да копирате поле од една структура во соодветното поле на друга структура? Или како да ја копирате целата структура? Ајде да го копираме полето намтрет вработен на терен нампетти вработен:

mas_sotr работник 10 dup()

mov bx, offset mas_sotr

mov si,(работник од типот)*2 ;si=77*2

mov di,(работник од типот)*4 ;si=77*4

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

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

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

Командите може да се разликуваат по намена (примери за мнемонички оперативни шифри на командите за асемблерот на IBM PC се дадени во загради):

l вршење аритметички операции (ADD и ADC - собирање и собирање со носење, SUB и SBB - одземање и одземање со позајмување, MUL и IMUL - множење без знак и знак, DIV и IDIV - неозначено и потпишано делење, CMP - споредби итн.);

l вршење на логички операции (ИЛИ, И, НЕ, XOR, ТЕСТ, итн.);

l пренос на податоци (MOV - напред, XCHG - размена, IN - влез во микропроцесорот, OUT - излез од микропроцесорот итн.);

l пренос на контрола (програмски гранки: JMP - безусловен скок, CALL - повик на процедура, RET - враќање од процедура, J* - условен скок, LOOP - контрола на јамка итн.);

l обработка на низи со знаци (MOVS - трансфери, CMPS - споредби, LODS - вчитува, SCAS - скенира. Овие команди обично се користат со префиксот (модификатор за повторување) РЕП;

l програмски прекини (INT - софтверски прекини, INTO - условен прекин при прелевање, IRET - враќање од прекин);

l контрола на микропроцесорот (ST* и CL* - ознаки за поставување и ресетирање, HLT - запирање, WAIT - чекање, NOP - лер, итн.).

СО целосна листаКомандите за склопување може да се најдат во делата.

Наредби за пренос на податоци

l MOV dst, src - пренос на податоци (премести - испрати од src во dst).

Пренесува: еден бајт (ако src и dst се во формат на бајт) или еден збор (ако src и dst се во формат на Word) помеѓу регистри или помеѓу регистар и меморија, и запишува директна вредност во регистар или меморија.

Операндите dst и src мора да имаат ист формат - бајт или збор.

Src може да биде од следниот тип: r (регистер) - регистар, m (меморија) - меморија, i (импеданса) - непосредна вредност. Dst може да биде од типот r, m. Не можете да ги користите следните операнди во една команда: rsegm заедно со i; два операнди од типот m и два операнди од типот rsegm). Операндот i може да биде и едноставен израз:

mov AX, (152 + 101B) / 15

Евалуацијата на изразот се врши само за време на преводот. Не ги менува знамињата.

l PUSH src - туркање збор на оџакот (туркање - протурка; турнете на оџакот од src). Ја става содржината на src - кој било 16-битен регистар (вклучувајќи сегментен регистар) или две мемориски ќелии што содржат 16-битен збор - на врвот на стекот. Знамињата не се менуваат;

l POP dst - исфрли збор од стекот (pop - pop; брои од стек до dst). Отстранува збор од врвот на оџакот и го става во dst - кој било 16-битен регистар (вклучувајќи и сегментен регистар) или во две мемориски ќелии. Знамињата не се менуваат.

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

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

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

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

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

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

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

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

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

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

Брои 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 е програмски блок кој содржи код.
СТАРТ - етикета. Во асемблер, ознаките играат голема улога, што не може да се каже за современите јазици на високо ниво.
КРАЈ СТАРТ - крај на програмата и порака до преведувачот дека извршувањето на програмата треба да започне со ознаката СТАРТ.
Секој модул мора да содржи END директива, означувајќи го крајот на изворниот код на програмата. Сите линии што ја следат директивата КРАЈ се игнорираат. Ако ја испуштите директивата КРАЈ, се генерира грешка.
Ознаката наведена по директивата КРАЈ му го кажува на преведувачот името на главниот модул од кој започнува извршувањето на програмата. Ако програмата содржи еден модул, ознаката по директивата КРАЈ може да се изостави.




Врв