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

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

movq (%rsp), %rsp

2 ответа

Решение

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, который является четырехугольным и четырехугольным, является 64-разрядным.

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

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

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

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

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

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

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

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

Другие вопросы по тегам