Подтвердить что ты не робот

Функция сборки movq

Я читал некоторый код и не знал, что делает эта строка

movq (%rsp), %rsp

Спасибо

4b9b3361

Ответ 1

movq (предполагая, что вы говорите о x86) является перемещением квадратного слова (64-битное значение). Эта конкретная инструкция:

movq (%rsp), %rsp

выглядит очень похоже на код, который будет проходить через стек кадров. Эта конкретная инструкция захватывает квадрат, на который указывает текущий указатель стека, и загружает его в указатель стека, перезаписывая его.

В качестве примера эта последовательность кода (на основе реального кода и в Intel, а не в формате AT & T) будет непрерывно загружать указатель стека из его содержимого до тех пор, пока значение 16 байтов не будет равно 0.

576  cmpq    [rsp+0x10],0x0
582  jz      594
588  movq    rsp,[rsp]
592  jmp     576
594  ...

Возможно, это может быть не кодовый код стека, но он необычен, поскольку он будет подчинять указатель стека тем, для чего он обычно не используется.

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

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

Ответ 2

Это 64-битное значение mov. Его 64-битный из-за "q" в movq, который представляет собой quad и quad, имеет 64 бит.

Может быть другой пример, например movl, в котором l 32 бит.

но в случае movq (% rsp),% rsp с использованием синтаксиса ATT..

movq (% rsp),% rsp → movq называется кодом операции, (% rsp) называется источником или src, а% rsp называется пунктом назначения или dst.

что он делает, так это то, что он просматривает в регистре% rsp получает свое значение и переходит в память [скобка "()" означает переход в значение памяти] этого значения, а затем присваивает ее% rsp.

В то время как оба имеют одинаковый регистр, разница заключается в том, что изменяется значение% rsp.

EG: допустим, что% rsp имеет значение 22. Но память% rsp равна 30.

Используя эту команду movq (% rsp),% rsp

новое значение% rsp равно 30. Снова, потому что (% rsp) получает значение% rsp, которое принимает 22, а затем (% rsp) переходит к значению памяти 30, а затем присваивает его% rsp в пункте назначения, который сам% rsp.