Системи числення, теги асемблера, переклад чисел

Двійкова, восьмерична, десяткова, шістнадцяткова системи числення відносяться до позиційних. Позиційна система числення - така, в якій значення цифри залежить від її положення в числі, положення цифр в числі називають порядками або розрядами. Підставою позиційної системи числення є рахунок, при досягненні якого заповнюється наступний порядок числа. Інакше, підстава системи числення дорівнює числу цифр, включаючи нуль, якими записуються числа в цій системі.

Асемблер допускає можливість використання чисел в двійковій, вісімковій, десятковій або шістнадцятковій системі. За замовчуванням асемблер вважає все числа, що зустрічаються в програмі, десятковими. Явно вказати на підставу числа можна за допомогою тегів (для MASM32 11 версії): b або y - для двійкових чисел; o або q - для вісімкових; d або t - для десяткових чисел; h - для шістнадцяткових чисел. Тег записується в кінці числа, разом з числом. Якщо в числі використовуються літерні символи (шістнадцяткові числа), на початку записують нуль - за правилами асемблера позначення чисел повинні починатися з цифри. наприклад:

data var1 byte 00001111b; 15 в двійковому поданні var2 byte 00001111y; 15 в двійковому поданні var3 byte 17o; 15 в вісімковому поданні var4 byte 17q; 15 в вісімковому поданні var5 byte 15d; 15 в десятковому поданні var6 byte 15t; 15 в десятковому поданні var7 byte 0Fh; 15 в шістнадцятковому представленні

Можна задати вид застосовуються в програмі чисел в секції директив інструкцією виду

в якій підставу числення вказується десятковим числом. Наприклад, за інструкцією

асемблер буде вважати, що все числа без тегів в програмі є шестнадцатерічнимі.

Існування двох варіантів тегів для довічних і десяткових чисел викликано міркуваннями сумісності ранніх версій MASM32, в яких можливості запису чисел в шістнадцятковому форматі не було, з більш пізніми версіями. Для шістнадцятирічних чисел арабських цифр не вистачає, тому цифровий ряд доповнений літерами:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

Легко бачити, що теги з ранніх версій MASM32 - b і d - збігаються з цифрами шістнадцятирічного числа, що робить неможливим їх використання при директиві .RADIX 16. Тег o дубльований тегом q через схожість першого з нулем. З наведених причин кращими є теги y. q. t.

В обчислювальній машині все числа зберігаються в вигляді послідовностей з нулів і одиниць. Коли ми в текст програми записуємо якесь число, його переклад в машиночитаемую уявлення здійснює асемблер, і в виконуваний файл це число буде записано в належному (довічним) вигляді. Але організовувати висновок з програми числа в зрозумілому вже користувачеві форматі ми повинні самі, значить, якщо потрібно показати користувачеві число, тоді ми повинні зробити в програмі наступне: а) перевести число з двійкової системи в десяткову - з машинного уявлення в людське; б) замінити отримане десяткове число його символом, тобто відповідає числу картинкою, оскільки монітор відображає саме картинки, а не числа.

Переклад машинного числа в задану систему числення здійснюється послідовним розподілом цього числа і виходить результату на підставу шуканої системи числення. Залишок від ділення заноситься в молодший розряд, приватна знову ділиться на підставу системи числення, залишок заноситься в наступний розряд - і так до досягнення в результаті поділу нуля. Припустимо, потрібно перевести десяткове число 250 в шістнадцяткове подання:
250/16 = 15. залишок = A (10),
15/16 = 0, залишок = F (15),
таким чином, 250 (десяткове) = FA (шістнадцяткове).

Максимальної число, яке може бути записано в байт, становить 255. Якщо за результатами роботи програми необхідно вивести на екран число в десятковому форматі з однобайтового змінної, слід це число ділити на 10 не більше, ніж три рази - в 255 три десяткових порядку. У змінних типу word (два байти) максимальне значення становить 65 535, в змінних типу double word (чотири байти) - 4 294 967 295. Відповідно, числа word для перекладу в десятковий формат ділимо на 10 не більше п'яти разів, double word -не більше десяти разів.

Кодами символів-цифр є: "0" - 48; "1" - 49; "2" - 50; "3" - 51; "4" - 52; "5" - 53; "6" - 54; "7" - 55; "8" - 56; "9" - 57. Очевидно, що для перекладу значення цифри в символьний вид досить додати до нього 48.

Фрагмент програми, який переводить байтовую змінну в десятковий символьний вид:

data divider byte 10; дільник buffer_dec byte 3 dup (?) parametr byte 255. code start. ; отримаємо значення байта parametr в десятковому символьному вигляді mov AH, 0; Обнуляємо AH mov AL, parametr; копіюємо байтовую змінну в AL DIV divider; ділимо AX на 10 mov buffer_dec [2], AH; копіюємо залишок від ділення в buffer_dec [2] mov AH, 0; Обнуляємо AH DIV divider; ділимо AX на 10 mov buffer_dec [1], AH; копіюємо залишок від ділення в buffer_dec [1] mov buffer_dec [0], AL; копіюємо приватне в buffer_dec [0] ADD buffer_dec [0], 48; додаємо 48 - отримуємо символ цифри "2" ADD buffer_dec [1], 48; додаємо 48 - отримуємо символ цифри "5" ADD buffer_dec [2], 48; додаємо 48 - отримуємо символ цифри "5"

Схожі статті