Структурата на инструкциите за асемблерен език съдържа. Асемблерни команди (лекция)

Асемблерни команди (лекция)

ПЛАН ЗА ЛЕКЦИИ

1. Основните групи операции.

Пентиум.

1. Основни групи операции

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

Спедиторски операции,

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

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

Операции на смяна,

Тестови операции за сравнение,

Битови операции,

Операции за контрол на програми;

Операции за управление на процесора.

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

Когато се описват команди, обикновено се използват мнемоничните им обозначения (мнемонични кодове), които се използват за задаване на командата при програмиране на асемблерен език. За различните версии на Assembler мнемоничните кодове на някои команди могат да се различават. Например за команда за извикване на подпрограма се използва мнемоничният кодОБАДИ СЕ или JSR („Направо към Подпрограма”). Мнемоничните кодове на повечето команди за основните типове микропроцесори съвпадат или се различават леко, тъй като те са съкращения на съответните английски думи, които определят операцията, която се извършва. Помислете за мнемоничните кодове на команди, приети за процесориПентиум.

Команди за препращане. Основният отбор на тази група е отборътMOV , който осигурява трансфер на данни между два регистъра или между регистър и клетка с памет. Някои микропроцесори реализират трансфер между две клетки на паметта, както и групов трансфер на съдържанието на няколко регистъра от паметта. Например микропроцесори от семейство 68xxx от Motorola изпълнете командатаХОД , осигурявайки прехвърляне от една клетка памет в друга, и командатаMOVEM , който записва в паметта или зарежда от паметта съдържанието на даден набор от регистри (до 16 регистри). КомандаXCHG прави взаимен обмен на съдържанието на два регистъра на процесора или регистър и клетка памет.

Команди за въвеждане IN и оттегляне ВЪН прехвърляне на данни от регистър на процесор към външно устройство или получаване на данни от външно устройство към регистър. Тези команди указват номера на интерфейсното устройство (I / O порт), през което се прехвърлят данните. Имайте предвид, че много микропроцесори нямат специални команди за достъп до външни устройства. В този случай въвеждането и извеждането на данни в системата се извършва с помощта на командатаMOV , в който е зададен адресът на необходимото интерфейсно устройство. По този начин към външно устройство се адресира като клетка памет и в адресното пространство се разпределя определен раздел, в който се намират адресите на интерфейсни устройства (портове), свързани към системата.

Аритметични команди. Основните команди в тази група са командите за събиране, изваждане, умножение и деление, които имат няколко опции. Команди за добавяне ДОБАВЕТЕ и изваждане SUB извършват подходящи операции с° Собсебен от два регистъра, регистър и местоположение в паметта или използване на непосредствен операнд. Команди От н.е. ° С , SB Б. събирането и изваждането се извършват, като се отчита стойността на атрибута° С, който се задава, когато трансферът се формира по време на предишната операция. С помощта на тези команди се реализира последователното добавяне на операнди, чийто брой битове надвишава битовия капацитет на процесора. Команда NEG променя знака на операнда, превръщайки го в допълващ код.

Операциите за умножение и деление могат да се извършват върху подписани числа (командиАз MUL, Аз DIV ) или неподписани (команди MUL, DIV Един от операндите винаги се разпределя в регистър, другият може да бъде в регистър, място в паметта или директен операнд. Резултатът от операцията се намира в регистъра. При умножаване (командиМУЛ , IMUL ), резултатът е двуцифрен резултат, за който се използват два регистъра. При разделяне (командиDIV , IDIV ) като дивидент се използва двуцифрен операнд, разположен в два регистъра и в резултат коефициентът и остатъкът се записват в два регистъра.

Булеви команди ... Почти всички микропроцесори изпълняват логически операции И, ИЛИ, Изключително ИЛИ, които се изпълняват върху едни и същи битове на операндите с помощта на команди И ИЛИ х ИЛИ ... Операциите се извършват върху съдържанието на два регистъра, регистър и място в паметта, или с помощта на непосредствен операнд. Команда НЕ инвертира стойността на всеки бит от операнда.

Команди за смяна... Микропроцесорите извършват аритметични, логически и циклични измествания на адресираните операнди с един или повече бита. Преместеният операнд може да бъде разположен в регистър или място в паметта и броят на битовете за смяна се определя с помощта на непосредствения операнд, съдържащ се в инструкцията, или определен от съдържанието на посочения регистър. Знакът за носене обикновено участва в изпълнението на смяната° С в регистъра на състоянието (SRили ЕЛАГИ), в който се намира последният бит на операнда, който се премахва от регистъра или клетката на паметта.

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

Някои микропроцесори изпълняват тестовата команда TST , което е вариант с един операнд на командата за сравнение. Изпълнението на тази команда задава N, Z според знака и стойността (равна или не равна на нула) на адресирания операнд.

Команди за битови операции ... Тези команди задават стойността на атрибута° С в регистъра на състоянието според стойността на тествания битбн в адресирания операнд. В някои микропроцесори, според резултата от тестването на бита, знакът е зададенZ.... Номер на тестовия битн се задава или от съдържанието на регистъра, посочен в командата, или от директен операнд.

Командите от тази група реализират различни опции за промяна на тествания бит. BT запазва стойността на този бит непроменена. Б. т С след тестване задава стойността бн\u003d 1 и командата Б. т ° С - стойност бн\u003d 0 команда Б. т ° С инвертира стойността на bn бита след тестването му.

Операции по управление на програми. За управление на програмата се използват голям брой команди, сред които са:

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

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

- екипи за организиране на програмни цикли;

- команди за прекъсване;

- команди за промяна на характеристиките.

Безусловното прехвърляне на контрол се извършва от командатаJMP който се зарежда в брояча на програматанастолен компютър ново съдържание, което е адресът на следващата команда за изпълнение. Този адрес е директно посочен в командатаJMP (директно адресиране) или изчислено като сбор от текущото съдържаниенастолен компютър и отместването на командата, което е подписан номер (относително адресиране). Защотонастолен компютър съдържа адреса на следващата команда на програмата, след това последният метод задава отместването на адреса за прескачане от следващия адрес с определен брой байтове. При положително отместване се извършва преходът към следващите команди на програмата, при отрицателно отместване - към предишните.

Извикване на подпрограма също се извършва чрез безусловно прехвърляне на управление с помощта на командатаОБАДИ СЕ (или JSR ). В този случай обаче, преди зареждане внастолен компютър ново съдържание, което задава адреса на първата команда на подпрограмата, е необходимо да се запази текущата й стойност (адресът на следващата команда), за да се осигури връщане към основната програма (или към предишната подпрограма при влагане на подпрограми) след изпълнението на подпрограмата. Командите за условни клонове (програмни клонове) се зареждат внастолен компютър ново съдържание, ако са изпълнени определени условия, които обикновено се задават в съответствие с текущата стойност на различни знаци в регистъра на състоянието. Ако условието не е изпълнено, се изпълнява следващата команда на програмата.

Командите за управление на функции осигуряват писане - четене на съдържанието на регистъра на състоянието, в който се съхраняват характеристики, както и промяна на стойностите на отделните характеристики. Например в процесорите на Pentium се изпълняват командите LAHF и SAHF които зареждат малкия байт, съдържащ знаците от регистъра на състоянието EFLAG до ниския байт на регистъра EAX и запълване на ниския байт ЕЛАГИ от регистър E Aх.. Екипи CLC, STC извършете настройката на стойностите на знака за прехвърляне CF \u003d 0, CF \u003d 1 и командата CMC причинява инверсията на стойността на този атрибут. Тъй като знаците определят хода на изпълнение на програмата по време на условни скокове, командите за промяна на знаци обикновено се използват за управление на програмата.

Команди на процесора ... Тази група включва команди за спиране, без операции и определен брой команди, които определят режима на работа на процесора или отделните му блокове. КомандаHLT прекратява изпълнението на програмата и поставя процесора в състояние на спиране, излизането от което се случва при получаване на сигнал за прекъсване или рестартиране (Нулиране). Команда НЕ (Команда "Empty"), която не предизвиква изпълнението на каквито и да е операции, се използва за изпълнение на програмни закъснения или запълване на пропуските, образувани в програмата.

Специални команди CLI, STI деактивирайте и активирайте услугата за заявки за прекъсване. В процесориПентиум за това се използва контролния бит (флаг)АКО в регистъра ЕЛАГИ.

Много съвременни микропроцесори изпълняват команда за идентификация, която позволява на потребител или друго устройство да получи информация за типа на процесора, използван в дадена система. В процесори Пентуим командата се използва за това CPUID , когато се изпълняват, необходимите данни за процесора отиват в регистрите EAX,EBX,ECX,EDX и след това могат да бъдат прочетени от потребителя или операционната система.

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

Някои процесори извършват аритметични операции с двоично-десетични числа или изпълняват специални команди за коригиране на резултата при обработка на такива числа. Включват се много високопроизводителни процесориFPU - единица за обработка на номера° С Плаваща точка.

Редица съвременни процесори изпълняват групова обработка на няколко цели числа или числа° С Плаваща точка с една инструкцияSIMD („Единична инструкция - множество данни ”) -„ Една команда - Много данни “. Едновременното изпълнение на операции върху няколко операнда значително подобрява производителността на процесора при работа с видео и аудио данни. Такива операции се използват широко за обработка на изображения, аудио сигнали и други приложения. За извършване на тези операции в процесорите са въведени специални блокове, които изпълняват съответните набори от инструкции, които в различни видове процесори (Pentium, Атлон) бяха посочениMMX (“ Милти- Media Extension ”) - Мултимедийно разширение,SSE („Streaming SIMD Extension“) - Streaming SIMD - удължаване, “3 дУдължаване - 3D разширение.

Характерна особеност на процесорите на компаниятаIntel , започвайки с модела 80286, има приоритетен контрол при достъп до паметта, който се предоставя, когато процесорът работи в режим на защитен виртуален адрес - “Защитен режим ”(Защитен режим). За реализиране на този режим се използват специални групи команди, които служат за организиране на защита на паметта в съответствие с приетия алгоритъм за приоритетен достъп.

По предназначение могат да се разграничават команди (в скоби са примери за мнемонични кодове на операции на асемблерни команди на компютър като 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 - сканиране. Тези команди обикновено се използват с префикса (модификатор на повторение) REP;

l програмни прекъсвания (INT - софтуерни прекъсвания, INTO - условни прекъсвания в случай на преливане, IRET - връщане от прекъсване);

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

Пълен списък с асемблерни команди може да се намери в произведенията.

Команди за пренос на данни

l MOV dst, src - прехвърляне на данни (преместване - прехвърляне от src към dst).

Трансфери: един байт (ако src и dst са в байтов формат) или една дума (ако src и dst са във формат на думи) между регистрите или между регистър и памет, а също така записва незабавна стойност в регистър или памет.

Операндите 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-битов регистър (включително сегмент) или две места в паметта. Знамената не се сменят.

За да може една машина да изпълнява човешки команди на хардуерно ниво, е необходимо да зададете определена последователност от действия на езика на „нули и единици“. Асемблерът ще стане помощник по този въпрос. Това е програма, която работи с превода на команди на машинен език. Написването на програма обаче е много трудоемък и сложен процес. Този език не е предназначен да създава леки и прости действия. В момента всеки използван език за програмиране (Assembler работи чудесно) ви позволява да пишете специални ефективни задачи, които силно влияят на работата на хардуера. Основната цел е да се създадат микроинструкции и малки кодове. Този език предоставя повече възможности, отколкото например Pascal или C.

Кратко описание на езиците на асемблера

Всички езици за програмиране са разделени на нива: ниско и високо. Всяка от синтактичната система на „семейството“ на Assembler се различава по това, че съчетава някои от предимствата на най-често срещаните и модерни езици наведнъж. Общото между тях е, че компютърната система може да се използва изцяло.

Отличителна черта на компилатора е неговата лекота на използване. Това е, което го прави различен от тези, които работят само с високи нива. Ако вземете предвид такъв език за програмиране, Assembler е два пъти по-бърз и по-добър. Не отнема твърде много време, за да напишете лека програма в него.

Накратко за структурата на езика

Ако говорим най-общо за работата и структурата на функционирането на езика, можем със сигурност да кажем, че неговите команди напълно съответстват на тези на процесора. Тоест Асемблерът използва мнемоничните кодове, които са най-удобни за писане от хората.

За разлика от други езици за програмиране, Assembler използва специфични етикети вместо адреси, за да пише местоположения в паметта. Те се превръщат в така наречените директиви с процеса на изпълнение на кода. Това са относителни адреси, които не засягат процесора (те не се превеждат на машинен език), но са необходими за разпознаване от самата среда за програмиране.

Всяка линия на процесора има своя собствена. В този случай всеки процес ще бъде правилен, включително преведеният

Асемблерният език има няколко синтаксиса, които ще бъдат разгледани в статията.

Плюсове на езика

Най-важната и удобна характеристика на асемблерния език ще бъде, че в него можете да напишете всяка програма за процесора, която ще бъде много компактна. Ако кодът се окаже огромен, тогава някои процеси се пренасочват към RAM. В същото време те правят всичко достатъчно бързо и без грешки, освен ако, разбира се, не се контролират от квалифициран програмист.

Драйверите, операционните системи, BIOS, компилаторите, интерпретаторите и др., Са всички програми за асемблерен език.

Когато използвате разглобявач, който превежда от машина на машина, можете лесно да разберете как работи тази или онази системна задача, дори ако няма обяснение за нея. Това обаче е възможно само ако програмите са леки. За съжаление е доста трудно да се разберат нетривиални кодове.

Недостатъци на езика

За съжаление е трудно за начинаещи програмисти (и често професионалисти) да анализират езика. Асемблерът изисква подробно описание на необходимата команда. Поради необходимостта от използване на машинни инструкции се увеличава вероятността от грешни действия и сложността на изпълнението.

За да напише дори най-простата програма, програмистът трябва да е квалифициран и нивото му на знания е достатъчно високо. Средният специалист, за съжаление, често пише лоши кодове.

Ако платформата, за която е създадена програмата, се актуализира, тогава всички команди трябва да бъдат пренаписани ръчно - това се изисква от самия език. Асемблерът не поддържа функцията за автоматично регулиране на състоянието на процесите и замяната на каквито и да било елементи.

Езикови команди

Както бе споменато по-горе, всеки процесор има свой собствен набор от инструкции. Най-простите елементи, които се разпознават от всякакъв тип, са следните кодове:


Използване на директиви

Програмирането на микроконтролери на езика (Assembler го позволява и се справя перфектно с функционирането) на най-ниското ниво в повечето случаи завършва успешно. Най-добре е да използвате процесори с ограничени ресурси. За 32-битовата технология този език е отличен. Често можете да видите директиви в кодовете. Какво е това? И за какво се използва?

Първо, трябва да подчертаете, че директивите не се превеждат на машинен език. Те управляват начина, по който работи компилаторът. За разлика от командите, тези параметри, имащи различни функции, се различават не поради различни процесори, а поради различен преводач. Сред основните директиви са следните:


произход на името

Защо езикът получи името си - "Асемблер"? Говорим за преводач и компилатор, които криптират данни. На английски Assembler означава нищо повече от асемблер. Програмата не се сглобява ръчно, използва се автоматична структура. Освен това в момента разликата между термините вече е изчезнала сред потребителите и специалистите. Асемблерният език често се нарича езици за програмиране, макар че той е просто полезна програма.

Поради общоприетото колективно име, някои хора получават погрешното решение, че има един език на ниско ниво (или стандартни норми за него). За да може програмистът да разбере за каква структура говорим, е необходимо да се изясни за коя платформа се използва този или онзи асемблерен език.

Макро инструменти

Асемблерните езици, които са сравнително скорошни, имат макросъоръжения. Те улесняват писането и стартирането на програмата. Поради тяхното присъствие преводачът изпълнява написания код многократно по-бързо. Когато създавате условен избор, можете да напишете огромен блок от команди, но е по-лесно да използвате макро инструменти. Те ще ви позволят бързо да превключвате между действия в случай, че дадено условие е изпълнено или не.

Когато използва директиви на езика на макросите, програмистът получава макроси за сглобяване. Понякога може да се използва широко, а понякога функционалността му се свежда до една команда. Тяхното присъствие в кода улеснява работата с него, прави го по-ясен и по-интуитивен. Все пак трябва да внимавате - в някои случаи макросите, напротив, влошават ситуацията.

Курсова работа

В дисциплината "Системно програмиране"

Тема номер 4: „Решаване на задачи за процедури“

Вариант 2

ИЗТОЧЕН СИБИРСКИ ДЪРЖАВЕН УНИВЕРСИТЕТ

ТЕХНОЛОГИЯ И КОНТРОЛ

____________________________________________________________________

ТЕХНОЛОГИЧЕН КОЛЕДЖ

ЗАДАЧАТА

за курсова работа

Дисциплина:
Тема: Решаване на проблеми за процедури
Изпълнител (и): Главинская Арина Александровна
Ръководител: Дамбаева Сесегма Викторовна
Резюмето на работата: изучаване на рутините на асемблерен език,
решаване на проблеми с помощта на подпрограми
1. Теоретична част: Основна информация за езика на събранието (комплект
команди и др.), Организиране на подпрограми, Методи за предаване на параметри
в подпрограмите
2. Практическа част: Разработете две подпрограми, едната от които преобразува дадена буква в главни (включително за руски букви), а другата преобразува буква в малка буква.
преобразува всяка дадена буква в главна буква, а другата преобразува буквата в малка буква.
преобразува буква в малка буква.
Срокове на проекта по график:
1. Теоретична част - 30% за 7 седмици.
2. Практическа част - 70% до 11 седмици.
3. Защита - 100% до 14 седмица.
Изисквания за регистрация:
1. Споразумението и обяснителната бележка за курсовия проект трябва да бъдат представени в
електронни и хартиени копия.
2. Обемът на доклада трябва да бъде най-малко 20 машинописни страници без прикачените файлове.
3. RPZ се изготвя в съответствие с GOST 7.32-91 и се подписва от ръководителя.

Ръководител работа __________________

Изпълнител __________________

Дата на издаване " 26 " септември 2017 ж.


Въведение. 2

1.1 Основна информация за езика на събранието. 3

1.1.1 Набор от команди. 4

1.2 Организиране на подпрограми на асемблерен език. 4

1.3 Методи за предаване на параметри в подпрограмите. 6

1.3.1 Предаване на параметри през регистри 6

1.3.2 Предаване на параметри през стека. 7

2 ПРАКТИЧЕСКИ РАЗДЕЛ 9

2.1 Изложение на проблема. девет

2.2 Описание на решението на проблема. девет

2.3 Тестване на програмата .. 7

Заключение. осем

Препратки .. 9


Въведение

Общоизвестно е, че програмирането в Assembler е трудно. Както знаете, сега има много различни езици. високо нивокоито ви позволяват да отделите много по-малко усилия за писане на програми. Естествено възниква въпросът кога може да се наложи програмист да използва Assembler, когато пише програми. В момента има две области, в които използването на асемблерен език е оправдано и често необходимо.

Първо, това са така наречените машинно зависими системни програми, обикновено те контролират различни устройства на компютъра (такива програми се наричат \u200b\u200bдрайвери). Тези системни програми използват специални машинни инструкции, които не е необходимо да се използват в обикновени (или, както се казва приложени) програми. Тези команди са невъзможни или трудни за дефиниране на език от високо ниво.

Втората област на приложение на Асемблера е свързана с оптимизирането на изпълнението на програмата. Много често програмите за превод (компилатори) от езици на високо ниво създават много неефективна програма за машинен език. Това обикновено се отнася за програми от изчислителен характер, при които много малка (около 3-5%) част от програмата (основната верига) се изпълнява през повечето време. За да се реши този проблем, могат да се използват така наречените системи за многоезично програмиране, които ви позволяват да пишете части от програмата на различни езици. Обикновено основната част от програмата е написана на език за програмиране на високо ниво (Fortran, Pascal, C и др.), А критичните за времето раздели на програмата са написани в Assembler. В този случай скоростта на цялата програма може да бъде значително увеличена. Това често е единственият начин да накарате програмата да постигне резултат за разумен период от време.

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

Работни задачи:

1. Научете основна информация за езика на Асемблер (структура и компоненти на програма Асемблер, форматът на командите, организацията на подпрограмите и др.);

2. Да проучи видовете битови операции, формата и логиката на логическите инструкции на Асемблера;

3. Решаване на индивидуален проблем с използването на подпрограми в Assembler;

4 .. Формулирайте заключение за свършената работа.

1 ТЕОРЕТИЧЕН РАЗДЕЛ

Разбиране на езика на събранието

Assembler е език за програмиране на ниско ниво, който е четим от човека формат за писане на машинни инструкции.

Инструкциите на асемблерния език съответстват едно към едно с инструкциите на процесора и всъщност представляват удобна символна форма на нотация (мнемоничен код) на команди и техните аргументи. Също така, асемблерният език предоставя основни софтуерни абстракции: свързване на части от програма и данни чрез етикети със символни имена и директиви.

Директивите на Assembler ви позволяват да включите блокове с данни (описани изрично или прочетени от файл) в програмата; повторете определен фрагмент определен брой пъти; компилирайте фрагмент условно; задайте адреса на изпълнение на фрагмента, променете стойностите на етикета по време на компилацията; използвайте макроси с параметри и т.н.

Предимства и недостатъци

· Минималното количество излишен код (като се използват по-малко инструкции и достъп до паметта). В резултат на това - по-висока скорост и по-малък размер на програмата;

· Големи количества код, голям брой допълнителни малки задачи;

· Лоша четливост на кода, трудности при поддръжката (отстраняване на грешки, добавяне на функции);

· Трудността при прилагането на парадигми за програмиране и всякакви други донякъде сложни конвенции, сложността на съвместното развитие;

· По-малко налични библиотеки, тяхната ниска съвместимост;

· Директен достъп до хардуер: входно-изходни портове, специални регистри на процесора;

· Максимално „пригодност“ за желаната платформа (използване на специални инструкции, технически характеристики на „хардуер“);

· Нетолерантност към други платформи (с изключение на двоично съвместими).

В допълнение към инструкциите, една програма може да съдържа директиви: инструкции, които не се превеждат директно в машинни инструкции, но контролират работата на компилатора. Техният набор и синтаксис варират значително и зависят не от хардуерната платформа, а от използвания компилатор (пораждащи диалекти на езици в рамките на едно и също семейство архитектури). Като набор от директиви могат да се отделят:

· Дефиниция на данни (константи и променливи);

· Управление на организацията на програмата в паметта и параметрите на изходния файл;

· Задаване на режим на работа на компилатора;

· Всички видове абстракции (т.е. елементи на езици на високо ниво) - от проектирането на процедури и функции (за опростяване на изпълнението на парадигмата за процедурно програмиране) до условни структури и цикли (за парадигмата на структурираното програмиране);

· Макроси.

Команден набор

Типични команди на асемблерен език са:

Команди за пренос на данни (mov и др.)

Аритметични команди (add, sub, imul и др.)

Логически и битови операции (или, и, xor, shr и др.)

· Команди за контрол на изпълнението на програмата (jmp, loop, ret и др.)

Команди за прекъсване на повикване (понякога наричани команди за управление): int

I / O команди към портове (вход, изход)

За микроконтролери и микрокомпютри има и команди, които извършват проверка и преход по условие, например:

· Jne - преместване, ако не е равно;

· Jge - скок, ако е по-голям или равен.

1. Архитектура на компютъра ………………………………………………………… 5

    1.1. Регистри.

    1.1.1 Регистри с общо предназначение.

1.1.2. Сегментни регистри

1.1.3 Регистър на знамена

1.2. Организация на паметта.

1.3. Представяне на данни.

1.3.1 Типове данни

1.3.2 Представяне на символи и низове

2. Оператори на програмата в асемблер ……………………………………

    1. Команди на асемблерния език

2.2. Адресиране на режими и формати на машинни инструкции

3. Псевдооператори ……………………………………………………….

3.1 Директиви за определяне на данни

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

3.2.1 Програмни сегменти. Да приемем директива

3.2.3 Опростена директива за сегментиране

4. Сглобяване и свързване на програмата ………………………….

5. Команди за изпращане на данни …………………………………………….

    5.1 Общи команди

    5.2 Команди за работа със стека

5.3 I / O команди

5.4 Команди за препращане на адреси

5.5 Команди за изпращане на флагове

6. Аритметични команди ……………………………………………….

    6.1 Аритметични операции върху двоични цели числа

6.1.1 Събиране и изваждане

6.1.2 Команди за увеличаване и намаляване на приемника по един

6.2 Умножение и деление

6.3 Промяна на знака

7. Логически операции ……………………………………………………….

8. Смени и циклични смени …………………………………………

9. Струнни операции ……………………………………………………….

10. Логика и организация на програмите ………………………………………

10.1 Безусловни скокове

10.2 Условни скокове

10.4 Процедури на асемблерен език

10.5 INT прекъсвания

10.6 Системен софтуер

10.6.1.1 Четене на клавиатурата.

10.6.1.2 Показване на символи на екрана

10.6.1.3 Крайни програми.

10.6.2.1 Избор на режими на показване

11. Дискова памет ……………………………………………………… ..

11.2 Таблица за разпределение на файлове

11.3 Дискови I / O

11.3.1 Записване на файл на диск

11.3.1.1 Данни във формат ASCIIZ

11.3.1.2 Номер на файла

11.3.1.3 Създаване на дисков файл

11.3.2 Четене на дисков файл

Въведение

Асемблерният език е символично представяне на машинен език. Всички процеси в персонален компютър (компютър) на най-ниското, хардуерно ниво се управляват само от команди на машинен език (инструкции). Невъзможно е наистина да се решат проблеми, свързани с хардуера (или дори, освен това, зависими от хардуера проблеми като подобряване на производителността на програмата), без да се знае асемблер.

Assembler е удобна форма на команди директно за компютърни компоненти и изисква познаване на свойствата и възможностите на интегралната схема, съдържаща тези компоненти, а именно PC микропроцесора. По този начин асемблерният език е пряко свързан с вътрешната организация на компютъра. И не случайно почти всички компилатори на езици от високо ниво поддържат достъп до ниво програмиране на асемблерен език.

Елемент на обучението на професионален програмист е задължително изучаването на асемблер. Това е така, защото програмирането на асемблерен език изисква познаване на архитектурата на компютъра, което ви позволява да създавате по-ефективни програми на други езици и да ги комбинирате с асемблерни програми.

Ръководството се занимава с програмиране на асемблерен език за компютри, базирани на микропроцесори Intel.

Този урок е адресиран до всички, които се интересуват от архитектурата на процесора и основите на програмирането на асемблерен език, най-вече разработчиците на софтуер.

    PC архитектура.

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

Всички съвременни компютри имат някои общи и индивидуални свойства на архитектурата. Отделните свойства са присъщи само на конкретен компютърен модел.

Концепцията за компютърна архитектура включва:

    блок-схема на компютъра;

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

    набор и наличност на регистри;

    организация и методи за адресиране;

    метод на представяне и формат на компютърни данни;

    набор от компютърни машинни инструкции;

    формати на машинни инструкции;

    работа с прекъсвания.

Основните елементи на компютърния хардуер: системният блок, клавиатурата, дисплейните устройства, дисковите устройства, печатащите устройства (принтер) и различни комуникационни средства. Системният блок се състои от дънна платка, захранване и слотове за разширение за допълнителни карти. В системната платка има микропроцесор, памет само за четене (ROM), памет с произволен достъп (RAM) и копроцесор.

      Регистри.

Вътре в микропроцесора информацията се съдържа в група от 32 регистри (16 потребителски, 16 системни), до известна степен достъпни за използване от програмиста. Тъй като урокът е посветен на програмирането на микропроцесора 8088-i486, най-логично е да започнете тази тема, като обсъдите вътрешните микропроцесорни регистри, достъпни за потребителя.

Потребителските регистри се използват от програмиста за писане на програми. Тези регистри включват:

    осем 32-битови регистри (регистри с общо предназначение) EAX / AX / AH / AL, EBX / BX / BH / BL, ECX / CX / CH / CL, EDX / DX / DLH / DL, EBP / BP, ESI / SI, EDI / DI, ESP / SP;

    шест 16-битови сегментни регистри: CS, DS, SS, ES, FS, GS;

    регистри за състояние и контрол: регистър на флаг EFLAGS / FLAGS и регистър на указатели за инструкции EIP / IP.

Наклонената черта маркира части от един 32-битов регистър. Префиксът E (Extended) обозначава използването на 32-битов регистър. За работа с байтове се използват регистрите с префиксите L (нисък) и H (висок), например AL, CH - обозначаващи ниския и високия байт на 16-битовите части на регистрите.

        Регистри с общо предназначение.

EAX / AX / AH / AL (регистър на акумулатора) - батерия... Използва се при умножение и деление, при I / O операции и в някои низови операции.

EBX / BX / BH / BL - базов регистър (основен регистър), често се използва при адресиране на данни в паметта.

ECX / CX / CH / CL - брояч (броячен регистър), използва се като брояч за повторение на цикъла.

EDX / DX / DH / DL - регистър за данни (регистър на данните), използва се за съхранение на междинни данни. Той е задължителен в някои команди.

Всички регистри в тази група позволяват достъп до техните "долни" части. Само долните 16- и 8-битови части на тези регистри могат да се използват за самоадресиране. Горните 16 бита на тези регистри не са налични като независими обекти.

За да поддържате команди за обработка на низове, които позволяват последователна обработка на вериги от елементи с дължина 32, 16 или 8 бита, използвайте:

ESI / SI (регистър на индексния източник) - индекс източник... Съдържа адреса на текущия елемент източник.

EDI / DI (регистър на дистрибуционния индекс) - индекс приемник (получател). Съдържа текущия адрес в низа на приемника.

В архитектурата на микропроцесора на хардуерно и софтуерно ниво се поддържа структура от данни - стек. Има специални команди и специални регистри за работа със стека. Трябва да се отбележи, че стекът се запълва към по-малки адреси.

ESP / SP (регистър на стековите указатели) - регистрирам указател стек... Съдържа указателя към горната част на стека в текущия сегмент на стека.

EBP / BP (основен регистър на POINTer) - регистър на показалеца на стека... Проектиран да организира произволен достъп до данни в стека.

1.1.2. Сегментни регистри

Микропроцесорният софтуерен модел има шест сегментни регистри: CS, SS, DS, ES, GS, FS. Тяхното съществуване се дължи на спецификата на организацията и използването на RAM от микропроцесорите Intel. Микропроцесорният хардуер поддържа структурна организация на програмата, състояща се от сегменти. Регистрите на сегменти се използват за обозначаване на наличните в момента сегменти. Микропроцесорът поддържа следните типове сегменти:

    Кодов сегмент.Съдържа програмни команди. За достъп до този сегмент използвайте регистъра CS (регистър на кодови сегменти) - регистър на сегментния код... Той съдържа адреса на сегмента на машинните инструкции, до който има достъп микропроцесорът.

    Сегмент от данни. Съдържа данни, обработени от програмата. За достъп до този сегмент използвайте регистъра DS (регистър на сегмента от данни) - регистър на данните за сегментикойто съхранява адреса на сегмента от данни на текущата програма.

    Сегмент на стека. Този сегмент представлява област от паметта, наречена стека. Микропроцесорът организира стека според принципа - първо „ела“, първо „отиди“. За достъп до стека използвайте регистъра SS (регистър на сегмента на стека) - регистър на сегмента на стекасъдържащ адреса на сегмента на стека.

    Допълнителен сегмент от данни. Обработените данни могат да бъдат в три допълнителни сегмента от данни. По подразбиране се приема, че данните са в сегмента от данни. Когато се използват допълнителни сегменти от данни, адресите им трябва да бъдат посочени изрично, като се използват специални префикси за заместване на сегменти в командата. Адресите на допълнителни сегменти от данни трябва да се съдържат в ES, GS, FS (регистрите на сегменти от данни extenSIon).

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

Микропроцесорът съдържа няколко регистъра, които съдържат информация за състоянието както на самия микропроцесор, така и на програмата, чиито команди в момента са заредени в конвейера. То:

EIP / IP Command Pointer Register;

    регистрирайте знамена EFLAGS / FLAGS.

Използвайки тези регистри, можете да получите информация за резултатите от изпълнението на команди и да повлияете на състоянието на самия микропроцесор.

EIP / IP (регистър на указател на указатели) - указател екипи... Регистърът EIP / IP е широк 32 или 16 бита и съдържа отместването на следващата инструкция, която трябва да бъде изпълнена спрямо съдържанието на регистъра на CS сегмента в текущия сегмент инструкции. Този регистър не е пряко достъпен, но се променя чрез команди за прескачане.

ЕФЛАГИ / ФЛАГИ (Флаг регистър) - регистрирам знамена... Дълбочина на бита 32/16 бита. Отделните битове от този регистър имат специфично функционално предназначение и се наричат \u200b\u200bфлагове. Флагът е бит, който приема стойност 1 ("флагът е зададен"), ако е изпълнено определено условие, и стойност 0 ("флагът е изчистен") в противен случай. Долната част на този регистър е напълно аналогична на регистъра FLAGS за i8086.

1.1.3 Регистър на знамена

Регистърът на флаговете е 32-битов и носи името EFLAGS (Фигура 1). Отделните битове на регистъра имат специфично функционално предназначение и се наричат \u200b\u200bфлагове. На всеки от тях се присвоява определено име (ZF, CF и др.). Долните 16 бита на EFLAGS представляват 16-битовия регистър на флаг FLAGS, използван при изпълнение на програми, написани за микропроцесора i086 и i286.

Фиг. 1 Регистър на флаговете

Някои флагове обикновено се наричат \u200b\u200bфлагове за състояние; те автоматично се променят при изпълнение на команди и фиксират определени свойства на техния резултат (например дали е равен на нула). Други знамена се наричат \u200b\u200bдържавни; те се променят от програмата и влияят на по-нататъшното поведение на процесора (например блокови прекъсвания).

Флагове за състояние:

CF (флаг за носене) - носете знаме... Приема стойността 1, ако при добавяне на цели числа се появи единица за пренасяне, която не се „побира“ в битовата мрежа, или ако при изваждане на неподписани числа първото от тях е по-малко от второто. В командите за смяна бит, който е надхвърлил битовата мрежа, е зададен в CF. CF също улавя характеристиките на командата multiply.

OF (флаг за препълване) - флаг за преливане... Задава се на 1, ако при добавяне или изваждане на подписани цели числа се получи резултат, който е в абсолютна стойност по-голям от допустимата стойност (мантисата прелива и тя се "изкачва" в знаковия бит).

ZF (нулев флаг) - нулев флаг... Задава се на 1, ако резултатът от командата е равен на 0.

SF (SIgn флаг) - флаг знак... Задава се на 1, ако при операцията със подписани числа е получен отрицателен резултат.

PF (флаг за паритет) - флаг паритет... Равно на 1, ако резултатът от следващата команда съдържа четен брой двоични. Обикновено се разглежда само за I / O операции.

AF (спомагателен флаг за носене) - допълнително знаме за носене... Поправя особеностите при извършване на операции с двоично-десетични числа.

Флагове за състояние:

DF (флаг за посока) - посока флаг... Задава посоката на преглед на линиите в команди на низове: при DF \u003d 0 линиите се сканират „напред“ (от началото до края), а DF \u003d 1 - в обратната посока.

IOPL (ниво на привилегия за вход / изход) - ниво на I / O привилегии.Използва се в защитения режим на микропроцесора за управление на достъпа до I / O команди, в зависимост от привилегията на задачата.

NT (вложена задача) - флаг за влагане на задача.Той се използва в защитения режим на микропроцесора, за да запише факта, че една задача е вложена в друга.

Системно знаме:

IF (флаг за прекъсване) - флаг за прекъсване... Ако IF \u003d 0, процесорът спира да реагира на входящи прекъсвания; ако IF \u003d 1, заключването на прекъсването се освобождава.

TF (флаг за улавяне) - флаг за проследяване... Ако TF \u003d 1, след изпълнението на всяка инструкция, процесорът прави прекъсване (с номер 1), което може да се използва при отстраняване на грешки в програмата за нейното проследяване.

RF (флаг за възобновяване) - флаг за възобновяване... Използва се при работа с прекъсвания от регистрите за отстраняване на грешки.

VM (режим virtuAL 8086) - виртуален флаг 8086. 1-процесорът работи във виртуален режим 8086. 0-процесор работи в реален или защитен режим.

AC (Проверка на изпращането) - флаг за контрол на подравняването. Създаден, за да даде възможност за контрол на подравняването при достъп до паметта.

      Организация на паметта.

Извиква се физическата памет, до която има достъп микропроцесорът rAM (или памет с произволен достъп - RAM). RAM е низ от байтове, които имат свой собствен уникален адрес (неговия номер), наречен физически. Обхватът на физическите адреси е от 0 до 4 GB. Механизмът за управление на паметта е изцяло базиран на хардуер.

Микропроцесорният хардуер поддържа няколко модела използване на RAM:

    сегментиран модел... В този модел паметта за програми е разделена на съседни области на паметта (сегменти) и самата програма може да осъществи достъп само до данните, които са в тези сегменти;

    модел на страница... В този случай RAM се счита за набор от блокове с фиксиран размер от 4 KB. Основното приложение на този модел е свързано с организацията на виртуална памет, която позволява на програмите да използват пространство в паметта, по-голямо от количеството физическа памет. За микропроцесор Pentium възможната виртуална памет може да бъде до 4 TB.

Използването и изпълнението на тези модели зависи от режима на работа на микропроцесора:

    Реален режим на адрес (реален режим). Режимът е подобен на този на процесора i8086. Необходимо за функционирането на програми, разработени за ранни модели процесори.

    Защитен режим. В защитения режим става възможно многозадачна обработка на информация, защита на паметта с помощта на механизъм за привилегии на четири нива и нейното пейджинг.

    Виртуален режим 8086. В този режим става възможно да стартирате няколко програми за i8086. В този случай е възможна работата на програми в реален режим.

Сегментирането е механизъм за адресиране, който позволява съществуването на множество независими адресни пространства. Сегментът е независим, хардуерно поддържан блок памет.

Всяка програма в общия случай може да се състои от произволен брой сегменти, но има директен достъп до три основни: код, данни и стек - и от един до три допълнителни сегмента данни. Операционната система поставя програмни сегменти в RAM на конкретни физически адреси и след това поставя стойностите на тези адреси в съответните регистри. В рамките на сегмент програмата осъществява линеен достъп до адреси спрямо началото на сегмента, т.е. започвайки от адрес 0 и завършвайки с адрес, равен на размера на сегмента. Относителен адрес или пристрастие,което микропроцесорът използва за достъп до данни в рамките на сегмент се нарича ефективно.

Формиране на физически адрес в реален режим

В реален режим обхватът на промяна на физическия адрес е от 0 до 1 MB. Максималният размер на сегмента е 64 KB. Когато се позовава на конкретна физически адрес RAM се определя от адреса на началото на сегмента и изместването в сегмента. Началният адрес на сегмента е взет от съответния регистър на сегмента. В този случай регистърът на сегменти съдържа само горните 16 бита от физическия адрес в началото на сегмента. Липсващите четири долни бита на 20-битов адрес се получават чрез изместване на стойността на сегментния регистър наляво с 4 бита. Операцията за смяна се извършва в хардуер. Получената 20-битова стойност е реалният физически адрес, съответстващ на началото на сегмента. Т.е. физически адрес е посочен като двойка: сегмент: отместване, където сегментът е първите 16 бита от началния адрес на сегмента на паметта, към който принадлежи клетката, а офсет е 16-битовият адрес на тази клетка, отчитан от началото на този сегмент на паметта (стойност 16 * сегмент + offset дава абсолютния адрес на клетката). Ако например регистърът CS съхранява стойността 1234h, тогава двойката адреси 1234h: 507h дефинира абсолютен адрес, равен на 16 * 1234h + 507h \u003d 12340h + 507h \u003d 12847h. Такава двойка се записва под формата на двойна дума и (както при числата) във „обърната“ форма: първата дума съдържа отместване, а втората - сегмент и всяка от тези думи от своя страна се представя във „обърната“ форма. Например двойката 1234h: 5678h ще бъде написана така: | 78 | 56 | 34 | 12 |.

Този механизъм за формиране на физически адрес ви позволява да направите софтуера преместваем, тоест той не зависи от конкретните адреси на зареждането му в RAM.

Споделя това