МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Омский государственный технический университет
А.Н. ФЛОРЕНСОВ
ЛАБОРАТОРНЫЙ ПРАКТИКУМ ПО СПО
Методические указания
ОМСК 2006
1
УДК 681.3
ББК 32.973.73
Ф 73
Рецензенты:
Составитель: Флоренсов А.Н.
Ф 73 Лабораторный практикум по СПО.
Метод. указ. – Омск: Изд-во ОмГТУ, 2006. 64 с.
Предназначены для профессиональной подготовки студентов и бакалавров направления «Информатика и вычислительная техника» по дисциплине "Системное программное обеспечение".
Подготовлено кафедрой «Информатика и вычислительная техника» и одобрено редакци- онно-издательским советом ОмГТУ.
© Флоренсов А.Н., 2006
© Омский государственный
технический университет, 2006
2
Лабораторная работа №1.
Содержание работы. Изучение основ разработки системных программ на языке ассемблера путем использования доступа к операционной системе посредством программных прерываний.
Предварительные сведения. Некоторые операционные системы, более дружественные к профессиональному разработчику, чем другие, позволяют ему доступ к системным функциям API через механизм программных прерываний. Этот вариант доступа практически доступен только в программировании на уровне языка ассемблера. Вместо вызова системной функции по имени, как в случае общего доступа к API функциям, здесь используется команда с мнемокодом INT, имеющая в качестве аргумента единственный операнд – номер прерывания. Это значение для архитектуры IA32 должно находиться в пределах от 0 до 255, причем конкретное значение выбрано разработчиками ОС. Сложившейся практикой в этой области разработок является использование общего номера прерывания (как бы общего номера входа), а детализация – какая именно функция API запрашивается - задается программистом в регистре.
Для ОС Linux в качестве указанного номера выбран 80H, а в однозадачной ОС MS-DOS, входящей в состав современных ОС от Microsoft, для большинства системных функций должен быть номер 21H. Указанные константы заданы в шестнадцатеричной системе, в форме принятой для большинства языков ассемблера с помощью префикса, который задается латинской буквой 'H'. Практической альтернативой такой записи является задание указанных констант в десятичной форме, что дает для них записи 128 и 33, соответственно. Следует учитывать, что в профессиональном программировании на ассемблере используется преимущественно шестнадцатеричная запись констант, что обусловлено выдачей системными программами дизассемблеров большей части своей информации именно в этой форме, поскольку она лучше соответствует побайтовому размещению информации в ячейках машинной памяти.
ВОС Linux номер системной функции должен быть помещен в регистр EAX,
ав MS-DOS – в регистр AH. Никакого семантического контроля над программистом средства программирования на ассемблере в большинстве ситуаций не имеют, поэтому следует быть особенно внимательным при задании подобной информации.
ВОС Linux номерами системных функций write, read и exit, служат, соответственно, 4, 3 и 1. Более обширный список системных функций вместе с их номерами, обеспечивающими доступ через программное прерывание INT 80H, дает файл unistd.h, размещаемый обычно в каталоге /usr/include/asm. Часть информации из начала этого файла приведена в табл. 1.
|
Табл. 1. Номера системных функций в Linux |
#define __NR_exit |
1 |
#define __NR_fork |
2 |
#define __NR_read |
3 |
#define __NR_write |
4 |
#define __NR_open |
5 |
3
#define __NR_close |
6 |
#define __NR_waitpid |
7 |
#define __NR_creat |
8 |
#define __NR_link |
9 |
#define __NR_execve |
11 |
#define __NR_chdir |
12 |
#define __NR_time |
13 |
#define __NR_mknod |
14 |
#define __NR_mkdir |
39 |
#define __NR_rmdir |
40 |
#define __NR_dup |
41 |
#define __NR_ioctl |
54 |
#define __NR_fcntl |
55 |
#define __NR_dup2 |
63 |
#define __NR_reboot |
88 |
Названия системных функций в этой таблице приведены вместе с именным префиксом __NR_, используемым разработчиками в компонентах исходного текста программ операционной системы и позволяющим отличать именованные объекты внутри этих программ, т.е. сами имена подпрограмм и отвечающие им значения номеров.
ВОС MS-DOS номерами системных функций write, read и exit, служат, соответственно, 40H, 3fH и 2EH. Из-за практической неупотребительности этой ОС где-либо, кроме традиционного преподавания программирования на ассемблере в области операционных систем от Microsoft, другие системные функции MS-DOS заметного интереса для обучения уже не представляют и не приводятся. Заинтересованным студентам следует обратиться к соответствующей литературе [1-3, 5-8, 11-17].
Аргументы системных функций перед выполнением команды программного прерывания помещаются в регистры. Операционная система Linux использует систематический подход в таком размещении исходной информации. Согласно ему, информация задающая аргументы вызова системной функции, соответствующие прототипу функции на языке Си, помещается последовательно в регистры EBX, ECX, EDX, ESI, EDI. Причем для первого аргумента она помещается в регистр EBX, для второго аргумента - в регистр ECX, для третьего - в регистр EDX и т.д.
ВОС MS-DOS подобные правила не систематизированы и чаще всего относятся только к конкретной системной функции. Последнее одной из причин имеет отсутствие в этой ОС стандартизированного программного интерфейса на языке Си, поскольку вся эта ОС в свое время разрабатывалась, модифицировалась и чаще всего использовалась программистами на уровне языка ассемблер. При обучении на указанной ОС следует иметь в виду, что вся система и программирование на ней используют исключительно 16-ти и 8-битные регистры.
При вызове в ОС MS-DOS функций write, read, которые используют номера 40H, 3f H, значение хэндла должно быть помещено в регистр BX. Регистр DX служит при этом для передачи адреса буфера ввода или вывода, откуда выводятся или куда читаются данные. Регистр CX служит для передачи в системную функ-
4
цию числа записываемых байтов или максимальное число запрашиваемых для ввода.
Прочитанное число символов при вводе системной функцией чтения (по значению хэндла открытого файла) помещается в Linux в регистр EAX, а в MS-DOS помещается в регистр AX.
Основные действия по подготовке информации аргументов системной функции выполняются в подавляющем числе ситуаций компьютерными командами, которые называются командами пересылки и записываются мнемокодом MOV. Команда эта имеет два операнда, записываемых последовательно через запятую. В левой операнде задается место размещение пересылаемой информации и для данной лабораторной работы в качестве этого операнда указывается один из регистров программиста. Второй операнд задает пересылаемое значение или место нахождения исходных данных. Здесь можно указать значение числа или имя области данных. Во втором случае команда MOV, записанная в форме
MOV регистр, имя_области_данных
помещает в регистр регистр адрес области данных, указанной именем во втором операнде. Кроме того, в этом операнде можно указывать адресное выражение. Адресное выражение, в общем случае достаточно сложное подобно адресным выражениям языка Си, записывается в простейших случаях в виде
имя_области_данных + число.
Такая запись, по смыслу использования и по интерпретации компилятора с последующим выполнением в процессоре компьютера, задает место в памяти компьютера, которое на столько байтов находится дальше начала указанной в ней области данных, каково значение элемента число в ней. Так запись txt+5 обозначает место в области txt, отстоявшем от начала области на пять байтов.
Обращение к системной функции write в ОС Linux для записи пяти символов из области данных txt в стандартный вывод (т.е. в простейшем случае, на экран), будет таким образом записываться в виде фрагмента ассемблерной программы в виде
MOV EAX, 4
MOV EBX, 1 MOV ECX, txt MOV EDX, 5 INT 80H
Здесь в качестве хэндла стандартого вывода использовано постоянное для Unix
подобных систем значение 1.
Аналогичное обращение к системной функции для вывода на экран в ОС MSDOS запишется в виде
MOV AH, 40H MOV BX, 1 MOV DX, txt MOV CX, 5 INT 21H
5