From eeb7752c6d92978da4ef0f8c761f2070c46ad287 Mon Sep 17 00:00:00 2001 From: nihonium Date: Mon, 21 Mar 2022 18:46:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=81=D0=BF=D0=B5=D0=BA?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nasm/notices.md | 66 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/nasm/notices.md b/nasm/notices.md index 85057a1..9fe1c7d 100644 --- a/nasm/notices.md +++ b/nasm/notices.md @@ -1,13 +1,20 @@ +# A + +* Есть стандартная библиотека, с которой это будет слинковано +* return 0 +* Очистить стек +* + # Notices ## X86 * cmovXX (перемещение с условием) * setXX (установка бита с условием) -* аргументы через стек в обратном порядке -* удаление из стека лежит на вызывающем -* результат работы - в al, ax, eax (стандартные типы) -* дробные - в регистрах сопроцессора +* Аргументы через стек в обратном порядке +* Удаление из стека лежит на вызывающем +* Результат работы - в al, ax, eax (стандартные типы) +* Дробные - в регистрах сопроцессора * cdecl (декларация языка Си) * push/pop - стек * base pointer - для доступа к локальным переменным @@ -15,15 +22,62 @@ ``` printf(str, x, y) --- -push L1 push dword [y] push dword [x] push str call printf +-> push L1 +jmp printf --- after call: L1: add esp, 12 ; 3 * 4 --- result in eax register (number of printed arguments) ``` -* в стек помещается сначала адрес возврата (адрес, откуда вызвали, плюс длина данной инструкции) +* В стек помещается сначала адрес возврата (адрес, откуда вызвали, плюс длина данной инструкции) +* ret -> pop ???; jmp ??? +* envp, argv, argc - заталкиваются в стек до функции main и ее аргументов +* str db, dw, dd, dq (define byte/word/double word) = 12,14,0 (или 'ABCDE', 13, 0), 13 - новая строка, 0 - нулевой байт +* x resb(w/d/q) 1 +* В глобальных переменных - нуль (по умолчанию) +* section (segment - устар.) + ``` + .text (код) + .data (иниц. данные) + .rdata (константы) + .bss (неиниц. данные) + ``` +* .bss хранится в виде размера (выделяется в момент запуска) + ``` + section .text + push + push + call + section .data + str db '%d',0 + section .bss + x resd 1 + ``` +* global (например, main) + ``` + global main + ``` +* Добавляет подчеркивания к меткам, _main, например (M$ only) +* Вместо линковки вызываем gcc (gcc знает, где стандартная библиотека) +* Конвенция fastcall (часть аргументов через регистры, 6 регистров для Linux, в прямом порядке, прочее - в стек в обратном) +* Выравнивание стека для x86_64 +* Стандартный эпилог и пролог: + +``` + push ebp + mov ebp, esp + ... + mov edx, [ebp + 8] ; адрес через 2 байта от вершины стека + ... + mov esp, ebp ; восстанавливаем для функции, вызвавшей данную + pop ebp + ret +``` +* ebp указывает на вершину стека +* Пролог, эпилог почти обязателен +* sub esp, 32 - для локальных переменных (ebp остался), размер всех локальных переменных функции, обращение к локальным переменным - с минусом от ebp