Ассемблер NASM для процессоров с архитектурой IA-32. Адресация. Флаги. Вызов внешних подпрограмм (1110584)
Текст из файла
Практическая работа №11Ассемблер NASM для процессоров с архитектурой IA-32АдресацияВызов внешних подпрограммМатериалыДокументация по ассемблеру NASM на русском (http://www.codenet.ru/progr/asm/nasm/)Юров В. И. и др. Assembler: учебник для вузов. СПб: Питер, 2008. 636 с.Полная документация по функциям GlobalAlloc (http://msdn.microsoft.com/enus/library/aa366574%28v=vs.85%29.aspx)иGlobalFree(http://msdn.microsoft.com/enus/library/aa366579%28v=vs.85%29.aspx).Документация по отладчику OllyDbg на cracklab.ru (http://cracklab.ru/art/ollydbg.php) иhabrahabr.ru (http://habrahabr.ru/post/93402/).Адресация. Группы регистровВ прошлых практических работах было дано общее описание регистровой памяти и основныеприемы работы с ней. Ниже представлено более подробное описание назначения основныхрегистров, которые стоит или не стоит использовать. Регистр является устройством временногохранения данных и используется с целью облегчения арифметических, логических и пересылочныхопераций.
Процессоры с архитектурой IA-32 содержат 14 программно доступных регистров(общего назначения и сегментные), указатель команд (EIP) и регистр флагов (EFLAGS).Регистры общего назначения (РОН)317150AHALEAXDHDLEDXCHCLECXBHBLEBX310EBPESPESIEDI1Восемь регистров общего назначения (РОН) имеют длину 32 бита и могут хранить любыезначения, однако каждый из них имеет свое назначение. Они поддерживают операнды-данныедлиной 1, 8, 16, 32 и — при использовании двух регистров — 64 бит; битовые поля от 1 до 32 бит;операнды-адреса длиной 16 и 32 бит. Эти регистры называются EAX, EBX, ECX, EDX, ESI, EDI,EBP, ESP.
Доступ к младшим 16 битам этих регистров выполняется независимо при использованиисоответствующих имен 16-битных регистров: AX, BX, CX, DX, SI, DI, BP и SP.Также могут использоваться индивидуально младший (биты 0-7) и старший (биты 8-15) байтырегистров AX, BX, CX, DX. Им соответствуют обозначения AH, DH, CH, BH и AL, DL, CL, BL.В свою очередь РОН также делятся на подгруппы: регистры данных, индексные регистры ирегистры-указатели.Регистры данных (относятся к РОН)EAX — регистр-аккумулятор, используется для накопления данных (“accumulator”);EBX — регистр базы (“base”);ECX — регистр-счетчик (“counter”);EDX — регистр данных (“data”).Эти регистры используются для хранения данных и выполнения различных арифметических илогических операций.
Некоторые команды неявно используют определенный регистр. Например,ECX может играть роль счетчика цикла.Индексные регистры (относятся к РОН)Индексные регистры предназначены для хранения индексов при работе с массивами.ESI (source index) содержит индекс источника;EDI (destination index) содержит индекс приёмника.Эти регистры можно использовать и как регистры общего назначения.Регистры-указатели (относятся к РОН)Основным назначением регистров-указателей является хранение индексов (смещений)относительно некоторого начала массива (базы) при выборке операндов из памяти.
При этом адресбазы обычно хранится в одном из базовых регистров (EBX или EBP). Обращаться с ними нужноболее осторожно, чем с предыдущими группами регистров, иначе можно получить непредвиденныйрезультат (недопустимое обращение к памяти, выход за границы массивы и т. п.).В данную группу регистров входят следующие:EBP — указатель базы (“base pointer”);ESP — указатель стека (“stack pointer”).Регистр EBP служит указателем базы при работе с данными в стеке. Может использоватьсяпроизвольным образом в большинстве арифметических и логических операций или для временногохранения каких-либо данных.
ESP указывает на вершину стека. Он используется командами,которые работают со стеком. ESP не стоит использовать для других целей.Примечание. Нельзя обратиться по имени к старшим или младшим битам регистров ESI,EDI, EDP, ESP, в отличие от EAX, EBX, ECX, EDX.Следует отметить, что регистры могут быть неравнозначны и при использовании определенныхинструкций могут иметь специальное значение:☼ EAX — аккумулятор, операнд-источник или приемник результата (некоторые инструкциимогут быть короче на один байт при использовании EAX);☼ EBX — указатель на данные в сегменте DS;☼ ECX — счетчик для цепочечных (например, MOVS) и циклических (с префиксом REP ит.п.) инструкций;☼ EDX — адрес порта ввода-вывода для инструкций IN / INS, OUT / OUTS;☼ ESI — указатель на операнд-источник в сегменте DS для цепочечных инструкций;☼ EDI — указатель на операнд-приемник в сегменте ES для цепочечных инструкций;☼ EBP — указатель на данные в сегменте SS.2Сегментные регистрыПроцессор с архитектурой IA-32 включает 6 непосредственно доступных 16-битных регистровселекторов сегментов.
С каждым сегментным регистром ассоциирован программно-недоступныйкэш дескриптора соответствующего сегмента, содержащий базовый адрес сегмента в линейномадресном пространстве, предел сегмента и атрибуты сегмента. Этот кэш заполняется при загрузкезначения в сегментный регистр. В реальном режиме предел сегмента всегда 0FFFFh, атрибутыигнорируются, а базовый адрес вычисляется сдвигом значения селектора на 4 бита влево. Взащищенном режиме кэш заполняется соответствующими значениями из дескрипторной таблицы.310Программно недоступные поля (загружаются автоматически)CSлинейный базовый адреспределатрибутыDSлинейный базовый адреспределатрибутыESлинейный базовый адреспределатрибутыFSлинейный базовый адреспределатрибутыGSлинейный базовый адреспределатрибутыSSлинейный базовый адреспределатрибутыСегментные регистры предназначены для обеспечения сегментной адресации.CS — регистр сегмента кода (“code segment”).
Хранит селектор сегмента кода. Процессоризвлекает очередную инструкцию для исполнения, формируя логический адрес из селектора в CS исмещения в регистре EIP. Значение этого регистра нельзя изменить непосредственно, оно меняетсяв командах межсегментного перехода (FAR JMP), межсегментного вызова (FAR CALL), привызове обработчика прерывания (INT) и при возврате из дальней процедуры (RETF) илиобработчика прерывания (IRET).Регистры DS, ES, FS и GS хранят селекторы сегментов данных.DS — регистр сегмента данных (“data segment”).
Если инструкция обращается к памяти, носодержит только смещение, то считается, что она обращается к данным в сегменте DS.ES — регистр дополнительного сегмента данных (“enhanced segment”). Сегмент ES можетиспользоваться без явного указания в цепочечных командах.FS и GS — используются при обращении к памяти только при явном использовании винструкции префиксов этих сегментов.SS — регистр сегмента стека (“stack segment”).
Регистр SS хранит селектор сегмента стека.Стек используется для передачи параметров подпрограммам и для сохранения адреса возврата привызове подпрограммы или обработчика прерывания. Вершиной стека считается байт, логическийадрес которого образуется из селектора в регистре SS и смещения в регистре ESP.
Программаможет непосредственно изменить значение SS, что дает ей возможность переключаться междунесколькими стеками. Причем на время выполнения команды MOV SS,xxxx и одной командыследующей за ней (обычно это MOV ESP,xxxx) запрещаются маскируемые и блокируютсянемаскируемые прерывания.Значения селекторов могут быть загружены при исполнении программы и являютсяспецифичными для задачи. Это значит, что регистры сегментов в защищенном режимеперезагружаются автоматически при переключении микропроцессора на другую задачу.
В то жевремя, использование сегментных регистров зависит от того, какая модель адресного пространства3используется. При использовании сплошной модели в сегментные регистры загружается один и тотже селектор сегмента с базой 0 и пределом 0FFFFFFFFh, обеспечивая доступ ко всемулинейному адресному пространству. При использовании сегментированной модели значенияселекторов в сегментных регистрах независимы, так что программа может одновременнообращаться к шести сегментам.Данную группу регистров необходимо было явно использовать в 16-разрядномпрограммировании.
В Win32 (начиная с Windows 95 и выше) такой проблемы уже не существует.Сегменты всё еще существуют, но о них не нужно заботиться, поскольку они уже не 64 КБ (как при16-ти разрядах), а 4 ГБ. Обращаться к регистрам этой группы не стоит — это может повлечьнепредвиденные ситуации.Указатель команд15310IPEIPEIP — указатель команд, указатель инструкции (instruction pointer). Является 32-разряднымрегистром. EIP содержит смещение следующей команды, подлежащей выполнению.Относительный адрес отсчитывается от начала сегмента исполняемой задачи. Указатель командEIP непосредственно недоступен (это его сокращенное название, а не мнемоническое обозначение,используемое в языке программирования), но он управляется явно командами управления потоком,прерываниями и исключениями (JMP, CALL, RET, IRET, команды условного перехода).Получить текущее значение EIP можно, если выполнить команду CALL, а затем прочитать словона вершине стека.Младшие 16 бит регистра EIP обозначаются IP и могут быть использованы процессоромнезависимо при исполнении 16-битного кода.Регистр флаговРегистр EFLAGS содержит группу флагов состояния, управления и системных флагов:3122 21 20Зарезервированы(установлены в0)IDVIP19 18 17 16 15 14 13 12 11 10 9VIFACVMRF 0 NTIOPLOFDFIF87TFSF65 43 2 1 0ZF 0 AF 0 PF 1CFFLAGSРегистр флагов содержит отдельные биты: флаги управления и признаки результата.Неопределенные биты зарезервированы, то есть на данный момент они не имеют значения,однако могут быть использованы для специальных целей в следующих версиях процессора.
Термин«установлен» означает значение 1, а термин «сброшен» - значение 0.Некоторые из флагов могут быть изменены специально предназначенными для этой целиинструкциями. Для изменения или проверки группы флагов можно воспользоваться командами:☼ LAHF / SAHF — загрузка / сохранение младших 8 битов регистра флагов в регистре AH;☼ PUSHF / POPF — помещение / извлечение из стека младших 16 битов регистра флагов;☼ PUSHFD / POPFD — помещение / извлечение из стека 32-битного регистра EFLAGS.Флаги статусаФлаги статуса (признаки результата) устанавливаются после выполнения арифметических илогических команд (таких как ADD, SUB, MUL, DIV):CF (carry) — флаг переноса.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.