Лабораторная работа №1

Компиляция и компонование EXE-программ

Цель работы:
объяснить назначение и использование EXE-файлов и перевод ассемблерных программ в формат EXE-файлов.

Теоретический материал по теме лабораторной работы

ИНИЦИАЛИЗАЦИЯ EXE-ПРОГРАММЫ

Существует два основных типа загрузочных программ: EXE и COM. Рассмотрим требования к EXE-программам. DOS имеет четыре требования для инициализации ассемблерной EXE-программы:

Выход из программы и возврат в DOS сводится к использованию команды RET. Рис.1.1 иллюстрирует требования к инициализации и выходу из программы:
  1. ASSUME - это ассемблерная директива, которая устанавливает для ассемблера соответствие между конкретными сегментами и сегментными регистрами; в данном случае, CODESG - CS, DATASG - DS и STACKSG - SS. DATASG и STACKSG не определены в этом примере, но они будут представлены следующим образом:
    STACKSG SEGMENT PARA STACK Stack 'Stack' DATASG SEGMENT PARA 'Data'
    Ассоциируя сегменты с сегментными регистрами, ассемблер сможет определить смещения к отдельным областям в каждом сегменте. Например, каждая команда в сегменте кодов имеет определенную длину: первая команда имеет смещение 0, и если это двухбайтовая команда, то вторая команда будет иметь смещение 2 и т.д.
  2. Загрузочному модулю в памяти непосредственно предшествует 256-байтовая (шест.100) область, называемая префиксом программного сегмента PSP. Программа загрузчика использует регистр DS для установки адреса начальной точки PSP. Пользовательская программа должна сохранить этот адрес, поместив его в стек. Позже, команда RET использует этот адрес для возврата в DOS.
  3. В системе требуется, чтобы следующее значение в стеке являлось нулевым адресом (точнее, смещением). Для этого команда SUB очищает регистр AX, вычитая его из этого же регистра AX, а команда PUSH заносит это значение в стек.
  4. Загрузчик DOS устанавливает правильные адреса стека в регистре SS и сегмента кодов в регистре CS. Поскольку программа загрузчика использует регистр DS для других целей, необходимо инициализировать регистр DS двумя командами MOV, как показано на рис.1.1.
  5. Команда RET обеспечивает выход из пользовательской программы и возврат в DOS, используя для этого адрес, записанный в стек в начале программы командой PUSH DS. Другим обычно используемым выходом является команда INT 20H.
 
	CODESG	SEGMENT PARA 'Code'
	BEGIN	PROC FAR
	1.	ASSUME	CS:CODESG,DS:DATASG,SS:STACKG
	2.	PUSH	DS		;Записать DS в стек
	3.	SUB	AX,AX		;Установить ноль в AX
	PUSH		AX		;Записать ноль в стек
	4.	MOV	AX,DATASG	;Занести адрес
	MOV		DS,AX		;DATASG в DS
			. . .
	5.	RET			;Возврат в DOS
	BEGIN	ENDP
	CODESG	ENDS
	END	BEGIN 
	Рис.1.1 Инициализация и выход из программы

Теперь, даже если приведенная инициализация программы до конца не понятна - не отчаивайтесь. Каждая программа фактически имеет аналогичные шаги инициализации, так что их можно дублировать всякий раз при кодировании программ.

ПРИМЕР ИСХОДНОЙ ПРОГРАММЫ
 
		page 60,132
	TITLE 	EXASM1 (EXE) Пример регистровых операций 
	STACKSG 	SEGMENT PARA SACK 'Stack'
	DB 		12 DUP('STACKSEG')
	STACKSG 	ENDS
	
	CODESG		SEGMENT PARA 'Code'
	BEGIN		PROC FAR
	ASSUME 	SS:STACKSG,CS:CODESG,DS:NOTHING
	PUSH		DS		;Записать DS в стек
	SUB		AX,AX		;Записать ноль
	PUSH		AX		;в стек 
	MOV		AX,0123H	;Записать шест.0123 в AX
	ADD		AX,0025H	;Прибавить шест.25 к AX
	MOV		BX,AX		;Переслать AX в BX
	ADD		BX,AX		;Прибавить BX к AX
	MOV		CX,BX		;Переслать BX в CX
	SUB		CX,AX		;Вычесть AX из CX
	SUB		AX,AX		;Очистить AX
	NOP
	RET				;Возврат в DOS
	BEGIN		ENDP		;Конец процедуры 
	CODESG		ENDS		;Конец сегмента
	END		BEGIN		;Конец программы
	Рис.1.2 Обобщает предыдущие сведения в простой исходной программе 
		на ассемблере. Программа содержит сегмент стека - STACKSG
		и сегмент кода - CODESG.

STACKSG содержит один элемент DB (определить байт), который определяет 12 копий слова 'STACKSEG'. В последующих программах стек не определяется таким способом, но при использовании отладчика для просмотра ассемблированной программы на экране, данное определение помогает локализовать стек. CODESG содержит выполняемые команды программы, хотя первая директива ASSUME не генерирует кода. Директива ASSUME назначает регистр SS для STACKSG и регистр CS для CODESG. В действительности, эта директива сообщает ассемблеру, что для адресации в STACKSG необходимо использовать адрес в регистре SS и для адресации в CODESG - адрес в регистре CS. Системный загрузчик при загрузке программы с диска в память для выполнения устанавливает действительные адреса в регистрах SS и CS. Программа не имеет сегмента данных, так как в ней нет определения данных и, соответственно, в ASSUME нет необходимости ассигновать регистр DS.

Команды, следующие за ASSUME - PUSH, SUB и PUSH выполняют стандартные действия для инициализации стека текущим адресом в регистре DS и нулевым адресом. Поскольку, обычно, программа выполняется из DOS, то эти команды обеспечивают возврат в DOS после завершения программы.

На рис. 1.3 также собрана ранее изложенная информация в едином простом, но полном листинге ассемблерной программы, суммирующем два элемента данных в регистре АХ. Необходимые сегменты определяются так.
Директива ASSUME указывает ассемблеру выполнить следующие действия:
При загрузке программы с диска в память для исполнения загрузчик устанавливает правильные адреса сегментов в SS и CS, но, как показано первыми двумя инструкциями MOV, программа должна инициализировать DS (и, обычно, ES).
 
			page	60,132
	TITLE A04ASM2 (EXE) Операции перемещения и сложения
	
	STACK SEGMENT PARA STACK 'Stack'
			DW	32 DUP(0)
	STACK	ENDS
	
	DATASEG SEGMENT РARA 'Data'
	PLDD		DW	215
	FLDE		DW	125
	FLDF		DW	?
	DATASEG	ENDS
	
	CODESEG SEGMENT PARA 'Code'
	MAIN	PRОC	FAR
			ASSUME	SS:STACK,DS:DATASEG,CS:CODESEG
			MOV	AX,DATASEG	;Поместить адрес
			MOV	DS,AX		;Сегмента данных в DS
			MOV	AX,FLDD	;Поместить 0215 в АХ
			ADD	AX,FLDE	;Прибавить 0125 к АХ
			MOV	FLDF,AX	;Сохранить сумму в FLDF
			MOV	AX,4C00	;Завершить  работу
			INТ	21H
	MAIN		ENDP			;Конец процедуры
	CODESEG	ENDS			;Конец сегмента
			END	MAIN		;Конец программы
	Рис.1.3 ЕХЕ-программа с обычными сегментами

Задание:

Разработать ЕХЕ-программу, вычисляющую формулу по варианту. Где переменные х и у задаются пользователем, а в z сохраняется результат.

Варианты:
  1. z = x3-3x2+y
  2. z = 2x2-4x2+y2
  3. z = x2+y2
  4. z = 5x3-3y2
  5. z = (x2+y2)(x-y)
  6. z = x3-y2+(5x-y)
  7. z = x4-y2+3x
  8. z = x6-y2+5x
  9. z = y5-x3+2y
  10. z = (y3-5x)x2
  11. z = x5-3y3-2x
  12. z = x5-y3+4xy
  13. z = x3-3y2+2x2y
Ниже приведен пример написания EXE-программы для формулы z = x5+3y3-2x, где x и y - переменные, которые задаются пользователем (в данном случае х=2, у=3), z - переменная, в которую сохраняется результат,а a и b - значения степени (в данном случае а=3, в=2)
 
	DATASEG SEGMENT РARA 'Data'
		X	DW	2
		Y	DW	3
		A	DB	3
		B	DB	2
		Z	DW	0
	DATASEG	ENDS
	STACK SEGMENT PARA STACK 'Stack'
			DW 64 DUP(?)
	STACK ENDS
	CODESEG SEGMENT PARA 'Code'
	BEGIN	PRОC	FAR
	ASSUME	SS:STACKSG,DS:DATASG,CS:CODESG
		PUSH	DS
		SUB	AX,AX
		PUSH	AX
		MOV	AX,DATASG
		MOV	DS,AX
		SUB	AX,AX
		MOV	AX,X
		MUL	X
		MUL	X
		MUL	X
		MUL	X
		MOV	BX,Y
		MUL	Y
		MUL	Y
		MUL	A
		ADD	AX,BX
		MOV	DX,X
		MUL	B
		SUB	AX,DX
		MOV	Z,AX
		RET
	BEGIN	ENDP
	CODESG	ENDS
		END	BEGIN

Содержание отчета:

  1. Название работы
  2. Цель работы
  3. Основные теоритические сведения
  4. Текст программы с пояснениями
  5. Результат выполнения программы
  6. Выводы

Форма заполнения полученных результатов:

  1. В начале работы с Turbo Debugger записать содержимое регистров CS, DS, SS.
  2. Во время работы полученные результаты внести в таблицу:
Адрес команды Команда Содержимое регистров Значения флагов
IP AX BX CX       zf cf of af      
                               
                               
                               

Контрольные вопросы:

  1. Укажите, какая командная строка необходима, чтобы оттранслировать исходную программу MONITOR.ASM, создав объектный файл, файл листинга и файл перекрестных ссылок.

  2. Укажите командную строку для компоновки MONITOR.OBJ из вопроса 1, предложив, что для этого требуется отдельная программа компоновки.

  3. Укажите, какие команды требуются для того, чтобы запустить программу MONITOR.EXE из вопроса 2 (а) непосредственно из DOS; (б) под управлением DEBUG.

  4. Обясните назначения следующих файлов:
     
    (а) *.ASM
    (б) *.LST
    (в) *.MAP
    (г) *.CRF
    (д) *.OBJ
    (е) *.EXE