Добавить в корзинуПозвонить
Найти в Дзене
Old Programmer

Программирование на ассемблере. Статья 13 (адресация)

На моем канале Old Programmer много статей и роликов о программировании, здесь вы найдете все ссылки, разбитые по темам:
Программирование. Тематическое оглавление моего Zen-канала (Old Programmer). А здесь все об ассемблере GAS. Это мой 100-й материал. Поздравляю сам себя. Адресация памяти. Ассемблер x86-64 Сегодня интересная тема - адресация памяти. Другими словами, какие способы существуют, чтобы получить доступ к той или иной ячейке (или области) памяти. На самом деле во всех примерах, которые есть в моих статьях об ассемблере адресация есть. Но теперь пришло время не много все систематизировать. Вместо того, чтобы долго и нудно объяснять все виды адресации, я решил написать программу, которая бы все эти виды адресации демонстрировала. Эта программа asm80.s. В ней 6 способов адресации. С помощью каждой из них код символа перебрасывается из одной ячейки памяти в другую, а потом выводится на консоль. Для чистоты эксперимента после каждого вывода последняя ячейка памяти чистится (фу
Оглавление

На моем канале Old Programmer много статей и роликов о программировании, здесь вы найдете все ссылки, разбитые по темам:
Программирование. Тематическое оглавление моего Zen-канала (Old Programmer). А здесь все об ассемблере GAS.

Это мой 100-й материал. Поздравляю сам себя.

Коты мне помогают, коты мои друзья
Коты мне помогают, коты мои друзья

Адресация памяти. Ассемблер x86-64

Сегодня интересная тема - адресация памяти. Другими словами, какие способы существуют, чтобы получить доступ к той или иной ячейке (или области) памяти. На самом деле во всех примерах, которые есть в моих статьях об ассемблере адресация есть. Но теперь пришло время не много все систематизировать.

Вместо того, чтобы долго и нудно объяснять все виды адресации, я решил написать программу, которая бы все эти виды адресации демонстрировала. Эта программа asm80.s. В ней 6 способов адресации. С помощью каждой из них код символа перебрасывается из одной ячейки памяти в другую, а потом выводится на консоль. Для чистоты эксперимента после каждого вывода последняя ячейка памяти чистится (функция cle). Вывод символа осуществляется функцией pr. Соответственно, правильность выполненных действий подтверждается выводом на консоль шести букв 'A'. В программе каждый блок с адресаций отделяется комментарием. Ниже я остановлюсь на каждом блоке. Трансляция программы осуществляется обычным способом:

as --64 asm80.s -o asm80.o
ld -s asm80.o -o asm80

1-й способ. Прямая адресация.

Доступ к памяти происходит непосредственно с помощью адреса (метки) области памяти. В примере это msg. Т.е. mov msg, %al помещает содержимое однобайтовой ячейки памяти с адресом msg в регистр al. При чем адресацию можно указывать со смещением, например так mov msg+1, %al.

2-й способ. Косвенная адресация.

Для доступа к памяти предварительно получить адрес ячейки. Адрес получаем так: mov $msg, %rbx и далее mov (%rbx), %al - содержимое ячейки, адрес которой находится в %rbx помещается в регистр al.

3-й способ. Косвенная адресация.

При использовании регистра, для хранения адреса можно явно указывать смещение: mov 8(%rbx), %al - адрес получается путем сложения содержимого регистра rbx и числа 8.

4-й способ. Косвенная адресация.

Похоже на 3-й способ, но смещение хранится в другом регистре. Т.е. mov (%rbx,%rax), %al - результирующий адрес получается путем сложения содержимого регистров rbx и rax. Иногда можно встретить такой термин: адресация по базе со сдвигом.

5-й способ. Косвенная адресация.

Данный вариант получается путем комбинации 3-го и 4-го вариантов: mov 4(%rbx,%rax), %al - результирующий адрес ячейки получается сложением содержимого регистров rax, rbx и числа 4.

6-й способ. Косвенная адресация.

Не дает ничего нового в самой адресации. В нем показан другой способ получения адреса с использованием команды lea: lea msg(%rip), %rbx, что, в сущности, эквивалентно команде mov $msg, %rbx.

В данной статье я не коснулся такой вопроса, как масштабирование. Масштабирование весьма удобно, если вы имеете дело с числовыми массивами. Рассмотрю его в одной из следующих статей по языку ассемблера.

Ну вот и 100-й мой пост подошел к концу. Даешь 1000-й! Подписывайтесь на мой канал Old Programmer о программировании. Материалов будет очень, очень много.

Фрагмент программы asm80.s
Фрагмент программы asm80.s