функция сборки movq - PullRequest
       17

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

21 голосов
/ 04 октября 2010

Я читал какой-то код и не был уверен, что делает эта строка:

movq (%rsp), %rsp

Ответы [ 2 ]

29 голосов
/ 04 октября 2010

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  ...

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

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

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

12 голосов
/ 04 июня 2014

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

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

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

movq (% rsp),% rsp -> movq называется opcode, (% rsp) называется source или src, а% rsp называетсяdestination или dst.

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

Хотя оба регистра совпадают, разница в том, что значение% rsp изменяется.

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

Используя эту инструкцию movq (% rsp),% rsp

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

...