Адресная арифметика — это ключевая концепция в программировании на ассемблере, позволяющая эффективно работать с массивами и указателями. В этой статье мы разберем синтаксис адресной арифметики и приведем примеры для лучшего понимания.

Синтаксис адресной арифметики

Адресная арифметика используется для вычисления адресов ячеек памяти. В ассемблере часто используется следующая форма для адресных вычислений:

<инструкция> (<базовый_адрес>, <индекс>, <множитель>)
  • <инструкция> — это команда ассемблера (например, mov).
  • <базовый_адрес> — это регистр, содержащий базовый адрес (например, начало массива).
  • <индекс> — это регистр, содержащий индекс элемента массива.
  • <множитель> — это константа, умножающая значение индекса для корректного вычисления адреса (например, размер элемента массива в байтах).

Примеры использования

Пример 1: Доступ к элементам массива

Рассмотрим массив целых чисел int array[5]. Предположим, что адрес начала массива хранится в регистре rdi, а индекс текущего элемента — в регистре rcx. Для доступа к элементу массива мы используем инструкцию mov:

mov (%rdi, %rcx, 4), %eax
  • mov — копирует данные из источника в назначение.
  • (%rdi, %rcx, 4) — вычисляет адрес элемента массива:
    • %rdi — базовый адрес (начало массива).
    • %rcx — индекс текущего элемента.
    • 4 — множитель, равный размеру одного элемента (4 байта для типа int).

Если rcx равно 2, то (rcx, 4) вычисляет адрес третьего элемента массива:

Пример 2: Сложный пример с массивами структур

Рассмотрим более сложный пример — массив структур. Предположим, у нас есть структура:

struct Point {
    int x;
    int y;
};
struct Point points[5];

Каждая структура Point занимает 8 байт (4 байта для x и 4 байта для y). Для доступа к полю y третьей структуры используем:

mov (%rdi, %rcx, 8), %eax  ; Доступ к `x`
mov 4(%rdi, %rcx, 8), %ebx ; Доступ к `y`
  • (%rdi, %rcx, 8) — доступ к полю x:

    • %rdi — базовый адрес массива.
    • %rcx — индекс структуры.
    • 8 — множитель, равный размеру одной структуры.
  • 4(%rdi, %rcx, 8) — доступ к полю y:

    • 4 — смещение для доступа к полю y внутри структуры.

Если rcx равно 2, то 4(%rdi, %rcx, 8) вычисляет адрес поля y третьей структуры:

Заключение

Адресная арифметика в ассемблере позволяет эффективно вычислять адреса элементов массивов и структур, используя регистры и множители. Понимание этой концепции является ключом к написанию эффективного и корректного ассемблерного кода.