- •Введение
- •Лабораторная работа № 1
- •Цель работы:
- •Контрольные вопросы:
- •Задание к лабораторной работе:
- •Лабораторная работа № 2
- •Цель работы:
- •Цель работы:
- •Задания к лабораторной работе:
- •Лабораторная работа № 3
- •Контрольные вопросы:
- •Задания к лабораторной работе:
- •Лабораторная работа № 4
- •Цель работы:
- •Контрольные вопросы:
- •Задания к лабораторной работе:
- •Лабораторная работа № 5
- •Цель работы:
- •Контрольные вопросы:
- •Задания к лабораторной работе:
- •Лабораторная работа № 6
- •Цель работы:
- •Лабораторная работа № 7
- •Цель работы:
- •Пример программы для ос Linux:
- •Контрольные вопросы:
- •Задания к лабораторной работе
- •Лабораторная работа № 8
- •Цель работы:
- •Пример программы на Ассемблере, использующей Windows api:
- •Контрольные вопросы:
- •Задания к лабораторной работе:
Пример программы для ос Linux:
.text #Секция кода
.globl _start
#метка _start должна быть объявлена как глобальная
#Линкер устанавливает на неё точку входа
_start:
movl $0x5,%eax #Открыть файл
movl $filename,%ebx #указатель на имя
movl $01102,%ecx
#Открыть для чтения/записи,
#если не существует- создать,
#если существует – стереть всё содержимое
movl $0644,%edx
#Права доступа к создаваемому файлу
int $0x80 #Ядро Линукса
movl %eax,%ebx #Дескриптор файла
movl $len,%edx #Длина строки
movl $message,%ECX #указатель на строку
movl $0x4,%EAX #Писать в дескриптор
int $0x80 #Ядро Линукса
movl $0x6,%eax #Закрыть дескриптор
int $0x80 #Ядро Линукса
movl $0x1,%eax #Выйти из программы
xorl %ebx,%ebx #Код возврата 0
int $0x80 #Ядро Линукса
.data #Секция данных
message: .string "Hello, world!\n" #Данные
len = .-message-1 #Длина данных, исключая концевой \0
filename: .string "myfile.txt" #Имя файла
Контрольные вопросы:
1. Как будет выглядеть в синтаксисе AT&T команда mov eax, 5?
2. Поясните назначение суффиксов b,w,l, приписываемых к команде.
3. Для чего служит прерывание int $0x80?
4. Каким образом передаются параметры системному вызову? Каким образом возвращается значение?
5. Как можно узнать, что при выполнении системного вызова произошла ошибка?
4. Что показывает метка _start? Почему её необходимо объявлять как глобальную?
5. Объявите строку со значением “qwerty”, на которую можно ссылаться с помощью метки string1.
Задания к лабораторной работе
Во всех заданиях имя файла (файлов) задаётся в виде строки в секции данных программы. Допустимо (хотя и не рекомендуется) читать и записывать файлы по одному символу. Выводить числовые значения, если не указано иное, необходимо в шестнадцатеричном виде.
1. Перевести текстовый файл из формата Windows в формат Linux (заменить все пары символов 0x0d 0x0a на 0x0a)
2. Перевести текстовый файл из формата Linux в формат Windows (заменить все символы 0x0a на пары 0x0d 0x0a).
3. Вывести на стандартный вывод размер файла на диске.
4. Создать файл, создать жёсткую ссылку на него, оригинал уничтожить.
5. Форкнуть себя, родителя уничтожить, потомку выдать на стандартный вывод свой pid.
6. Выдать на стандартный вывод текущее время (просто в секундах, форматировать не надо)
7. Закодировать файл по правилу "кодирование длинных серий" (RLE)
При таком кодировании первый байт обозначает число повторений второго байта, третий - четвёртого, и т.д. Если длина серии превосходит 255, то серия кодируется как несколько серий.
Пример (в шестнадцатеричном виде):
Входной файл: 00 7e 7e 0a 11 11 11
Выходной файл: 01 00 02 7e 01 0a 03 11
8. Декодировать файл по правилу "кодирование длинных серий" (RLE)
Пример (в шестнадцатеричном виде):
Входной файл: 01 00 02 7e 01 0a 03 11
Выходной файл: 00 7e 7e 0a 11 11 11
Лабораторная работа № 8
Использование ассемблера в ОС Windows
Цель работы:
Научиться писать программы, использующие основные возможности ОС Windows.
В операционной системе Windows взаимодействие программы с ОС осуществляется с помощью вызова функций Windows API. Это функции экспортируются из стандартных динамических библиотек Windows. Вызов функций осуществляется по формату stdcall , то есть параметры помещаются в стек в обратном порядке (начиная с последнего), командой call осуществляется вызов функции, стек очищает вызываемый код. В регистре eax функция возвращает результат выполнения.
Возникновение ошибки можно определить, если возвращаемое значение равно специальной константе, например INVALID_HANDLE_VALUE.
Функции Windows API, работающие со строками, представлены в двух вариантах. Вариант, работающий с ASCII строками, оканчивается на литеру A; вариант, работающий с UNICODE-строками – на литеру W. В наших лабораторных работах мы будем использовать ASCII-строки.
