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

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

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

.include “m16def.inc”
LDI ZL,0×60 ;Задава начален адрес
CLR ZH
LD R25,Z ;Зарежда старшия байт
ANDI R25,0×80 ;Проверява знака
BREQ L1 ;Ако съдържанието на R25 е нула
SEC ;Тази единица ще се добави за ДК
LDI R16,0×04 ;Брояч до 4
L2:
LDD R25,Z+3 ;Започва от младшия байт
IN R5,SREG ;Запомня флаговия регистър
COM R25 ;Инвертира всички разреди и фл. С
OUT SREG,R5 ;Възстановява фл. регистър
BRCC L3 ;При първата итерация С=1.
CLR R17
ADC R25,R17 ;Добавя единицата за ДК
L3:
STD Z+3,R25 ;Записва резултата
DEC ZL ;Преминава към следващия байт
DEC R16 ;Отброява една итерация
BRNE L2 ;Дали броячът се е вече нулирал
ORI R25,0×80 ;Добавя единицата за знак
STD Z+4,R25 ;Записва старшия байт отново
L1:

Зададен е адрес на операнда 0х0060. Този адрес се записва в адресен регистър Z, за да се използва индексно адресиране. Това е адресът на най-старшия байт. Слез това LD R25,Z прехвърля най-старшия байт на числото в R25 за анализ на знака. Използван е различен от разгледаните в предишните примери подход.
Известно е, че ако две логически променливи са обхванати с логическата операция И, и ако едната е False, то и резултатът ще бъде също False За да бъде резултатът True, и двете променливи трябва да бъдат True. Тези две състояния в цифровата техника се кодират съответно с 0 и 1. Ако се приложи логическата операция И над всички разреди на даден регистър с константата %10000000, всички разреди на резултата след знаковия ще бъдат нули. Инструкцията ANDI_R25,0×80 прави точно това. Ако и знакът е нула, тогава целият регистър ще стане нула и флагът Z от флаговия регистър ще реагира и ще стане 1. Това състояние ще се установи от BREQ и управлението ще се предаде към мястото на програмата, където е етикетът L1. Това е краят на програмата, като всички следващи след BREQ операнди се прескачат.
Ако обаче Z не реагира, то в най-старшия разред на регистъра е имало единица, т.е. числото в него е било отрицателно. Тогава BREQ няма да извърши преход и ще се изпълнят следващата група оператори.
Първият от тях LDI ще запише числото 0×04 в регистър R16 за да се организира брояч до четири. След това SEC инициализира флага C с 1. За това ще стане въпрос след малко.
Следва цикъл, затворен между L2: и BRNE L2, като на всяка итерация LDD записва поредния байт в R25, а R16 намалява с единица, като след 4 итерации става нула и цикълът се прекратява. Вътре в цикъла четирите байта на числото ще се инвертират последователно, като се започне от младшия байт и се върви към старшия. Това се постига чрез индексно адресиране, като е въведено отместване Z+3. На всяка итерация адресът на Z ще намалява с единица, при което адресирането ще започне от клетката 0×0063 и ще върви към 0х0060.
Към младшия байт обаче трябва да се добави единицата за допълнителен код. Ако този байт е 0х00, след инверсията ще стане 0хFF. Ако към това число се добави единицата, ще стане 0х100, т.е. възникне пренос към следващия байт. Това налага да се следи флага С и ако той е 0, добавянето на единицата към следващите байтове да се прекрати. Следователно, само ако С=1, трябва да се добавя единица. На първата итерация това е задължително, поради което е поставена инструкцията SEC преди цикъла. Самото добавяне се извършва чрез ADC, като първият параметър е R25, а вторият е R17, в който предварително се записва 00.
Тъй като състоянието на С се контролира, се налага, да се запомни състоянието на целия флагов регистър SREG, защото инструкцията COM променя и някои флагове. Записът на регистър от паметта за вход/изход в оперативен регистър се извършва чрез инструкцията IN, а обратния запис става чрез инструкцията OUT.
Накрая на всяка итерация се изпраща съдържанието на R25 в клетката от паметта, от която е прочетено това съдържание. Следва намаляване на Z с единица и намаляване на брояча също с единица до пълното му нулиране.
Накрая трябва да се постави единицата за знак в най-старшия бит. Това е направено с ORI _R25,0×80. Накрая записът на старшия бит е повторен чрез STD _Z+4,R25, като отместването е върнато с една позиция назад.

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

  1. Програма за събиране на четирибайтови числа Програма за събиране на четирибайтови числа Операндите трябва да се заредят най-напред в оперативната памет. За първия операнд са отделени клетките 0х60, 0х61, 0х62 и 0х63; като първата от тях...
  2. Програма за събиране на четирибайтови числа с алгебричен знак Програма за събиране на четирибайтови числа с алгебричен знак В следващия пример подпрограмата за обработване на знака е извикана три пъти. При първия път е зададен адресът на първия операнд...
  3. Програма за умножение на еднобайтови числа без алгебричен знак Програма за умножение на еднобайтови числа без алгебричен знак Алгоритъм на умножението Нека е дадено множимото 1101 и множителя1001. Алгоритъмът за умножение на десетични и двоични числа е един и...
  4. Програма за преобразуване на еднобайтови двоични числа в BCD код Максималната стойност на еднобайтовото число е 255. За да бъде преобразувано в двоично-десетично, може да се постъпи по следния начин. От зададената стойност да се изважда най-напред100, докато се получи...
  5. Програма за събиране не еднобайтови BCD числа В тази програма не би трябвало да има нещо особено. Двата операнда се задават в BCD код в клетките 0х0060 0х0061. След това се извършва сумирането им по познатия начин....

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