Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASMhelp_Kiselev.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
68.1 Кб
Скачать

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)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]