#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
это только подтолкнуло бы указатель к самому себе, что редко было бы полезно для чего-либо.