По-важни алгоритми

Програма за преобразуване на еднобайтово число в допълнителен код

Инструкцията NEG преобразува в допълнителен код, като инвертира всички 8 бита на числото и добавя единица. За знак използва флага N като девети бит. Това не винаги е удобно.
Програмата в следващия пример проверява знака на числото в клетка от паметта с указан адрес. Ако е положително, не извършва над него никакви действия. Ако е отрицателно обаче,  преобразува числото в съответствие с правилата за работа в допълнителен код, т.е. инвертира всички разреди и добавя единица. Знакът в най-старшия разред трябва да се запази.

В началото на програмата е въведен файлът с дефинициите на отделните устройства в съответствие с приетите в литературата имена. След това се задава адрес в адресния регистър. Младшият байт е в регистър R26 но благодарение на въпросния файл, достъпът до него може да се извърши и с XL. Старшият байт XH се нулира. Така в адресния регистър Х се записва адрес 0х0060. Инструкцията LD     R25,X зарежда съдържанието на тази клетка в R25,. Следва инструкцията ROL    R25 извършва лява ротация.(Фиг.13.) като премества всички разреди наляво. Съдържанието на флага С попада в най-младшия бит, а най-старшият заема неговото място в С.

Инструкцията BRCC извършва преход към посочения етикет, ако флагът С е нула. Той ще бъде нула, ако най-старшия бит в клетката е бил 0, т.е. числото е положително. Тогава управлението ще се предаде към етикет LN1, поставен в края на програмата и в клетката с адрес 0х0060 няма да се извършва запис.
Ако обаче във флага С попадне 1, преход не се извършва, а се изпълняват следващите след BRCC инструкции. Тя е   ROR R25, която извършва дясна ротация, т.е. връща всички разреди така, както са си били преди.

Следва инструкцията COM R25. Тя инвертира всички разреди на посочения регистър, но инвертира и флага С, което е особеност при този процесор. За това знакът не може да се съхрани във флага С, а трябва да се формира допълнително. Преди това обаче INC R25 добавя характерната за допълнителен код единица.
Формирането на знака може да стане по различни начини. Избрано е това да става чрез логическа операция ИЛИ над всички разреди. Това прави инструкцията     ORI R25,0×80. Първият параметър е регистърът, в който е единия операнд и в който се формира резултата.  Вторият параметър е константата  0×80, чиито двоичен еквивалент е %10000000. Знае се, че при логическата операция ИЛИ резултатът ще бъде 1, ако поне един от двата операнда е 1. С единицата в най-старшия разред това е гарантирано. Останалите разреди на константата са нули, което означава, че всичко ще зависи от съответните разреди на R25.
Накрая инструкцията     ST    X,R25 изпраща съдържанието на R25 обратно в клетката от паметта, където се заменя старото съдържание с допълнителния код на числото.
За анализ на знака на числото тук не е използвана инструкцията BRPL или  BRML, защото те следят флага N, който както вече се  спомена, се явява девети бит.

Подпрограма за преобразуване в допълнителен код

Подпрограмите се използват в големи програми, в които относително самостоятелни фрагменти се налага да се използват многократно. Такъв е случаят например, ако трябва да се съберат две числа с алгебричен знак. Налага се, да се преобразува първото число в допълнителен код, след това второто и накрая резултата. Вместо един и същи код да се пише три пъти, може да се напише само един път като подпрограма и да се извика на три места от програмата. Това ще бъде илюстрирано  с пример.
Подпрограмите се извикват с инструкцията CALL. Тази инструкция автоматично запомня в стека съдържанието на програмния брояч. Ако трябва да се запомнят текущите съдържания на други регистри, това може да се направи с инструкцията PUSH. След изпълнението на подпрограмата връщането съдържанието на регистрите се извършва с инструкцията POP, а съдържанието на програмния брояч се възстановява автоматично от инструкцията RET.
Поради горните съображения е необходимо винаги, когато се работи с подпрограми, стекът да бъде инициализиран. За това началото на програмата започва винаги със задаване на начално състояние на указателя на стека. Това вече беше описано.
Ще бъдат направени две промени от предишната програма. Първата промяна ще бъде, да се използва LSL вместо инструкцията ROL. Новата инструкция извършва само преместване на ляво, като старшия бит попада във флага С, но старото съдържание на този флаг се игнорира и в най-младшия бит на регистъра се записва 0. Това се налага, защото при дълги програми не се знае, какво е останало в С от предишни действия.
Втората промяна ще бъде с цел, да се демонстрира друг възможен вариант на формиране знака на числото. За целта във флага С ще бъде записана единица непосредствено преди връщане на числото обратно в регистъра с дясна ротация, при което тази единица ще застане като най-старши бит.
Накрая ще бъде добавен и код за събиране на две еднобайтови числа, с което подпрограмата ще стане част от сравнително по-сложна програма.

Сходни статии:

  1. Програма за преобразуване на четирибайтови числа в допълнителен код Програма за преобразуване на четирибайтови числа в допълнителен код Зададеното число се разполага в четири последователни клетки от паметта. И тук е прието най-старшият байт да е с най-малък адрес....
  2. Изваждане на BCD числа За изваждане на BCD числа не могат да се използват инструкциите SUB, SBC, SBCI, защото код BCD и двоичният код са съвсем различни неща. Тук ще бъде използван алгоритъм, който...
  3. Програми за управление Осъществяване на закъснение Едночиповите микрокомпютри се използват обикновено за управление на някакви обекти. Аритметичните действия, които могат да извършват , се използват именно за целите на управлението, а не за...
  4. Програма за умножение на еднобайтови числа без алгебричен знак Програма за умножение на еднобайтови числа без алгебричен знак Алгоритъм на умножението Нека е дадено множимото 1101 и множителя1001. Алгоритъмът за умножение на десетични и двоични числа е един и...
  5. Програмиране на AVR-контролери Програмен модел Аритметическите и логическите операции се изпълняват от така нареченото Аритметично-логическо устройство (АЛУ). То има два входа и един изход. На входовете се въвеждат операндите, а на изхода се...

Новини за технологии и джаджи – Актуална информация за най-яките лаптопи, компютри, телфони и фотоапарати
Comments are closed.