ASM- 04: Практична робота.
Практична робота № 2
Внутрішнє представлення цілочисельних даних в IBM PC
Мета роботи
Виконати переведення заданих чисел з десяткової в двійкову систему числення. Дати їх внутрішнє (машинне) представлення відповідно до діапазону в знакових і беззнакових форматах типів signed char, unsigned char, int, short int, unsigned int. Машинне представлення даних має бути в двійковій і шістнадцятирічній системах числення.
Порядок роботи
визначити для свого варіанту цілі числа;
перевести їх з 10-тичної в 2-ву і 16-річну систему числення;
отримати їх внутрішнє представлення;
написати програму опису цих чисел на мові Асемблера і отримати лістинг;
перевірити правильність своїх викладень.
Цілочисельні дані мають бути представлені в усіх можливих для платформи Win32 форматах з урахуванням їх діапазону представлення.
У звіті по лабораторній роботі має бути представлений детальний протокол переведення усіх заданих чисел з 10-тичної в 2-ву і 16-річну системи числення.
Варіанти
Базові числа: X =± 4567, Y =± 60.
До базових чисел ± X і ± Y, Ви повинні додати і відняти № свого варіанту.
Наприклад, X =± 4567, Y =± 60, № = 45.
Тоді вийдуть наступні вісім цілих чисел для варіанту № = 45, а саме:
-
1)
4567 +45 =
4612
2)
4567 -45 =
4522
3)
-4567 +45 =
-4522
4)
-4567 -45 =
-4612
5)
60 +45 =
105
6)
60 -45 =
15
7)
-60+45 =
-15
8)
-60 -45 =
-105
Контрольні запитання
Перерахуйте усі базові цілочисельні типи даних в IBM PC.
Діапазон допустимих значень для цілочисельних даних.
Як отримати внутрішнє представлення заданих даних у форматі long int?
Що може означати, наприклад, машинне представлення 0F654h, і в яких форматах?
Теоретична частина.
Для переведення цілого числа, із десяткової системи числення, в двійкову можна використовувати один з методів.
Спосіб 1.
Число необхідно ділити на 2 до отримання цілого залишку, меншого 2. Число в системі числення з основою 2 представиться у вигляді впорядкованої послідовності залишків ділення в порядку, зворотному їх отриманню. Старшу цифру числа дає останній залишок, а молодшу - перший.
Спосіб 2.
У двійковій системі число може бути представлено|уявляти| сумою ступенів двійки.
1610 - 24, отже
1610 =1*24 + 0*23 + 0*22 + 0*21 + 0*2°= 10000.
2410 = 16 + 8 = 1*24 + 1*23 + 0*22 + 0*21 + 0*2° = - 11000.
12510 = 64 + 32 + 16 + 8 + 4 + 1 = 1 * 26+ 1 * 25 + 1 * 24 + 1 * 23 + 1 * 22 + + 0*21+ 1 *2°= 1111101.
Для того, щоб змінити знак числа, треба інвертувати усі його біти і додати до нього одиницю - отримаємо представлення від’ємного числа в додатковому коді.
Внутрішнє представлення чисел.
У C/C++ цілі числа можуть мати тип char або int. Число може бути знакове (signed) або беззнакове (unsigned), а тип int еше може бути коротким (short) або довгим (long). Усі ці типи даних мають визначену довжину комірки, а звідси і допустимий діапазон значень.
У Асемблері програміст сам вирішує, які дані (цілі або дійсні) він помістить в ту або іншу комірку. Наприклад, арифметичне дане, під яке відведене 32 або 64 біта, може бути як цілим, так і дійсним .
Цілі числа без знаку
Для платформи Win32, цілі числа без знаку можуть займати 8, 16 або 32 біта.
Біт 0 - молодший біт (крайній справа). Старший біт – 7 (15 або 31) - крайній ліворуч.
Усі біти вважаються інформаційними.
31 |
... 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 |
0 |
старший |
Біти |
молодший |
Приклад. У якому форматі його можна представити десяткове число 40 000? Тобто скільки йому потрібно біт і яке буде його внутрішнє (машинне) представлення?
Переведемо це число в двійкову систему числення. За допомогою калькулятора отримуємо:
40000d - 1001 1100 0100 0000b - 9C40h
По кількості отриманих біт видно, що для зберігання такого числа нам знадобиться мінімум 16 двійкових розрядів. В термінах C/C++ це формат unsigned short int для платформи Win32.
Можна це число розмістити і в 32-х бітах:
40000d - 0000 0000 0000 0000 1001 1100 0100 0000b - 0000 9C40h
Це будуть для C/C++ unsigned int, int, unsigned long, long (Win32).
Цілі знакові числа
Старший біт двійкового представлення цих чисел відводиться під знак (S біт – Signum):
S = 0 – для додатних чисел;
S = 1 - для від’ємних чисел.
Тому, діапазон допустимих значень для позитивних значень в два рази менше беззнакових.
S-знак |
Інформаційне поле числа (0,1) |
|||||||||||||||||
32 |
. . . |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Приклад: У один байт помістити знакове число 12710:
00111 1111b - 7Fh - 127d
Приклад. Скільки біт необхідно для представлення числа -1607 і яке буде його внутрішнє (машинне) представлення?
| -1607 | = - 0110 0100 0111b.
Тобто нашому числу досить 12 біт. Але такого формату немає, тому беремо, наприклад, 16 біт, додаючи провідні нулі: 0000 0110 0100 011lb
Робимо інверсію нашого коду, отримуємо: 1111 1001 1011 1000b
До отриманого коду добавляємо 1: 1111 1001 1011 1001b
У шістнадцятирічній системі числення : F9B9h.
У пам'яті комп'ютера це число зберігатиметься задом-наперед, тобто B9F9h.
Розмістимо число - 1607 в 32 бітах.
Відповідь: FFFF F9B9h
Звертаємо увагу на провідні двійкові одиниці. Число обов'язково має бути в знаковому форматі (наприклад, з точки зору C/C++ це формат long int - 32 біта). А якщо воно інтерпретуватиметься як беззнакове", то
FFFF F9B9h - 4294965689d
Т. ч. : двійковий код може бути один і той же для різних чисел Усе залежить від програміста, як він цей код тлумачитиме.
Розмістимо число - 1607 - розмістити в 64 бітах?
Відповідь: FFFF FFFF FFFF F9B9h
Цілочисельні типи, їх діапазони значень і кількість потрібної для них пам'яті приведені в наступній таблиці:
Тип |
Діапазон значень |
Необхідна пам'ять |
unsigned char |
0 ... 255 |
1 byte |
char |
-128 ... 127 |
byte |
unsigned short int |
0 ... 65 535 |
2 bytes |
short int |
-32 768 ...32 767 |
2 bytes |
int (long int) |
-2 147 483 648 ...2 147 483 647 |
4 bytes |
Приклад рішення типового варіанту №19.
Базові числа: X = ± 2235, Y = ± 40.
-
1)
40+19 =
59
2)
40-19 =
21
3)
2235 + 19 =
2254
4)
2235 - 19 =
2216
5)
-40+19 =
-21
6)
-40-19 =
-59
7)
-2235 + 19 =
-2216
8)
-2235 - 19 =
-2254