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

GNU Assembler для Linux. Операции с ячейками памяти (книга)

На канале Old Programmer продолжаю публиковать книгу о программирование на языке ассемблера в операционной системе Linux. Параграф 2.2. Операции с ячейками памяти В предыдущем параграфе мы рассмотрели регистры общего назначения, которые в основном и используются в прикладном программировании. Теперь перейдем к оперативной памяти и покажем, что в случае с памятью можно пользоваться операндами разных размеров. Прежде всего отметим, что в ассемблере GAS для обозначений чисел в 16-й системе счисления используется приставка 0x, а для обозначения чисел в двоичной системе счисления приставка 0b. В ассемблере GAS используется система суффиксов, позволяющая уточнить с какого размера операндом выполняется операция. Используются следующие суффиксы: Эти суффиксы можно использовать при любом составе операндов: все регистры, ячейка памяти, смешанный вариант (регистр и ячейка памяти). Например, вместо команды mov %si, %di можно написать команду movw %si, %di которая полностью эквивалентна первой.

На канале Old Programmer продолжаю публиковать книгу о программирование на языке ассемблера в операционной системе Linux.

  • Книга "Ассемблер для Linux"
  • Список разделов канала Old Programmer, канала о программировании и программистах

Параграф 2.2.

Операции с ячейками памяти

В предыдущем параграфе мы рассмотрели регистры общего назначения, которые в основном и используются в прикладном программировании. Теперь перейдем к оперативной памяти и покажем, что в случае с памятью можно пользоваться операндами разных размеров. Прежде всего отметим, что в ассемблере GAS для обозначений чисел в 16-й системе счисления используется приставка 0x, а для обозначения чисел в двоичной системе счисления приставка 0b.

В ассемблере GAS используется система суффиксов, позволяющая уточнить с какого размера операндом выполняется операция. Используются следующие суффиксы:

  • b — байт;
  • w — слово;
  • l — двойное слово (4 байта);
  • q — 8-байтовый операнд.

Эти суффиксы можно использовать при любом составе операндов: все регистры, ячейка памяти, смешанный вариант (регистр и ячейка памяти). Например, вместо команды

mov %si, %di

можно написать команду

movw %si, %di

которая полностью эквивалентна первой. Однако, когда все операнды являются регистрами в этом нет особого смысла, поскольку из содержания команды ассемблеру понятен размер операндов. Команды же, в которых два используемых регистра имеют разный размер (например movw %ax, %rbx) не допускаются.

Несколько иная ситуация возникает, когда хотя бы один из операндов команды указывает на оперативную память. Для резервирования области памяти для чисел в GAS используются следующие директивы:

  • .byte — резервирует байт памяти;
  • .short — резервирует слово памяти (2 байта);
  • .long — резервирует двойное слово (4 байта) ;
  • .quad — резервирует 8 байтов памяти.

За директивой указывается число (или несколько чисел через запятую), которым инициализируется данная область памяти.

Рассмотрим следующий пример (листинг 6). Программа не выполняет никаких внешних действий. В секции .data зарезервировано несколько областей памяти для хранения чисел разного размера. С помощью команд с различным суффиксом мы отправляем из памяти в регистры числа различной длины. Обратим внимание, что сами директивы резервирования памяти никак не сказываются на сами команды. Работу команды определяет именно суффикс. Чтобы понять результаты выполнения команд mov следует вспомнить параграф Представление чисел в компьютере. Важно понять, что младшие байты (разряды) числа занимают соответственно и младшие адреса в памяти.

Разумеется указанные выше суффиксы можно использовать не только с командой mov. Например выполнение команды инкрементации (увеличения значения операнда на 1)

incb nm1

приведет к тому, что младший байт числа, лежащего в nm1 будет равен 0x11. В приведенных выше примерах ассемблер GAS сможет распознать правильную операцию и без использования указанных суффиксов. Однако суффиксы все таки следует использовать, чтобы исключить сомнения в ошибке: не правильно указан размер операнда в памяти или ошибка в указании регистра. Кроме того, может быть необходимость выполнения различных операций над отдельными частями числа и здесь суффикс уже обязателен:

addq $0xff,nm1

и

addb $0xff,nm1

это совсем разные операции. Во втором случае это действие над младшим байтом, в первом действие над всем 8-байтовым числом.

-->Глава 2. Параграф 2.3. <--Глава 2. Параграф 2.1

Подписываемся на мой канал Old Programmer, пишем свои комментарии и ждем новых статей об ассемблере.

Программ l6.s
Программ l6.s