ЛАБОРАТОРНАЯ РАБОТА №1 Базовые системы счисления. Объявления данных в Ассемблере Цель работы: 1. Ознакомиться с системами счисления – двоичной, восьмеричной, шестнадцатеричной. 2. Ознакомится с представлением данных в памяти компьютера и директивами выделения памяти. Теоретические основы Наименьшая единица информации, которую можно сохранить в компьютере – это бит (eng. bit - binary digit), т.е. 0 или 1. Бит – это атом информации, он не может быть разделен. Биты группируются по 8 и образуют байт. Информация, которой манипулирует компьютер – это строка бинарных чисел. Из 8 битов можно сформировать 256 комбинаций. Эти комбинации используются для того, чтобы закодировать большие и малые буквы, цифры, специальные символы. Для измерения информации на компьютере используются величины: 1 Килобайт = 1 Кбайт = 210 байтов = 1024 байтам; 1 Мегабайт = 1 Мбайт = 220 байтов = 1024 Кбайтам; 1 Гигабайт = 1 Гбайт = 230 байтов = 1024 Мбайтам. Системы счисления Система счисления (ССЧ) – это множество правил и цифр представления чисел. Для любой позиционной системы счисления число цифр для представления равно основанию системы счисления. Например, для двоичной системы основанием является число 2, следовательно, для представления чисел нужны две цифры - 0 и 1, для шестнадцатеричной системы счисления - это 0, 1, 2, …, 9, A, B, C, D, E, F, где буквы соответствуют значениям 10, 11, 12, 13, 14 и 15 соответственно. Чтобы различать системы счисления, в конце числа ставится буква: B – для двоичного числа, Q – для восьмеричного числа, D – для десятеричного числа и H – для шестнадцатеричного. Для десятеричного числа указывать D не обязательно. Если число записано в b–ричной системе счисления в виде: Nr(b) = Cn Cn-1 Cn-2 … C2 C1 C0,D1 D2 D3 …, то в десятеричной системе счисления его значение можно представить в виде суммы цифр, умноженных на основание системы счисления в степени, равной номеру позиции цифры в числе (нумерация начинается с 0, справа налево): n n1 2 2 1 0 1 3 Nr(10) Cn b C b ... C b C b C b D b D b D b ... n1 2 1 0 1 2 3 Например: Пусть даны два бинарных числа 11b, 1100011b. Переведем эти числа в десятеричную систему счисления: 11b=1*21+1*20=3; 11100011b=1*27+1*26+1*25+0*24+0*23+0*22+1*21+1*20=227. Рассмотрим примеры перевода восьмеричного числа в десятичную систему счисления: 11q = 1*81+1*80 =9; 210q =2*82+1*81+0*80=136. Пример перевода шестнадцатеричных чисел в десятичные: 11h = 1*161+1*160=17; CA0h= C*162+A*161+0*160=3232. Для перевода чисел из десятичной системы в двоичную или шестнадцатеричную применяется целое деление. Число делится на основание системы счисления, пока не получится неделимый остаток. Полученное от деления частное снова делится и процесс завершается, когда частное тоже становится неделимым. Полученные при делении остатки записываются в обратном порядке. На схеме (Рисунок 1) показан перевод числа 25 в двоичную систему счисления, в результате которого получаем число 11001b, а также перевод числа 418 в шестнадцатеричную систему счисления, в результате которого получаем число 1A2h, учитывая, что цифра десять - это A. Рисунок 1 Схема перевода десятичного числа в двоичную и шестнадцатеричную ССЧ Для перевода чисел из шестнадцатеричной системы в двоичную и обратно используется следующий факт: каждой шестнадцатеричной цифре соответствует четырёхбитовое двоичное число и наоборот, как это представлено в таблице (). Следовательно, при переводе из шестнадцатеричной системы в двоичную надо для каждой шестнадцатеричной цифры записать её двоичный код, а при обратном переводе двоичное число разбивается справа налево на группы по четыре цифры, и для каждой группы записывается шестнадцатеричное соответствие. Таблица 1 Соответствие шестнадцатеричных цифр и двоичного эквивалента 0 0000 4 0100 8 1000 C 1100 1 0001 5 0101 9 1001 D 1101 2 0010 6 0110 A 1010 E 1110 3 0011 7 0111 B 1011 F 1111 Например, переведем число 1FDh в двоичное представление: 1FDh = 0001-1111-1101b = 111111101b Переведем двоичное число 1110100101b в шестнадцатеричное представление: 0011-1010-0101b = 3A5h. Представление целых чисел в памяти компьютера Для представления информации на компьютере используют двоичную систему счисления. Для хранения целых чисел используется строго фиксированное число битов: 8, 16, 32, 64. На n бинарных позиций можно записать целое число со знаком в диапазоне от -2n-1 до 2n-1-1. Позиции нумеруются от 0 до n-1 справа налево. Например, число 67 в восьми двоичных позициях будет представлено как 01000011b. Числа без знака можно представить в диапазоне 0 до 2n-1. Целое число может храниться в виде прямого или дополнительного кода. Для представления знака числа используется бит, называемый знаковым. Он находится в позиции n-1 и является старшим битом числа. Для положительных чисел этот бит равен нулю, для отрицательных – единице. Прямой код используется для хранения положительных чисел или чисел без знака. Дополнительный код используется для хранения отрицательных чисел. Для получения представления числа в дополнительном коде сначала находится прямой код модуля числа, затем его обратный код. Обратный код получается инверсией каждого разряда в двоичном представлении числа: 0 преобразуется в 1, а 1 – в 0. На последнем шаге к обратному коду прибавляется 1. Например, для представления числа -65 имеем: 01000001b прямой код числа +65 10111110b обратный код 10111111b дополнительный код числа -65 Дополнительный код служит для замены операции вычитания целых чисел на операцию сложения с числом, представленным в дополнительном коде. В этом случае процессору нет необходимости производить операцию вычитания целых чисел. Типы данных BYTE. Этот тип данных занимает 1 байт (8 битов). При помощи этого типа можно зашифровать целое число со знаком в диапазоне от -128 до +127 или без знака в диапазоне от 0 до 255, любой ASCII–символ, который также кодируется целым числом. Директива определения – DB (Define Byte). WORD. Этот тип данных занимает 2 байта (16 битов). В переменную данного типа можно поместить целое число в диапазоне от -32768 до+32767 или от 0 до 65535, два ASCII–символа или относительный адрес памяти типа near. При этом запись в память производится следующим образом: младшая часть числа располагается по младшему адресу, а старшая – по старшему. Это справедливо и для других типов данных. Например, если целое шестнадцатеричное число 1234h расположено по адресу 1000h, то младшая часть 34h будет расположена по адресу 1000h, а 12h – по адресу 1001h. Директива определения – DW (Define word). DWORD – 4 байта (2 слова) может вместить целое 32–битное число со знаком или без знака, число с плавающей точкой, 32–разрядный адрес памяти или 4 ASCII–символа. При хранении адреса адрес сегмента располагается в двух старших байтах, а смещение – в двух младших байтах памяти. Директива определения – DD (Define Double word). QWORD – 8 байтов. Может быть целым знаковым или беззнаковым, числом или числом с плавающей точкой двойной точности. Директива определения – DQ (Define Quad). TEN-BYTES – 10 байтов. Используется для хранения данных в основной памяти или в сопроцессоре. Может быть упакованным двоично–десятичным числом, расширенным целым числом или расширенным числом с плавающей точкой. Директива определения - DT (Define Ten bytes). Общий синтаксис определения данных: <имя> <тип> <список значений> или <имя> <тип> <число> dup (выражение), где имя – идентификатор, тип – одна из рассмотренных выше директив выделения памяти, список значений – список, который может содержать символьные или числовые константы. Он может также содержать символ ?, если значение не определено, или адрес – имя переменной или метку, строку ASCII– символов, заключенных в кавычки или апострофы. Директива dup предписывает повторение значений, определяемых выражением, заданное <число> раз. Выражение может быть константой, константами, объединенными знаками арифметических операций, списком значений или символом ?, если значение не определено. Например, var_a db 2 dup (0, 3 dup (1)) ;эквивалентно var_a db 0,1,1,1,0,1,1,1 var_b db 1, 2, 3, ?, ? adr_a dw var_a adr_b3 dd var_b+3 Определим размер памяти, выделенный под каждую из следующих переменных: m1 db 4, 5, 1, 6 ;4*1=4 байта m2 db “xzyqw” ;5*1=5 байтов m3 dw 12 dup(?) ;12*2=24 байта m4 dd 345h, 234h ;2*4=8 байтов Общее количество байтов, выделенных данными директивами, равно 41 байту. Переменная m1 располагается по относительному адресу 00h, m2 – 04h, m3 – 09h, а m4 – 021h. Задание 1. Изучить теоретический материал лабораторной работы. 2. Разобрать примеры решения задач, приведённых в методических указаниях. 3. Перевести в двоичную, шестнадцатеричную и восьмеричную системы счисления десятеричные числа согласно варианту: 1 42;31;113 6 46;35;119 11 49;30;103 16 29;37;97 2 45;81;89 7 66;25;110 12 19;53;101 17 21;87;98 3 12;38;118 8 17;63;96 13 34;50;107 18 28;45;130 4 11;43;67 9 13;69;88 14 14;70;99 19 15;72;100 5 22;34;213 10 65;98;250 15 53;77;198 20 67;101;234 4. Перевести в двоичную систему счисления шестнадцатеричные числа: 1 A45;12;56B 6 7C;72EB;31DB 11 34A;6AB;9AD 16 7CD;2A1;B53 2 1EF3;5AB;46F 7 3EB;4D8;A61 12 5AB;79F;AB8 17 10B;87F;CD9 3 A56;5E9;CDE 8 6A3;9D0;8BE 13 9A;4DE;EF7 18 38E;9C7;B89 4 86C;7E6;ACD 9 BC;7F9;78A 14 AB;8E4;C17 19 12B;5FE;13D 5 3B8;DE1;BAE 10 56C;DE0;53F 15 2B9;6F1;81B 20 6F;AC9;EA7 5. Перевести в восьмеричную и шестнадцатеричную системы счисления бинарные числа: 00101011; 1 2 3 4 5 00110110; 00100110; 6 00111011; 11100010; 11 10100001; 11100111; 16 01100101; 01110011 10001100 10001110 10110010 01100001; 11010010; 10100101; 01010001; 01101110; 7 01001100; 12 01101100; 17 11001100; 11110011 11000111 11100001 10000110 11100100; 11100000; 00011101; 10110011; 01011100; 8 11111000; 13 11111001; 18 00110101; 11000001 01000011 00111101 11011000 00001111; 10000101; 00011100; 10001100; 10100101; 9 11100010; 14 01001100; 19 00011111; 10010001 11001011 01101110 10000110 11110010; 00011101; 10101001; 01110011; 01101010; 10 01010110; 11111100 15 11010101; 10110010 20 111001100 10011001; 11110111 6. Представить в дополнительном коде следующие числа: 1 -40;-37;-96 6 -46;-35;-94 11 -29;-53;-101 16 -21;-83;-148 2 -52;-41;-93 7 -62;-75;-95 12 -34;-50;-94 17 -28;-45;-130 3 -12;-39;-93 8 -15;-69;-91 13 -14;-70;-91 18 -15;-72;-100 4 -13;-53;-77 9 -19;-60;-88 14 -53;-79;-198 19 -67;-109;-204 5 -24;-32;-73 10 -49;-30;-103 15 -39;-87;-167 20 -48;-59;-173 7. Даны следующие определения переменных. Определить адреса, по которым располагается каждая из переменных, и сколько байтов выделено данными директивами. a db 45,16,76,-6 1 2 b db “abcd” c dw 15 dup(0),3,3 a dd 78,34,67 7 b db “Resultat”,‘$’ c db 6 dup(0),‘$’,10,13 a db 12,24,”sss” 13 b db “ab”,-8,23h c dd 6 dup(0),45 d dd 345h d dw 32,56,-11 d dw -7,5 dup(0) a db “Salut”,10,13 a db 24,76,-56 a db 34,6,3,-8,-2 b db -16,-20,13h,2 dup(0) c dw 62,34,-15 8 b db “abc”,11101b c dd 45,4 dup(?) 14 b db “Hello”,‘$’ c dw 6 d dd 456C9h,4567 d dw 4 dup(0),8,3 dup(0),‘$’,10,13 d dw -68,46h,7 dup(0) 3 a db “lucrarea_1”,10,13 a dd 7,45h,-9 b db 2 dup(0) b db 10 dup(?) c dw 38,-15,78,41,12 9 d dd 678EFh,3489,456 c db “test_1$” a db 76,87,92,45h b db 20 15 dup(‘$’),10,13 c db “qwerty” d dw 4 dup(0),2,7 d dw 10 dup(0) a db 73,74,75,77,-67 a db 35,53 4 b db 10 dup(‘ ’),10,13,“$” c dw 5 dup(0) a dd 2,24 10 d dd 555h b db “AVIA”,-8,23h,11101b c db 6 dup(0), 45, 6 b db 15 16 d dw -7,4Dh,8 dup(0) dup(‘?’),10,13 c dd 777h d dw -11,3Ah,4 dup(0) a db a db 45,16,-23 5 b db 5 dup(?),10,13,“$” c dw 55 dup(0) a dd 92,45h,90,-54,-67 11 d dd 34567h b db 10 dup(‘$’),10,13 c db “avto”,10,13,’$’ “test_lr_2”,13,10 17 d dw 5 dup(?),7,-80h b db -18,-22,18h,2 dup(0) c dw 81,-16,44,18 d dd 568ABh 6 a db “binom_1”,16,73 a dd -7,4Ah,-19,10 b db 7 dup(0) b db 5 dup(?) c dw 358,-11,75,40,19 d dd 67AFh,3189,56 12 c db “test_3$_new” d dw 4 dup(0),5,9,13 a db 19,74,”SOS” b db “abcd”,18 17,A13h c dd 3 dup(0),65 d dw -34,7 dup(0) КОНТРОЛЬНЫЕ ВОПРОСЫ 1. Что такое бит? 2. Сколько бит информации включает 1 байт? 3. Что такое позиционные системы счисления? 4. Какие позиционные системы счисления вы знаете? 5. Как переводятся числа, представленные в позиционных ССЧ, в десятичную ССЧ? 6. Как переводятся числа из десятичной ССЧ в другую позиционную ССЧ? 7. Что такое прямой код числа и его получение? 8. Что такое дополнительный код числа и его получение? 9. Какие типы данных существуют в ассемблере? 10. Как определяются данные в ассемблере? СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ 1. Андреева Е.В., Фалина И.Н. Системы счисления и компьютерная арифметика. Изд. 2-е. – М.: Лаборатория Базовых Знаний, 2000. – 248 с.: ил. 2. Фомин С.В. Системы счисления. - М.: Наука, 1987. – 48 с. 3. Юров В. Assembler: практикум – СПб: Питер, 2003. - 400 с. 4. Пирогов В.Ю. Ассемблер для Windows. - 3-е изд. - СПб.: БХВ-Петербург, 2005. - 864 с. 5. Ассемблер на примерах. Базовый курс. Рудольф Марек – СПб: Наука и Техника, 2005. – 240 с.