МАШИННА АРИТМЕТИКА В ЧАСОВЕТЕ ПО ИНФОРМАТИКА

Отворен достъп

Резюме. В статията се прави опит за излизане извън шаблона на преподаване на позиционни бройни системи в училищния курс по информатика. Чрез права и обратна задача действията с двоични числа се пренасят в машинната памет. При наблюдаване на формите на представяне се обръща внимание на някои особености, изясняващи понятието „тип данни“. Въвеждат се елементарни машинни операции, които характеризират работата на изчислителната система.

Ключови думи: binary numeral system, integer type data, coding of numbers, forward and inverse problem, machine register

1. Увод

Двоичната бройна система е езикът на компютрите на най-ниско ниво. В училищния курс по информатика позиционни бройни системи се изучават в 9. клас. Разглеждат се предимно десетично-двоично и двоично-десетично преобразуване, както и действия с двоични числа. Характерът на материала е такъв, че не се предполага използване на компютър. Поднесени теоретично, чисто математически, тези важни знания остават неинтересни за учениците.

По наше мнение изучаването на двоична бройна система може да се „съживи“, ако действията с двоични числа се пренесат в машинната памет. Разбира се, в този случай се застъпва и темата за представяне на числата в компютъра, но двете теми са взаимосвързани. Тяхното успоредно разглеждане е добра основа за изясняване на едно от основните понятия в информатиката – типа данни. В настоящата статия се изгражда подход, позволяващ редуване на теория и практика още в началните уроци по информатика. Въведените технически подробности, без да изместват същността на материала, способстват за експериментиране и прилагане на компютърни евристики.

2. Помощни средства и техники

2.1. Таблицата на съответствията е удобна за съкратено преобразуване на числата в десетична, двоична и шестнайсетична бройна система - табл. 1.

Таблица 1.

<10> <2><16>--------------------------------000000100011200102300113401004501015601106701117810008910019101010А111011В121100С131101D141110E151111F

2.2. За експериментиране в компютърната памет са достатъчни шестнайсетбитовите регистри с общо предназначение Ах, Вх, Dx на процесор i8086 и младшите половинки Al и Bl на първите два. В зависимост от това, дали се работи с цели числа, или само с естествени и нула, минималното целочислено представяне се дели на два вида:

– Представяне на числа със знак: диапазон на изменение от –128 до +127 (общо 256 състояния заедно с 0). В този случай първият бит е заделен за знак: 0 означава +, а 1 – минус.

– Представяне на числа без знак: от 0 до 255 (28 – 1).

2.3. За наблюдение на състоянието и обработка на съдържанието на регистрите използваме вградения в командния интерфейс на Windows системен анализатор Debug. Инструкциите са на машинен мнемокод (с именувани операции).

2.4. Изваждане чрез добавяне на допълнението на умалителя.

Техниката на изваждане чрез събиране е взета от живота. Например в магазина касиерката, допълвайки, връща ресто, което е разликa от изваждането на две числа. Ако извадим 37 от 86, ще получим 49, но разликата може да бъде сметната и другояче: Допълнението на 37 до 100 е 63. Събираме 63 с умаляемото 86 и получаваме 149. Като отнемем кръглото число, до което сме допълнили (100), остава 49.

В двоична бройна система:

8610 = 5616 = 0101 01102 (според табл. 1),

3710 = 2516 = 0010 01012.

Ако обозначим с d допълнението на 0010 01012 до по–голямото кръгло число, за числата в осемразрядно поле ще получим:

d =1 0000 0000 – 0010 0101 = 1101 1011 . Това състояние на числото 00100101 2 2 2 се нарича допълнителен код (ДК). Съществува ефективен машинен алгоритъм за получаване на допълнителния код:

1. Запис на числото в прав код: 1│010 0101ПК (първият бит е знаков).

2. Обръщане на всички битове без знаковия (запис в обратен код): 1│101 1010ОК

3. Добавяне на единица в най-младшия разряд: 1│101 1011ДК

Операция 0101 01102 – 0010 01012 заместваме с 0101 01102 + d00100101.

0101 01102+ 1101 10112---------------10011 00012– 1 0000 00002= 0011 00012= 3116= 4910

В осемразряден регистър най-старшият бит излиза извън обхвата и се премахва автоматично.

3. Права задача

Задача 1: 2710 и –7610 се записват съответно в регистри Al и Bl в <2–16> вид (регистрите са осембитови, числата – със знак). Какво ще бъде съдържанието на регистрите след извършване на операция Рг. Аl = Рг. Аl + Рг. Вl?

2710= 1В16= 0001 10112, –7610= –4С16= –0100 11002.

Трасиране на машинното изпълнение:

Таблица 2.

Рг. AlРг.BlКомандиКоментарРезултат0001 1011пкMovAl,1BЗапиши1В16вAl1B16─────────────────────────────────────────────1100 1100пкMov Bl,-4CЗапиши-4С16вBl1011 0011окВътрешно+1машинен------------------------алгоритъм1011 0100дкВ416─────────────────────────────────────────────
+1011 0100дкAddAl,BlСъбериAlиBlсрезултатвАl11001111дк<2-16>отрицателнаCF16разлика─────────────────────────────────────────────

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

Математическа проверка: 2710 – 7610 = –4910 = –3116 = –0011 00012

d = 1 0000 0000 – 0011 0001 = 1100 1111 = CF . 0011 0001 2 2 2 16

Две допълнителни инструкции показват разликата в <2–10> вид.

Neg e инструкция за умножение съдържимото на Al по минус 1. В нашия случай действието е равносилно на разкодиране на CF16 до прав код с подразбиращ се минус.

Aam преобразува съдържимото на Ах от <2–16> пакетиран вид в <2–10> непакетиран (по една десетична цифра в половинка байт – диапазон за Ах от 0 до 9910).

4. Обратна задача

Ако наречем горната задача права (от въведени числа към крайно състояние на регистрите), то интерес представлява и обратната задача. Можем да я формулираме по следния начин:

Задача 2: След изпълнение на операция Рг.Al=Рг.Al+Рг.Bl съдържимото на Рг.Al e CB16, а на Рг.Bl→ А2 16. Кои са първоначалните десетични числа, въведени в регистрите?

Числото в Bl ще намерим, като разкодираме допълнителния код до прав и го преобразуваме в <10>.

Рг.BL1010 0010ДК1---------------1010 0001OK1101 1110ПК= -5Е16= -9410.

Al преди операцията ще получим, като от Al след операцията извадим Bl.

Рг. Аl1100 1011ДК-1010 0010ДК---------------0010 1001ПК

Първият бит е нула, следователно числото е положително (в прав код) и можем директно да го преобразуваме в <10>: 0010 10012 = 2916 = 4110. В компютърната памет разсъжденията се проверяват със следните инструкции:

Математическа проверка:

41 - 94 = -53 = -35 = -0011 0101 10 10 10 16 2

d = 1 0000 0000 – 0011 0101 = 1100 1011 = CB 0011 0101 2 2 2 16

5. Преобразуване на дробни части

За наблюдение на дробни части в машинната памет е удобна командата IDiv (деление на числа със знак). Делимото се записва в Рг. Dx, делителят в Рг. Вх, а дробната част се търси в Рг. Ах.

Задача 3: Какво ще бъде съдържимото на Рг. Ах, ако 0,37510 се представи в паметта като отношение 3 : 8 с команда IDiv.

Преобразуваме 0,37510 в <16> чрез последователно умножение по 2 и вземане на целите части в прав ред.

0,375 х 2 = 0│,750

0,750 х 2 = 1│,5

0,5 х 2 = 1│,0

0,0 х 2 = 0│

Намираме, че 0,37510 = 0,01102 = 0,616.

Три въведени с Debug инструкции потвърждават получения резултат (двоичната точка се подразбира фиксирана в началото на Рг.Ax):

Ако в Dx въведем -3 (FFFD в ДК), след изпълнение на същата команда, в Ах ще получим А00016 (допълнителен код на -0,616 за 16 разряда).

d0110 0000 0000 0000= 1 0000 0000 0000 0000-0110 0000 0000 0000-----------------------------1010 0000 0000 0000А00016

6. Умножение и деление със степени на две

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

Задача 4: 4710 се въвежда в Рг. Ах в <2–10> вид. Какво ще бъде състоянието на регистъра, ако <2–16> вид на числото се умножи по 2.

4710= 2F16= 001011112001011112х102---------------00000000+01011112---------------010111102= 5E16= 9410= 47х2.

В машинната памет:

Таблица 3.

КомандиКоментарРг. АхMov Aх,0407Записна4710в04 07<2-10>непакетиранвид──────────────────────────────────────АаdПреобразуванена4710в00 2F16<2-16>пакетиранвид──────────────────────────────────────Shl Aх,1УмножениесъдържимотонаAх00 5E16по2чрезизместванеразрядналяво. ──────────────────────────────────────AamПреобразуванена5Е16в09 04<2-10>непакетиранвид──────────────────────────────────────

Изпълнена 2 пъти, Shl (Shift to left) ще умножи съдържимото на регистъра по 4 и т. н. Чрез допълнително събиране и изваждане на множимото е възможно формиране и на други множители. За бързо деление на 2 се използва командата Shr (изместване разряд надясно). Естествено точен резултат се получава, ако битът, който се отрязва, е 0.

7. Особености на целочисления тип

При решаване на предложените задачи се изясняват някои въпроси, касаещи целочисления тип данни. Разделянето на интервали зависи от адресируемата единица памет. За числа със знак, когато се адресира един байт (Рг.Al), диапазонът е от –12810 до +12710 (тип ShortInt в Borland Pascal), за два байта (Рг. Ах) – от –32768 до 32767 (тип Integer), за четири байта – LongInt. Но често учениците бъркат левите и десните граници на диапазоните. Защо например –12810 е включено в типа ShortInt ? Отговорът се съдържа в особеностите на кодиране на числа със знак. Имаме случай, при който старшият бит на –8016 носи едновременно и знак, и стойност. Ще илюстрираме ситуацията с няколко елементарни инструкции:

Вижда се, че допълнителният код на –12810 = –8016 е 8016. След умножение по –1 се получава отново 8016 (прав код на +12810, но за Ах). Числото със знак се интерпретира по два различни начин, в зависимост от разрядността на полето, в което е представено. Интересно е да се отбележи, че за 8016 „претендира“ и –0 в прав код (1│000 0000ПК). Но –0дк = +0пк. Следователно, състоянието 8016 за осембитов регистър е свободно и запазено за –12810. Ако искаме +12810 да остане в осем бита, то величината, която го допуска, трябва да е беззнакова (тип Byte в Borland Pascal).

8. Заключение

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

1. Шестнайсетичната бройна система е посредник между „десетичния човек“ и „двоичната машина“. Тя ускорява четенето на машинната памет.

2. Обратният код е преходно състояние от прав към допълнителен код на отрицателните числа.

3. Допълнителният код е удобен за съхраняване на отрицателни числа.

4. Машинната аритметика е максимално опростена. Операцията „изваждане“ се замества с операции „инверсия“ (обръщане) и „събиране“.

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

ЛИТЕРАТУРА

Азълов, П. (2005). Еквивалентни променливи. Математика и информатика, 1, 3 – 12.

Скэнлон Л. (1989). Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера. Москва: Радио и связь.

Година LVI, 2013/6 Архив

стр. 569 - 578 Изтегли PDF