ПОЗНАВАТЕЛЬНОЕ Сила воли ведет к действию, а позитивные действия формируют позитивное отношение Как определить диапазон голоса - ваш вокал
Игровые автоматы с быстрым выводом Как цель узнает о ваших желаниях прежде, чем вы начнете действовать. Как компании прогнозируют привычки и манипулируют ими Целительная привычка Как самому избавиться от обидчивости Противоречивые взгляды на качества, присущие мужчинам Тренинг уверенности в себе Вкуснейший "Салат из свеклы с чесноком" Натюрморт и его изобразительные возможности Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д. Как научиться брать на себя ответственность Зачем нужны границы в отношениях с детьми? Световозвращающие элементы на детской одежде Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия Как слышать голос Бога Классификация ожирения по ИМТ (ВОЗ) Глава 3. Завет мужчины с женщиной 
Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д. Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу. Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) - В простых моделях рынка спрос и предложение обычно полагают зависящими только от текущей цены на товар. | Исполнительный файл типа EXE I.Общие теоретические положения Средства компиляции программ на ассемблере и Примеры их использования Для компиляции программ, написанных на языке ассемблера, используются следующие программы: 1. транслятор Turbo Assembler (исполнительный файл TASM.EXE); 2. компоновщик Turbo Linker (исполнительный файл TLINK.EXE). Транслятор выполняет ассемблирование программы – транслирует команды процессора в машинный объектный код и генерирует OBJ-модуль. Формат OBJ-модуля уже приближен к исполнительной форме, но еще не готов к выполнению. На этапе ассемблирования транслятором могут выдаваться ошибки и предупреждения. Появление ошибки прекращает работу транслятора и OBJ-модуль не генерируется – необходимо устранить ошибку и провести повторное ассемблирование программы. Предупреждения не прекращают работу транслятора, OBJ-модуль генерируется, но программа может выполняться некорректно из-за наличия каких-то логических ошибок в ней, на что и указывают предупреждения. Компоновщик выполняет преобразование OBJ-модуля в исполнительный файл COM или EXE. Различие между этими файлами будет рассмотрено ниже. При использовании компоновщика имеется возможность объединить несколько OBJ-модулей в один исполнительный файл. Этот прием обычно используется при написании больших программ, состоящих из нескольких программных модулей. Также на этапе компоновки есть возможность подключить к программе какие-либо библиотеки. Процесс подготовки программы к выполнению включает в себя ассемблирование программы с помощью транслятора Turbo Assembler и дальнейшую компоновку с помощью компоновщика Turbo Linker. Исполнительный файл типа COM В исполнительном файле типа COM можно разместить только один физический сегмент. Поэтому при написании COM программы все команды и данные должны находиться в одном программном сегменте. При выполнении программы в единственном физическом сегменте располагается и стек. Стек «растет» сверху вниз – с конца физического сегмента к его началу. Размер программного сегмента с учетом возможного размера стека не должен превышать 64 Кб. В противном случае стек программы «налезет» на коды команд и данные, что может привести к некорректной работе программы. Размер COM файла не превышает 64 Кб, и в нем содержатся только машинные коды процессора и данные программы. Коды и данные физического сегмента COM файла размещаются не с нулевого смещения, а со смещения 100h (256 в десятичной с/с). С нулевого смещения располагается специальная структура данных объемом 256 байт, называемая префиксом программного сегмента. Обращение к данным и меткам в программе должно выполняться по сумме смещения переменной или метки и числа 256. Для этого служит директива ORG, задающая число, которое будет прибавляться ко всем смещениям, используемым для обращения к переменным и меткам программы. Это число используется только для прямой адресации, т. е. При обращении к переменным с непосредственным указанием их адресов. Формат директивы ORG следующий: ORG <число> Директива ORG указывается в программном сегменте перед первой командой или меткой. Пример программы типа COM: MySegment SEGMENT ORG 100h ASSUME CS:MySegment, DS:MySegment Start: <команда> . . . <команда> <вызов_функции_завершения_программы> <данные> . . . <данные> MySegment ENDS END Start Перед выполнением программы типа COM операционная система настраивает регистры CS, DS, ES, SS на начало физического сегмента, в котором размещаются коды и данные программы. Поэтому в дополнительной настройке эти сегментные регистры не нуждаются. Сегмент программы типа COM должен обязательно начинаться с команды, иначе компоновщик зафиксирует ошибку. Компоновщик также фиксирует ошибку, если в программе типа COM есть команды, в которых явным образом используются значения сегментных адресов программных сегментов. Например, команда Code SEGMENT . . . MOV AX, Code . . . Code ENDS будет являться ошибочной для программы типа COM, поскольку в регистр AX предпринимается попытка занести значение сегмента программного сегмента Code, а COM файл не имеет специальной информации для возможности выполнения этой команды. Завершение программы типа COM можно выполнить командой RET, которая перейдет на адрес, указанный в вершине стека. Стек инициализируется операционной системой и в него записывается адрес ячейки памяти, находящейся в префиксе программного сегмента. Эта ячейка памяти содержит команду завершения программы. Исполнительный файл типа EXE В исполнительном файле типа EXE физических сегментов может быть сколько угодно. Поэтому в программе типа EXE может быть любое число программных сегментов. Перед выполнением программы типа EXE операционная система настраивает регистр CS на сегмент, в котором находится точка входа в программу. Также операционная система настраивает регистр SS на стековый сегмент программы. Стековый сегмент может быть указан в программе явно с использованием ключевого слова STACK: <имя_сегмента> SEGMENT PARA STACK DB <размер_стека> DUP (?) <имя_сегмента> ENDS При этом в сегменте определяется размер стека в байтах. Параметр сегмента “PARA” определяет выравнивание содержимого сегмента по границе параграфа, т. е. физический адрес первого элемента сегмента кратен 16. Это необходимое условия для организации стекового сегмента. Если такого явного указания сегмента стека в программе нет, то стековым сегментом считается тот программный сегмент, в котором определена точка входа в программу. При этом компоновщиком выдается предупреждение “Warning: No Stack”. В этом случае следует учесть, что размер программного сегмента с учетом возможного размера стека не должен превышать 64 Кб, так же как и в COM файле. Регистр SP инициализируется операционной системой значением 0, если сегмента стека в программе нет или значением, совпадающим с размером стекового сегмента, указываемым в программе. Регистр SS инициализировать не требуется. Каждый сегментный регистр, который используется в директиве ASSUME, кроме CS, требуется настроить на начало того физического сегмента, в котором располагаются данные или коды, адресуемые с помощью данного сегментного регистра. Настройка может быть выполнена следующим образом: MOV AX, <имя_сегмента> MOV <имя_сегментного_регистра>, AX В файле типа EXE помимо кодов и данных программы имеется заголовок и специальная таблица настройки, которые в совокупности занимают не менее 512 байт. Размер таблицы настройки зависит от количества команд программы, в которых необходимо определять физический адрес того или иного программного сегмента. Например, последовательность команд настройки сегментного регистра, приведенная выше добавляет один элемент в таблицу настройки. В отличие от программы типа COM, в программе типа EXE могут использоваться команды вида Code SEGMENT . . . MOV AX, Code . . . Code ENDS и другие команды, использующие значения сегментных адресов программных сегментов, так как таблица настройки в EXE файле содержит необходимую информацию для выполнения таких команд. Пример программы типа EXE: MyStack SEGMENT STACK DB 512 DUP (?) ; стек размером 512 байт MyStack ENDS MyData SEGMENT <данные> . . . <данные> MyData ENDS MyCode SEGMENT ASSUME CS:MyCode, DS:MyData, SS:MyStack Start: MOV AX, MyData MOV DS, AX <команды> . . . <команды> MOV AX, 4C00h INT 21h ; завершение программы MyCode ENDS ENDS Start |