Указано ли, что происходит, когда указатель стека перемещается на x64?

#assembly #x86-64 #callstack #instructions

# #сборка #x86-64 #callstack #Инструкции

Вопрос:

Я программирую в сборке на x64, и я намерен ввести адрес в стек. Однако я намерен написать push %rsp , поскольку эта инструкция изменяет значение %rsp , я не уверен, какое значение будет передано.

В частности, если я выполняю следующее:

 movq $0x10, %rsp
pushq %rsp
 

Будет ли адрес памяти 0x8 содержать 0x10 или 0x8 ? Зависит ли это от процессора или является стандартным для всех процессоров x64?

Комментарии:

1.Ссылка на инструкцию охватывает эти случаи.

2. Чем вам полезна эта последовательность кода? Если вы поделитесь, возможно, мы могли бы прокомментировать большую проблему, которую вы решаете.

3. @ErikEidt: возможно, это может быть полезно push %rsp как часть шелл-кода, если RSP в данный момент указывает на байты ASCII или что-то еще, что вы только что нажали. Или даже как часть реализации volatile int x = 10, *px = amp;x; в верхней части функции. Но не с mov $0x10, %rsp first! Так что эта часть примера полностью искусственная.

Ответ №1:

Как упоминал @Raymond Chen в комментариях, это указано в руководстве Intel, выдержка из HTML здесь: https://www.felixcloutier.com/x86/push .

Введенное значение — это значение %rsp перед push инструкцией.

То же самое для push mem режима адресации, включающего RSP, например push 16(%rsp) , копировать что-то уже в стеке.

Комментарии:

1. Возможно, полезно помнить, что это «полезная» одна из двух возможностей, поскольку вы можете push foo и push rsp нажать указатель на значение, которое вы ранее нажали. Если бы это было наоборот, push rsp это только подтолкнуло бы указатель к самому себе, что редко было бы полезно для чего-либо.