Инструкции за скок - разклоняване и зацикляне
Въпреки че въведохме няколко инструкции за условно скачане, всъщност има само една. Всички команди, които са ни известни в момента, всъщност са само форми на запис на командата BC (Branch on Condition—CONDITIONAL JUNK) във формат RX. Такива разширени мнемоники като B, BZ, BNM се превеждат от асемблер в машинната форма на инструкцията BC; в същото време се добавя информация към формата на командата за това кое състояние на атрибута резултат съответства на действителния преход.
Състоянието на флага за резултат, на който съответства преходът, трябва да бъде известно на процесора при изпълнение на инструкциите за условно прехвърляне. Информацията за това състояние се предоставя на процесора под формата на маска. Най-общо казано, маската е двоично число, което указва кое от възможните логически решения трябва да се вземе. Можете да мислите за маска като набор от превключватели. Ако ключът е във включено състояние - съответният бит на маската съдържа 1 - тогава трябва да се вземе решението, съответстващо на този бит. Ако превключвателят е настроен на позиция "изключено" (битът на маската съдържа 0), тогава не е необходимо действие.
Един от операндите на инструкцията BC е 4-битова маска. Можем да считаме, че битовете на маската са преномерирани от 0 на 3. Всеки бит от маската съответства на едно от четирите възможни състояния на флага за резултат:
Маската определя кои стойности на атрибута резултат предизвикват изпълнението на прехода. Например, ако 2-рият бит на маската съдържа 1 при изпълнение на командата BC, тогава разклонението ще бъде изпълнено, ако флагът за резултат е 2. Ако този бит съдържа 0, тогава наличието на съответния флаг за резултат няма да предизвика преход.
Помислете за командата BC с маска01002. Тъй като бит 1 е зададен на 1, прехвърлянето ще се извърши, ако флагът за резултат е 012. Битове 0, 2 и 3 са нули, така че няма да се извърши разклонение, ако флагът за резултат е 0, 2 или 3. Тъй като кодът на флага за резултат 1 съответства на отрицателен резултат от операцията, командата BC с такава маска е еквивалентна на командата VM, описана по-рано.
Ако повече от един бит от маската е 1, преходът се извършва, ако е изпълнено поне едно от съответните условия. Ако маската съдържа 10112, тогава преходът ще бъде направен, ако атрибутът резултат има една от стойностите 0, 2 или 3, но не и 1. На команда BC с такава маска се отговаря от разширения мнемоничен BNM.
По същия начин при команда BC с маска 11112 се прави преход независимо от знака на резултата. Тази команда има разширено мнемонично B, което означава скок безусловно.
Когато се изпълни командата BC, стойността на атрибута резултат се използва като индекс, показващ кой бит от маската трябва да бъде проверен. Ако този бит от маската съдържа 1, тогава преходът е направен.
Така маската е връзката между програмиста и машината. С негова помощ програмистът задава условията, при които би искал да изпълни прехода. За задаване на тези условия се използват разширени мнемоники, които се превеждат от асемблера във VS команди с необходимата маска. Можете също да зададете маската директно, както ще видим в следващия раздел.
Отбор BC
Командата BC е модифицирана команда във формат RX. Вече отбелязахме, че 4-битова маска, указваща в кои случаи трябва да се направи преходът, трябва да бъде дадена като един от операндите. Символично тази маска се обозначава с Ml и се поставя на мястото на полето R1 на конвенционалната команда за RX формат.И така, командата VS може да бъде описана по следния начин:
Клон при условие
PCD2 + (X2)+(B2), ако резултатният атрибут съвпада със стойността в поле M1
Тъй като, освен ако не е посочено друго, асемблерът третира всички числа като десетични, маската може да бъде определена като десетично число между 0 и 15 включително. За да се определи какво точно трябва да се запише в полето Ml, двоичната стойност на маската трябва да се преобразува в десетична форма. Ако искаме например да зададем маската 1002, като по този начин указваме, че преходът трябва да се извърши, ако атрибутът резултат е 0, трябва да напишем
и командата ще изглежда така
Преобразуването на маската в десетична форма, въпреки своята простота, често е източник на допълнителни грешки. Асемблерът ви позволява да задавате числа в различни системи. В този случай, както и в някои други, могат да се използват системи с други основи.
За да дефинирате двоична константа, е достатъчно да напишете
„Стойност“ е двоично число, затворено в единични кавички. Символът B казва на асемблера, че основата на използваната система е числото 2.
Шестнадесетичната константа е дадена така
Ако е необходимо, тези функции могат да се използват за дефиниране на числови константи. Например следните команди са еквивалентни:
Машинният формат на инструкцията BC не се различава от обичайния RX формат, само маската е посочена на мястото на първия операнд. Има само една команда на самолета, съответният код на операцията е 47, следователно в машинна форма
В този случай отместването е 3210, регистър 3 се използва като индекс, а регистър 11 се използва като база. Разширената мнемоника BNP се превежда в командата BC с маска 13, както следва:
Сега, като вземем предвид преобразуването на отместването в шестнадесетична форма, получавамеследния машинен код:
Помислете сега за друг пример. Излъчете екипа
ТОП името съответства на отместване 15016, регистър 9 се използва като основен регистър. Маската е 1000a=816. По този начин, в нативния код, тази команда изглежда така:
Когато обработва команди за прехвърляне на управление, асемблерът извършва подобни действия. Ако командата BC е написана, тогава се извършва директен превод. В случай на използване на разширена мнемоника, асемблерът трябва да потърси мнемоничната таблица, за да определи маската. След това код 47 и получената маска се въвеждат в съответните полета на машинната команда.
Таблица 9.1 Разширена мнемоника, маски и еквивалентни команди на самолета