- •Введение Основные определения
- •Системы счисления Основные определения
- •Двоичная, восьмеричная и шестнадцатеричная системы счисления
- •Смешанные системы счисления
- •Перевод чисел из одной системы счисления в другую
- •Арифметические действия в системах счисления с основанием, отличным от 10
- •Двоично-восьмеричные и двоично-шестнадцатеричные преобразования
- •Обратный и дополнительный коды и их применение в операциях с отрицательными числами
- •Сложение и вычитание чисел со знаком в дополнительном коде
- •Архитектура персонального компьютера История развития вычислительной техники
- •Основные термины и определения
- •Функциональная структура компьютера
- •Архитектура микропроцессора
- •Регистры общего назначения и сегментные регистры
- •Управляющие регистры Регистр cr0.
- •Память компьютера
- •Структура программы на языке Ассемблера Формат кодирования в языке Ассемблера
- •Структура программы на ассемблере
- •Простейшая программа в ос Windows
- •Типы и форматы данных в ассемблере
- •Базовая система команд микропроцессора ia-32
- •Операнды языка ассемблер
- •Стандартные директивы сегментации
- •Макрокоманды
- •Процедуры (функции)
- •Организация интерфейса с процедурой
- •Возврат результата из процедуры
- •Связь ассемблера с языками высокого уровня
- •Обработка прерываний
- •Создание исполняемого файла
- •Отладка программы
- •Математический сопроцессор
- •Представление чисел с плавающей точкой в разрядной сетке вычислительной машины
- •Архитектура сопроцессора
- •Система команд сопроцессора
- •Команды передачи данных
- •Команды загрузки констант
- •Команды сравнения данных
- •Арифметические команды
- •Команды управления математическим сопроцессором
- •Пример программы с использованием команд сопроцессора
- •Сложные типы данных Структуры
- •Объединения
- •Программирование для windows
- •Основы программирования в ос Windows
- •Консольные приложения Windows
- •Работа с файлами в системе Windows
- •Вывод чисел в консоль
- •Оконные (каркасные) приложения Windows
- •Графика в оконных приложениях Windows
- •Ресурсы в Windows-приложениях
- •Приложение 1
Обработка прерываний
Прерывание — это временное прекращение основного процесса вычислений для выполнения некоторых запланированных или незапланированных действий, вызванных работой аппаратуры или программы.
Механизм прерываний поддерживается на аппаратном уровне и позволяет реализовать как эффективное взаимодействие программ с операционной системой, так и эффективное управление программой со стороны аппаратной части компьютера.
В зависимости от источника прерывания классифицируют так:
аппаратные — возникают как реакция микропроцессора на физический сигнал от некоторого устройства компьютера (клавиатура, системный таймер, жесткий диск и т.д.); по времени возникновения эти прерывания асинхронны, то есть возникают в случайные моменты времени;
программные — вызываются искусственно с помощью соответствующей команды из программы (команда int); предназначены для выполнения некоторых действий операционной системы; являются синхронными;
исключения — программные, являющиеся реакцией микропроцессора на нештатную ситуацию, возникшую внутри микропроцессора во время выполнения некоторой команды программы.
Создание исполняемого файла
Трансляция модуля на ассемблере проходит две стадии.
Двум стадиям трансляции соответствуют две основные программы MASM: ассемблер ML.EXE и редактор связей LINK.EXE.
Исполняемым форматом в Windows является формат PE. Сокращение PE означает Portable Executable, т.е. переносимый исполняемый формат. Этот формат имеют как ЕХЕ-файлы, так и динамические библиотеки (.DLL). Фирма Microsoft ввела «новый» формат и для объектных модулей - это COFF-формат (COFF - Common Object File Format).
1 стадия
Программа ассемблера ML.EXE имеет синтаксис:
ML [параметры] имя_файла.asm [/link опции_редактора_связей]
Атрибут [параметры] может принимать следующие значения:
Параметр |
Комментарий |
/?, /help |
Вывод помощи. |
/AT |
Создать файл в формате .СОМ. Для программирования в Windows этот ключ, естественно, бесполезен. |
/Bl<linker> |
Использовать альтернативный компоновщик. Предполагается автоматический запуск компоновщика. |
/c |
Компиляция без компоновки. |
/Ср |
Сохранение регистров пользовательских идентификаторов. Может использоваться для дополнительного контроля. |
/Cu |
Приведение всех пользовательских идентификаторов к верхнему регистру. |
/Сх |
Сохранение регистров пользовательских идентификаторов, объявленных PUBLIC и EXTERNAL. |
/coff |
Создание объектных файлов в стандарте coff. Применение обязательно. |
/D<name>=[строка] |
Задание текстового макроса. Очень удобен для отладки с использованием условной компиляции. |
/ЕР |
Листинг: текст программы с включаемыми файлами. |
/F <hex> |
Размер стека в байтах. Размер стека по умолчанию равен 1 Мб. |
/Fe<file> |
Имя исполняемого файла. Имеет смысл без параметра /с. |
/Fl<file> |
Создать файл листинга. |
/Fm<file> |
Создать map-файл. Имеет смысл без опции /с. |
/Fo<file> |
Задать имя объектного файла. |
/Fpi |
Включение кода эмулятора сопроцессора. Начиная с 486-ого микропроцессора, данный параметр потерял актуальность. |
/Fr<file> |
Включить ограниченную информацию браузера. |
/FR<file> |
Включить полную информацию браузера. |
/G<c|d|z> |
Использовать соглашение вызова Паскаль, Си, stdcall. |
/H<number> |
Установить максимальную длину внешних имен. |
/I<name> |
Добавить путь для inc-файлов. Допускается до 10 опций /I. |
/link <opt> |
Опции командной строки компоновщика. Имеет смысл без опции /с. |
/nologo |
Не показывать заголовочный текст компилятора. |
/Sa |
Листинг максимального формата. |
/Sc |
Включить в листинг синхронизацию. |
/Sf |
Листинг первого прохода. |
/Sl<number> |
Длина строки листинга. |
/Sn |
Не включать в листинг таблицу символов. |
/Sp<number> |
Высота страницы листинга. |
/Ss<string> |
Текст подзаголовка листинга. |
/St<string> |
Текст заголовка листинга. |
/Sx |
Включить в листинг фрагменты условной компиляции. |
/Ta<file> |
Для компилирования файлов, расширение которых не .asm. |
/W<number> |
Устанавливает перечень событий компиляции, трактуемые как предупреждения. |
/WX |
Трактовать предупреждения как ошибки. |
/w |
Тоже что /W0 /WX. |
/X |
Игнорировать путь, установленный переменной окружения INCLUDE. |
/Zd |
Отладочная информация состоит только из номеров строк. |
/Zf |
Объявить все имена PUBLIC. |
/Zi |
Включить полную отладочную информацию. |
/Zm |
Включить совместимость с MASM 5.01. |
/Zp<n> |
Установить выравнивание структур. |
/Zs |
Выполнять только проверку синтаксиса. |
Параметр [/link опции_редактора_связей] предполагает автоматический запуск редактора связей (2 стадия трансляции) при успешном получении объектного модуля. Компиляция без компоновки осуществляется с использованием параметра /c.
В Visual Studio параметры командной строки ассемблера можно посмотреть в окне Properties проекта после выбора «инструмента» Microsoft Macro Assembler.
2 стадия
Программа LINK.EXE имеет синтаксис:
LINK [параметры] [файлы] [@файл_параметров]
Атрибут [параметры] может принимать следующие значения:
Параметр |
Комментарий |
/ALIGN:number |
Определяет выравнивание секций в линейной модели. По умолчанию 4096. |
/BASE:{address| @filename,key} |
Определяет базовый адрес (адрес загрузки). По умолчанию для ЕХЕ-программы адрес 0х400000, для DLL — 0х10000000. |
/COMMENT:["]comment["] |
Определяет комментарий, помещаемый в заголовок ЕХЕ- и DLL-файлов. |
/DEBUG |
Создает отладочную информацию для ЕХЕ- и DLL-файлов. Отладочная информация помещается в pdb-файл. |
/DEBUGTYPE:{CV|COFF| BOTH} |
CV — отладочная информация в формате Microsoft, COFF — отладочная информация в формате COFF (Common Object File Format), BOTH — создаются оба вида отладочной информации. |
/DEF:filename |
Определяет DEF-файл (файл определений). |
/DEFAULTLIB:library |
Добавляет одну библиотеку к списку используемых библиотек. |
/DLL |
Создать DLL-файл. |
/DRIVER[:{UPONLY|WDM}] |
Используется для создания NT-драйвера (Kernel Mode Driver). |
/ENTRY:symbol |
Определяет стартовый адрес для ЕХЕ- и DLL-файлов. |
/EXETYPE:DYNAMIC |
Данная опция используется при создании VxD-драйвера. |
/EXPORT:entryname [=internalname] [,@ordinal[,NONAME]] [,DATA] |
Данная опция позволяет экспортировать функцию из вашей программы так, чтобы она была доступна для других программ. При этом создается import-библиотека. |
/FIXED[:NO] |
Данная опция фиксирует базовый адрес, определенный в опции /BASE. |
/FORCE[:{MULTIPLE| UNRESOLVED}] |
Позволяет создавать исполняемый файл, даже если не найдено внешнее имя или имеется несколько разных определений. |
/GPSIZE:number |
Определяет размер общих переменных для MIPS и Alpha платформ. |
/HEAP:reserve[,commit] |
Определяет размер кучи (HEAP) в байтах. По умолчанию этот размер равен одному мегабайту. |
/IMPLIB:filename |
Определяет имя import-библиотеки, если она создается. |
/INCLUDE:symbol |
Добавляет идентификатор к таблице имен. |
/INCREMENTAL:{YES|NO} |
Если установлена опция /INCREMENTAL:YES, то в ЕХЕ добавляется дополнительная информация, позволяющая быстрее перекомпилировать этот файл. По умолчанию это информация не добавляется. |
/LARGEADDRESSAWARE[:NO] |
Указывает, что приложение оперирует адресами, большими 2 Гб. |
/LIBPATH:dir |
Определяет библиотеку, которая в первую очередь разыскивается компоновщиком. |
/MACHINE: {ALPHA|ARM|IX86|MIPS|MIPS16|MIPSR41XX|PPC|SH3 |SH4} |
Определяет платформу. В большинстве случаев это делать не приходится. |
/MAP[:filename] |
Дает команду создания МАР-файла. |
/MAPINFO:{EXPORTS|FIXUPS|LINES} |
Указывает компоновщику включить соответствующую информацию в МАР-файл. |
/MERGE:from=to |
Объединить секцию "from" с секцией "to" и присвоить имя "to". |
/NODEFAULTLIB[:library] |
Игнорирует все или конкретную библиотеку. |
/NOENTRY |
Необходимо для создания DLL-файла. |
/NOLOGO |
Не выводить начальное сообщение компоновщика. |
/OPT:{ICF[,iterations] |NOICF|NOREF|NOWIN98|REF| WIN98} |
Определяет способ оптимизации, которую выполняет компоновщик. |
/ORDER:@filename |
Оптимизация программы путем вставки определенных инициализированных данных (COMDAT). |
/OUT:filename |
Определяет выходной файл. |
/PDB: {filename|NONE} |
Определить имя файла, содержащего информацию для отладки. |
/PDBTYPE:{CON[SOLIDATE]| SEPT[YPES]} |
Определяет тип РDВ-файла. |
/PROFILE |
Используется для работы с профайлером (анализатором работы программы). |
/RELEASE |
Помещает контрольную сумму в выходной файл. |
/SECTION:name,[E][R][W][S][D] [K][L][P][X] |
Данная опция позволяет изменить атрибут секции. |
/STACK:reserve[,commit] |
Определяет размер выделяемого стека. Commit — определяет размер памяти, интерпретируемый операционной системой. |
/STUB:filename |
Определяет STUB-файл, запускающийся в системе MS DOS. |
/SUBSYSTEM:{NATIVE |WINDOWS|CONSOLE| WINDOWSCE|POSIX} [,#[.##]] |
Определяет, как запускать ЕХЕ-файл. CONSOLE — консольное приложение, WINDOWS — обычные WINDOWS-приложения, NATIVE — приложение для Windows NT, POSIX — создает приложение в POSIX-подсистеме WINDOWS NT. |
/SWAPRUN:{CD|NET} |
Сообщает операционной системе скопировать выходной файл в swap-файл (WINDOWS NT). |
/VERBOSE[:LIB] |
Заставляет выводить информацию о процессе компоновки. |
/VERSION:#[.#] |
Помещает информацию о версии в ЕХЕ-заголовок. |
/VXD |
Создать VXD-драйвер. |
/WARN[:warninglevel] |
Определяет количество возможных предупреждений, выдаваемых компоновщиком. |
/WS:AGGRESSIVE |
Несколько уменьшает скорость выполнения приложения (Windows NT). Операционная система удаляет данное приложение из памяти в случае его простоя. |
В Visual Studio параметры командной строки редактора связей можно посмотреть в окне Properties проекта.
Пусть файл с текстом программы на языке ассемблера называется PROG.ASM, тогда две стадии трансляции будут выглядеть следующим образом:
c:\masm32\bin\ml /c /coff PROG.ASM - в результате появляется модуль PROG.OBJ,
c:\masm32\bin\link /SUBSYSTEM:WINDOWS PROG.OBJ - в результате появляется исполняемый модуль PROG.EXE.