Вопрос

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

movq (%rsp), %rsp
Это было полезно?

Решение

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

movq (%rsp), %rsp

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

В качестве примера эта последовательность кода (на основе реального кода и в 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 называется OPCode, (% RSP) называется источником или SRC, а% RSP называется пункт назначения или DST.

Что это делает, так это то, что он смотрит в регистрацию в регистре% RSP Получает его значение и идет в память [кронштейн »()» означает, что вступает в значение памяти] этого значения, а затем назначает его% RSP.

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

Например: позволяет сказать% RSP имеет значение 22. Но память% RSP составляет 30.

Использование этой инструкции MOVQ (% RSP),% RSP

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top