Скачать презентацию Лекция 6 NASM Операционные системы и системное программирование Скачать презентацию Лекция 6 NASM Операционные системы и системное программирование

OS&SP_Part1.6_NASM.pptx

  • Количество слайдов: 25

Лекция 6. NASM Операционные системы и системное программирование Лекция 6. NASM Операционные системы и системное программирование

Определение NASM — свободный (LGPL и лицензия BSD) ассемблер для архитектуры Intel x 86. Определение NASM — свободный (LGPL и лицензия BSD) ассемблер для архитектуры Intel x 86.

Синтаксис языка В NASM используется Intel-синтаксис записи инструкций. Предложение языка ассемблера NASM (строка программы) Синтаксис языка В NASM используется Intel-синтаксис записи инструкций. Предложение языка ассемблера NASM (строка программы) может состоять из следующих элементов: • Метка Инструкция Операнды Комментарий

Компиляция и компоновка • nasm -f format filename -o output Компиляция и компоновка • nasm -f format filename -o output

Формат выходных файлов Форма Описание bin файл произвольного формата, определяемого только исходным кодом. ригоден Формат выходных файлов Форма Описание 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 Основные регистры процессора Название Разрядность Основное назначение EAX 32 Аккумулятор EBX 32 База ECX 32 Счётчик EDX 32 Регистр данных EBP 32 Указатель базы ESP 32 Указатель стека

Базовые команды Assembler mov push pop add sub mul div cal ret Базовые команды Assembler mov push pop add sub mul div cal ret

mov приёмник, источник – команда пересылки данных. Копирует содержимое источника в приёмник, источник не mov приёмник, источник – команда пересылки данных. Копирует содержимое источника в приёмник, источник не изменяется.

push r 32|m 32|C 32 – поместить в стек. push r 32|m 32|C 32 – поместить в стек.

pop r 32|m 32 – считать данные из стека. pop r 32|m 32 – считать данные из стека.

add приёмник, источник – выполняет сложение приёмника и источника, результат заносится в приёмник. Источник add приёмник, источник – выполняет сложение приёмника и источника, результат заносится в приёмник. Источник не изменяется. Но зато меняются флаги

sub приёмник, источник – вычитает источник из приёмника, результат заносит в приёмник sub приёмник, источник – вычитает источник из приёмника, результат заносит в приёмник

mul источник – беззнаковое умножениие, результат в EAX mul источник – беззнаковое умножениие, результат в EAX

div источник – беззнаковое деление, результат в EAX div источник – беззнаковое деление, результат в EAX

call процедура – вызов процедуры. call процедура – вызов процедуры.

ret ret|(ret число) – выход из процедуры. Если число указано, то после считывания адреса ret ret|(ret число) – выход из процедуры. Если число указано, то после считывания адреса возврата из стека будет удалено указанное число байтов.

Структура модуля на ассемблере • global func • extern outerfunc • section. text func: Структура модуля на ассемблере • global func • extern outerfunc • section. text func: Исходный код процедуры ret

Варианты передачи параметров Директива _fastcall Порядок передачи параметров Слево на право _cdecl Справо на Варианты передачи параметров Директива _fastcall Порядок передачи параметров Слево на право _cdecl Справо на лево _stdcall Справо на лево Освобождение стека Процедура Вызывающая программа Процедура Передача пара метров через регистры ECX, EDX Стек справо на лево Нет нет

_fastcall global func section. text func: add ECX, EDX mov EAX, ECX ret _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 _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 _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)) Обозначение директив в Си • 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 Пример вызова внешней процедуры на языке 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 <stdio. h> #include <stdlib. h> int Пример вызова внешней процедуры на языке Си #include #include int func(int a, int b); extern void __attribute__((stdcall)) outerfunc(int a, int b) { printf("a=%d, b=%dn", a, b); } int main(int argc, char** argv) { int r = func(atoi(argv[1]), atoi(argv[2])); printf("%dn", r); } return 0;

Компоновку ассемблерных модулей с программами на Cи gcc –o имя_исполняемого_файла с. o asm. o Компоновку ассемблерных модулей с программами на Cи gcc –o имя_исполняемого_файла с. o asm. o