OS&SP_Part1.6_NASM.pptx
- Количество слайдов: 25
Лекция 6. NASM Операционные системы и системное программирование
Определение NASM — свободный (LGPL и лицензия BSD) ассемблер для архитектуры Intel x 86.
Синтаксис языка В NASM используется Intel-синтаксис записи инструкций. Предложение языка ассемблера NASM (строка программы) может состоять из следующих элементов: • Метка Инструкция Операнды Комментарий
Компиляция и компоновка • nasm -f format filename -o output
Формат выходных файлов Форма Описание bin файл произвольного формата, определяемого только исходным кодом. ригоден как для файлов данных, так и для модулей с исполняемыми кодами — например, системных загрузчиков, образов ПЗУ, модулей операционных систем, драйверов. SYS в MS-DOS или исполняемых файлов. COM. obj объектный модуль в формате OMF, совместимый с MASM и TASM. win 32 и win 64 бъектный модуль для 32 - и 64 -битного кода, совместимый с Win 32 - и Win 64 -компиляторами Microsoft. aout объектный модуль в варианте формата a. out, использовавшемся в ранних Linux-системах. aoutb версия формата a. out для BSD-совместимых операционных систем. coff объектный модуль в формате COFF, совместимом с компоновщиком из DJGPP. elf 32 и elf 64 объектный модуль в форматах ELF 32 и ELF 64, используемых в Linux и Unix System V, включая Solaris x 86, Unix. Ware и SCO Unix.
Основные регистры процессора Название Разрядность Основное назначение EAX 32 Аккумулятор EBX 32 База ECX 32 Счётчик EDX 32 Регистр данных EBP 32 Указатель базы ESP 32 Указатель стека
Базовые команды Assembler mov push pop add sub mul div cal ret
mov приёмник, источник – команда пересылки данных. Копирует содержимое источника в приёмник, источник не изменяется.
push r 32|m 32|C 32 – поместить в стек.
pop r 32|m 32 – считать данные из стека.
add приёмник, источник – выполняет сложение приёмника и источника, результат заносится в приёмник. Источник не изменяется. Но зато меняются флаги
sub приёмник, источник – вычитает источник из приёмника, результат заносит в приёмник
mul источник – беззнаковое умножениие, результат в EAX
div источник – беззнаковое деление, результат в EAX
call процедура – вызов процедуры.
ret ret|(ret число) – выход из процедуры. Если число указано, то после считывания адреса возврата из стека будет удалено указанное число байтов.
Структура модуля на ассемблере • global func • extern outerfunc • section. text func: Исходный код процедуры ret
Варианты передачи параметров Директива _fastcall Порядок передачи параметров Слево на право _cdecl Справо на лево _stdcall Справо на лево Освобождение стека Процедура Вызывающая программа Процедура Передача пара метров через регистры ECX, EDX Стек справо на лево Нет нет
_fastcall global func section. text func: add ECX, EDX mov EAX, ECX ret
_cdecl global func section. text func: push EBP mov EBP, ESP mov EAX, [EBP + 8] add EAX, [EBP + 12] pop EBP ret
_stdcall global func section. text func: push EBP mov EBP, ESP mov EAX, [EBP + 8] add EAX, [EBP + 12] pop EBP ret 8
Обозначение директив в Си • int __attribute__((stdcall)) func(int _a, int _b); • int __attribute__((cdecl)) func(int _a, int _b); • int __attribute__((fastcall)) func(int _a, int _b);
Пример вызова внешней процедуры на языке Assembler lobal func extern outerfunc section. text func : push ebp mov ebp, esp mov eax, [ebp + 8] mov ebx, [ebp + 12] push ebx push eax call outerfunc mov eax, [ebp + 8] mov ebx, [ebp + 12] add eax, ebx pop ebp ret
Пример вызова внешней процедуры на языке Си #include
Компоновку ассемблерных модулей с программами на Cи gcc –o имя_исполняемого_файла с. o asm. o


