Я читал некоторый код и не знал, что делает эта строка
movq (%rsp), %rsp
Спасибо
Я читал некоторый код и не знал, что делает эта строка
movq (%rsp), %rsp
Спасибо
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 ...
Возможно, это может быть не кодовый код стека, но он необычен, поскольку он будет подчинять указатель стека тем, для чего он обычно не используется.
Необычно, что в движущихся кадрах стека обычно используются указатель на стек и указатель на базовый указатель, но обычно это просто поднимается на один уровень (т.е. возвращается от функции).
Для типа кода, показанного выше, где вы хотите переместиться на несколько уровней, скорее всего, просто используйте указатель стека, пока не получите то место, где вам нужно быть, а затем отпустите базовый указатель (вызовы условностей будут часто толкать текущий базовый указатель перед его изменением, чтобы простой поп восстановил старое значение).
Это 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.