- •Nasm help v0.2
- •1. Основы
- •1.1 Секции
- •1.3 _Start
- •1.4 Регистры
- •1.5 Разыменование
- •2. Синтаксис nasm
- •2.1 Базовые команды
- •2.2 Вызовы ядра
- •2.3 Организация подпрограмм
- •2.4 Метки в подпрограммах
- •2.5 Сохранение регистров
- •2.6 Передача аргументов подпрограмме
- •3. Основные логические структуры в переложении на ассемблер.
- •3.1 Условие
- •3.2 Цикл
- •4. Заключение
Nasm help v0.2
Содержание:
1. Основы
1.1 Секции
1.2 Допустимые выражения
1.3 _start
1.4 Регистры
1.5 Разыменование
2. Синтаксис NASM
2.1 Базовые команды
2.2 Вызовы ядра
2.3 Организация подпрограмм
2.4 Метки в подпрограммах
2.5 Сохранение регистров
2.6 Передача аргументов подпрограмме
3. Основные логические структуры в переложении на ассемблер.
3.1 Условие
3.2 Цикл
4. Заключение
1. Основы
1.1 Секции
section .text : В этой секции находятся команды
section .data : В этой секции находятся инициализированные переменные
section .bss : В этой секции находятся НЕ инициализированные переменные
Инициализация — это присвоение значения области памяти перед началом работы.
1.2 Допустимые выражения (известные мне)
В секции .text:
1) <метка>:
2) <команда> <операнд1>, <операнд2>
Имя метки может быть любым, операнды опциональны, или же их может быть больше двух.
В секции .data:
1)<метка>: d* %%%
Вместо * вставляется одна из букв b,w,d (по выделению памяти: byte — байт, word — два байта, dword — четыре байта), Вместо %%% ставится инициализирующие значения, причём цифры перечисляются через запятую, буквы и строки обрамляются в одинарные или двойные кавычки, и если одновременно перечисляются буквы и цифры они разделяются запятой.
2)<метка>: equ %%%
Вместо %%% вставляется любое число или буква, после чего <метка> станет константой, и к ней можно обращаться без операции разыменования (см 1.5).
section .data
example: db 'Пример кода с буквами и цифрами', 10
В секции .bss:
<метка>: res* 100
Вместо * вставляется одна из букв b,w,d (по выделению памяти: byte — байт, word — два байта, dword — четыре байта), вместо числа 100 ставится то количество единиц памяти которое вы хотели бы выделить.
section .bss
example2: resw 42
В результате выполнения этого кода будет выделено 42 куска по 2 байта каждый, в целом 84 байта памяти.
1.3 _Start
Для компоновщика необходимо указать строку global _start
в начале и метку _start в секции .text. Тогда компоновщик поймёт что главная программа начинается здесь и заканчивается на первом вызове ядра(см 2.2).
1.4 Регистры
1) ax — accumulator (аккумулятор)
2) bx — base (база [основание])
3) cx — counter (счётчик)
4) dx — data (данные)
5) bp — base pointer (указатель базы)
6) sp — stack pointer (указатель стека)
7) si — source index (индекс источника)
8) di — deliver index (индекс приёмника)
9) ip — instruction pointer (указатель на инструкцию)
10) E-flags — регистр флагов
1-4: это регистры общего назначения, их можно изменять как заблагорассудится.
5-8: не являются регистрами общего назначения, но если сохранять их значение в стеке, то их можно использовать подобно 1-4
9,10: эти регистры не рекомендуется использовать
Примечание: в этой форме записи размер регистров 1-9 составляет 2 байта.
Морфология имён регистров:
1) У регистров общего назначения возможно обращение к старшему(high) или младшему(low) байту путём добавления соответствующей буквы в конец его имени без 'x' (Пример для регистра ax: ah; al)
2) С помощью префикса e- можно обратиться к 4-х байтовой версии регистра (Пример с ax: eax)
3) Также при помощи префикса r- можно обратиться в 8-ми байтовой версии регистра, но только на 64-битных процессорах (Пример с ax: rax)
