- •Введение Основные определения
- •Системы счисления Основные определения
- •Двоичная, восьмеричная и шестнадцатеричная системы счисления
- •Смешанные системы счисления
- •Перевод чисел из одной системы счисления в другую
- •Арифметические действия в системах счисления с основанием, отличным от 10
- •Двоично-восьмеричные и двоично-шестнадцатеричные преобразования
- •Обратный и дополнительный коды и их применение в операциях с отрицательными числами
- •Сложение и вычитание чисел со знаком в дополнительном коде
- •Архитектура персонального компьютера История развития вычислительной техники
- •Основные термины и определения
- •Функциональная структура компьютера
- •Архитектура микропроцессора
- •Регистры общего назначения и сегментные регистры
- •Управляющие регистры Регистр cr0.
- •Память компьютера
- •Структура программы на языке Ассемблера Формат кодирования в языке Ассемблера
- •Структура программы на ассемблере
- •Простейшая программа в ос Windows
- •Типы и форматы данных в ассемблере
- •Базовая система команд микропроцессора ia-32
- •Операнды языка ассемблер
- •Стандартные директивы сегментации
- •Макрокоманды
- •Процедуры (функции)
- •Организация интерфейса с процедурой
- •Возврат результата из процедуры
- •Связь ассемблера с языками высокого уровня
- •Обработка прерываний
- •Создание исполняемого файла
- •Отладка программы
- •Математический сопроцессор
- •Представление чисел с плавающей точкой в разрядной сетке вычислительной машины
- •Архитектура сопроцессора
- •Система команд сопроцессора
- •Команды передачи данных
- •Команды загрузки констант
- •Команды сравнения данных
- •Арифметические команды
- •Команды управления математическим сопроцессором
- •Пример программы с использованием команд сопроцессора
- •Сложные типы данных Структуры
- •Объединения
- •Программирование для windows
- •Основы программирования в ос Windows
- •Консольные приложения Windows
- •Работа с файлами в системе Windows
- •Вывод чисел в консоль
- •Оконные (каркасные) приложения Windows
- •Графика в оконных приложениях Windows
- •Ресурсы в Windows-приложениях
- •Приложение 1
Типы и форматы данных в ассемблере
Данные – числа и закодированные символы, используемые в качестве операндов команд.
Основными типами данных процессора с архитектурой IA-32 являются байт, слово, двойное слово, четырехбайтное слово и восьмибайтное слово.
Тип данных |
Директива |
Кол-во байт |
Способ представления |
Байт |
DB |
1 |
|
Слово |
DW |
2 |
|
Двойное слово |
DD |
4 |
|
4 слова |
DQ |
8 |
|
10 байт |
DT |
10 |
80 бит |
Данные, обрабатываемые вычислительной машиной, можно разделить на 4 группы:
целочисленные;
вещественные.
символьные;
логические;
Целочисленные данные могут представляться в знаковой и беззнаковой форме.
Беззнаковые целые числа представляются в виде последовательности битов в диапазоне от 0 до 2n, где n-количество занимаемых битов.
Знаковые целые числа представляются в диапазоне -2n-1 … +2n-1. При этом старший бит данного отводится под знак числа (0 соответствует положительному числу, 1 – отрицательному).
Тип |
Диапазон изменения |
Форма представления |
Тип в Си |
беззнаковое целое (байт) |
0…255 |
|
unsigned char |
беззнаковое целое (слово) |
0…65535 |
|
unsigned int |
беззнаковое целое (4-байт) |
0… 4294967295 |
|
unsigned long int |
беззнаковое целое (8-байт) |
0… 1,84467e+19 |
|
|
знаковое целое (байт) |
-128…127 |
|
char |
знаковое целое (слово) |
-32768… 32767 |
|
int |
знаковое целое (4-байт) |
-2147483648 ..2147483647 |
|
long int |
знаковое целое (8-байт) |
-9,22e+18… 9,22e+18 |
|
|
Тип DT может быть только вещественным.
Вещественные данные обрабатываются сопроцессором и будут рассмотрены ниже.
Логические данные представляют собой бит информации и могут записываться в виде последовательности битов. Каждый бит может принимать значение 0 или 1 (ЛОЖЬ или ИСТИНА). Логические данные могут начинаться с любой позиции в байте.
Символьные данные задаются в кодах. Кодировка символов (часто называемая также кодовой страницей) – это набор числовых значений, которые ставятся в соответствие группе алфавитно-цифровых символов, знаков пунктуации и специальных символов. В Windows первые 128 символов всех кодовых страниц состоят из базовой таблицы символов ASCII (American Standard Code for Interchange of Information). Первые 32 кода базовой таблицы, начиная с нулевого, размещают управляющие коды. Символы с номерами от 128 до 255 представляют дополнительные символы и варьируются в зависимости от набора скриптов, представленных кодировкой символов. Основные таблицы кодировки представлены в приложении 1.
Для того чтобы полноценно поддерживать помимо английского и другие языки, фирма IBM ввела в употребление несколько кодовых таблиц, ориентированных на конкретные страны. Так для скандинавских стран была предложена таблица 865 (Nordic), для арабских стран - таблица 864 (Arabic), для Израиля - таблица 862 (Israel) и так далее. В этих таблицах часть кодов из второй половины кодовой таблицы использовалась для представления символов национальных а лфавитов (за счет исключения некоторых символов псевдографики).
С русским языком ситуация развивалась особым образом. Очевидно, что замену символов во второй половине кодовой таблицы можно произвести разными способами. Вот и появились для русского языка несколько разных таблиц кодировки символов кириллицы: KOI8-R, IBM-866, CP-1251, ISO-8551-5. Все они одинаково изображают символы первой половины таблицы (от 0 до 127) и различаются представлением символов русского алфавита и псевдографики.
Для таких же языков, как китайский или японский, вообще 256 символов недостаточно. Кроме того, всегда существует проблема вывода или сохранения в одном файле одновременно текстов на разных языках (например, при цитировании). Поэтому была разработана универсальная кодовая таблица UNICODE, содержащая символы, применяемые в языках всех народов мира, а также различные служебные и вспомогательные символы (знаки препинания, математические и технические символы, стрелки, диакритические знаки и т.д.). Очевидно, что одного байта недостаточно для кодирования такого большого множества символов. Поэтому в UNICODE используются 16-битовые (2-байтовые) коды, что позволяет представить 65536 символов. К настоящему времени задействовано около 49000 кодов (последнее значительное изменение - введение символа валюты EURO в сентябре 1998 г.).
Для совместимости с предыдущими кодировками первые 256 кодов совпадают со стандартом ASCII.
Для перекодировки символов и русскоязычного вывода в окно консоли можно использовать функцию Windows API
BOOL CharToOem(LPCTSTR lpszSrc, LPSTR lpszDst);
lpszSrc – указатель на строку-источник
lpszDst – указатель на строку-приемник.
Числа в двоично-десятичном формате
В двоично-десятичном коде представляются беззнаковые целые числа, кодирующие цифры от 0 до 9. Числа в двоично-десятичном формате могут использоваться в упакованном и неупакованном виде. В случае неупакованных чисел в каждом байте хранится одна цифра, размещенная в младшей половине байта (биты 3…0). Упакованный вид допускает хранение двух десятичных цифр в одном байте, причем старшая половина байта отводится под старший разряд.
– неупакованный вид;
– упакованный вид
Как и в языках высокого уровня (СИ, Паскаль), в Ассемблере в качестве данных могут выступать константы и переменные.
Числовые константы используются для обозначения арифметических операндов и адресов памяти. Для числовых констант в Ассемблере могут использоваться следующие числовые форматы.
Десятичный формат – допускает использование десятичных цифр от 0 до 9 и обозначается последней буквой d, которую можно не указывать, например, 125 или 125d. Ассемблер сам преобразует значения в десятичном формате в объектный шестнадцатеричный код и записывает байты в обратной последовательности.
Шестнадцатеричный формат – допускает использование шестнадцатеричных цифр от 0 до F и обозначается последней буквой h, например 7Dh. Так как ассемблер полагает, что с буквы начинаются идентификаторы, то первым символом шестнадцатеричной константы должна быть цифра от 0 до 9. Например, 0Eh. Ассемблер сам записывает байты в обратной последовательности.
Двоичный формат – допускает использование цифр 0 и 1 и обозначается последней буквой b. Двоичный формат обычно используется для более четкого представления битовых значений в логических командах (AND, OR, XOR).
Восьмеричный формат – допускает использование цифр от 0 до 7 и обозначается последней буквой q или o, например, 253q.
Десятичное 12, шестнадцатеричное 0Сh, восьмеричное 14q и двоичное 1100b генерируют один и тот же код. Отрицательные числа ассемблер сам представляет в виде дополнительного кода.
Примеры:
_bb DB 00001100b ; _bb указывает на байт памяти
;с двоичным значением 00001100
_ww_ DW 1234o ; _ww указывает на слово памяти
; с восьмеричным значением 1234
_dd_ DD 12345678h ;_dd указывает на двойное слово
; памяти со значением 12345678h
Вещественные числа задаются с помощью директив DD, DQ и DT.
Примеры:
_dd_ DD 5.65
_dq_ DQ -122.87
_dt_ DT 168.987E-21
Для инициализации массивов (цепочек) можно использовать следующие строки
My_array DW 0,1,2,3,4,5,6,7,8,9
или
My_array DW 0,1,2,3
DW 4,5,6,7
DW 8,9
Данная строка выделяет десять последовательных слов памяти и записывает в них значения 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Метка My_array определяет смещение начала этой области в сегменте .DATA.
Для инициализации блоков памяти одними и теми же значениями можно использовать оператор DUP. Например,
Block_array DW 100 DUP (12h)
В тех случаях, когда необходимо выделить память, но не инициализировать ее, используется знак ?. Например,
no_init DD ?
massiv DW 20 DUP (?)
Символьные строки представляют собой набор символов для вывода на экран. Содержимое строки отмечается одиночными кавычками, например, ‘pc’ или двойными кавычками (“pc”). Ассемблер переводит символьные строки в объектный код в обычном формате текущей кодовой страницы. Символьная строка определяется только директивой DB, в которой указывается более двух символов в нормальной последовательности слева направо. Символьная строка должна заканчиваться символом ‘\0’ (для системы MS-DOS строка заканчивается символом ‘$’). Для перевода строки могут использоваться символы 13 (возврат каретки 0Dh) и 10 (перевод строки 0Ah).
Stroka DB ‘Привет’,13,10,0
При записи символьных констант следует помнить, что символьная константа, определенная как DB ‘12’, представляет собой символы ASCII и генерирует шестнадцатеричный код 3132h, а числовая константа, определенная как DB 12, представляет двоичное число и генерирует шестнадцатеричный код 0Сh.
В кодовой странице ASCII (UNICODE) символы цифр ‘0’… ‘9’ соответствуют значениям кодов 30h…39h соответственно. Используя это, можно легко переводить числа, вводимые с клавиатуры, в эквивалент их целочисленного значения.